Add FreeBSD support

This commit is contained in:
Goran Mekić 2020-11-27 12:42:28 +01:00 committed by falkTX
parent 155d6ea3f9
commit 5c667d5282
11 changed files with 278 additions and 5 deletions

View File

@ -35,7 +35,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#define JackPlatformAdapter JackAlsaAdapter
#endif
#if defined(__sun__) || defined(sun)
#if defined(__sun__) || defined(sun) || defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
#include "JackOSSAdapter.h"
#define JackPlatformAdapter JackOSSAdapter
#endif

View File

@ -22,12 +22,15 @@ def create_jack_process_obj(bld, target, sources, uselib = None, framework = Non
if not bld.env['IS_WINDOWS']:
process.env['cxxshlib_PATTERN'] = '%s.so'
process.defines = ['HAVE_CONFIG_H','SERVER_SIDE']
print(bld.env)
if bld.env['IS_MACOSX']:
if framework:
process.framework = framework
env_includes = ['../macosx', '../posix', '../macosx/coreaudio']
if bld.env['IS_LINUX']:
env_includes = ['../linux', '../posix', '../linux/alsa']
if bld.env['IS_FREEBSD']:
env_includes = ['../freebsd', '../posix', '../solaris/oss']
if bld.env['IS_SUN']:
env_includes = ['../solaris', '../posix', '../solaris/oss']
if bld.env['IS_WINDOWS']:
@ -36,7 +39,7 @@ def create_jack_process_obj(bld, target, sources, uselib = None, framework = Non
process.name = target
process.target = target
process.source = sources
if bld.env['IS_LINUX'] or bld.env['IS_MACOSX']:
if bld.env['IS_LINUX'] or bld.env['IS_MACOSX'] or bld.env['IS_FREEBSD']:
process.env.append_value('CPPFLAGS', '-fvisibility=hidden')
process.install_path = '${ADDON_DIR}/'
process.use = [uselib.name]
@ -92,6 +95,20 @@ def build(bld):
uselib.append('RT')
uselib.append('DL')
if bld.env['IS_FREEBSD']:
common_libsources += [
'JackDebugClient.cpp',
'timestamps.c',
'promiscuous.c',
'../posix/JackPosixThread.cpp',
'../posix/JackPosixProcessSync.cpp',
'../posix/JackPosixMutex.cpp',
'../posix/JackPosixSemaphore.cpp',
'../posix/JackSocket.cpp',
'../freebsd/JackFreeBSDTime.c',
]
includes = ['../freebsd', '../posix'] + includes
if bld.env['IS_SUN']:
common_libsources += [
'JackDebugClient.cpp',
@ -177,6 +194,12 @@ def build(bld):
'../posix/JackPosixServerLaunch.cpp',
]
if bld.env['IS_FREEBSD']:
clientlib.source += [
'../posix/JackSocketClientChannel.cpp',
'../posix/JackPosixServerLaunch.cpp',
]
if bld.env['IS_SUN']:
clientlib.source += [
'../posix/JackSocketClientChannel.cpp',
@ -206,6 +229,9 @@ def build(bld):
if bld.env['IS_LINUX']:
clientlib.env.append_value('CPPFLAGS', '-fvisibility=hidden')
if bld.env['IS_FREEBSD']:
clientlib.env.append_value('CPPFLAGS', '-fvisibility=hidden')
if bld.env['IS_MACOSX']:
clientlib.env.append_value('CPPFLAGS', '-fvisibility=hidden')
clientlib.env.append_value('LINKFLAGS', '-single_module')
@ -282,6 +308,14 @@ def build(bld):
'../posix/JackNetUnixSocket.cpp',
]
if bld.env['IS_FREEBSD']:
serverlib.source += [
'../posix/JackSocketServerChannel.cpp',
'../posix/JackSocketNotifyChannel.cpp',
'../posix/JackSocketServerNotifyChannel.cpp',
'../posix/JackNetUnixSocket.cpp',
]
if bld.env['IS_SUN']:
serverlib.source += [
'../posix/JackSocketServerChannel.cpp',
@ -361,6 +395,10 @@ def build(bld):
netlib.source += ['../posix/JackNetUnixSocket.cpp','../posix/JackPosixThread.cpp', '../posix/JackPosixMutex.cpp', '../linux/JackLinuxTime.c']
netlib.env.append_value('CPPFLAGS', '-fvisibility=hidden')
if bld.env['IS_FREEBSD']:
netlib.source += ['../posix/JackNetUnixSocket.cpp','../posix/JackPosixThread.cpp', '../posix/JackPosixMutex.cpp', '../linux/JackLinuxTime.c']
netlib.env.append_value('CPPFLAGS', '-fvisibility=hidden')
if bld.env['IS_SUN']:
netlib.source += ['../posix/JackNetUnixSocket.cpp','../posix/JackPosixThread.cpp', '../posix/JackPosixMutex.cpp', '../solaris/JackSolarisTime.c']
netlib.env.append_value('CPPFLAGS', '-fvisibility=hidden')
@ -423,7 +461,7 @@ def build(bld):
process = create_jack_process_obj(bld, 'audioadapter', audio_adapter_sources, serverlib)
process.use += ['ALSA', 'SAMPLERATE']
if bld.env['BUILD_ADAPTER'] and bld.env['IS_SUN']:
if bld.env['BUILD_ADAPTER'] and (bld.env['IS_SUN'] or bld.env['IS_FREEBSD']):
audio_adapter_sources += ['../solaris/oss/JackOSSAdapter.cpp', 'memops.c']
process = create_jack_process_obj(bld, 'audioadapter', audio_adapter_sources, serverlib)
process.use += 'SAMPLERATE'

View File

@ -39,6 +39,8 @@ def build(bld):
obj = bld(features = ['c', 'cprogram'], idx=17)
if bld.env['IS_LINUX']:
sysdeps_dbus_include = ['../linux', '../posix']
if bld.env['IS_FREEBSD']:
sysdeps_dbus_include = ['../freebsd', '../posix']
if bld.env['IS_MACOSX']:
sysdeps_dbus_include = ['../macosx', '../posix']
@ -67,6 +69,8 @@ def build(bld):
'../linux/uptime.c',
]
obj.use += ['PTHREAD', 'DL', 'RT', 'DBUS-1', 'EXPAT', 'STDC++']
if bld.env['IS_FREEBSD']:
obj.use += ['PTHREAD', 'EXECINFO', 'LIBSYSINFO', 'DBUS-1', 'EXPAT']
if bld.env['IS_MACOSX']:
obj.source += [
'../macosx/uptime.c',

View File

@ -31,6 +31,8 @@ def build(bld):
os_incdir = ['../linux', '../posix']
if bld.env['IS_MACOSX']:
os_incdir = ['../macosx', '../posix']
if bld.env['IS_FREEBSD']:
os_incdir = ['../freebsd', '../posix']
if bld.env['IS_SUN']:
os_incdir = ['../solaris', '../posix']
if bld.env['IS_WINDOWS']:
@ -65,6 +67,8 @@ def build(bld):
prog.use += ['RT', 'M']
if bld.env['IS_SUN']:
prog.use += ['M']
if bld.env['IS_FREEBSD']:
prog.use += ['M']
if bld.env['IS_WINDOWS'] and bld.env['BUILD_STATIC']:
prog.env['LIB_PTHREAD'] = [':libwinpthread.a']
#prog.cflags = ['-Wno-deprecated-declarations', '-Wno-misleading-indentation']
@ -81,6 +85,8 @@ def build(bld):
prog.use += ['SNDFILE']
if bld.env['IS_LINUX']:
prog.use += ['RT', 'SNDFILE']
if bld.env['IS_FREEBSD']:
prog.use += ['SNDFILE']
if bld.env['IS_SUN']:
prog.use += ['RT', 'SNDFILE']
if bld.env['IS_WINDOWS']:

90
freebsd/JackFreeBSDTime.c Normal file
View File

@ -0,0 +1,90 @@
/*
Copyright (C) 2001-2003 Paul Davis
Copyright (C) 2005 Jussi Laako
Copyright (C) 2004-2008 Grame
Copyright (C) 2018 Greg V
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "JackConstants.h"
#include "JackTime.h"
#include "JackTypes.h"
#include "JackError.h"
#include <time.h>
#include <unistd.h>
jack_time_t (*_jack_get_microseconds)(void) = 0;
static jack_time_t jack_get_microseconds_from_system (void)
{
jack_time_t jackTime;
struct timespec time;
clock_gettime(CLOCK_MONOTONIC, &time);
jackTime = (jack_time_t) time.tv_sec * 1e6 +
(jack_time_t) time.tv_nsec / 1e3;
return jackTime;
}
SERVER_EXPORT void JackSleep(long usec)
{
usleep(usec);
}
SERVER_EXPORT void InitTime()
{
/* nothing to do on a generic system - we use the system clock */
}
SERVER_EXPORT void EndTime()
{}
void SetClockSource(jack_timer_type_t source)
{
jack_log("Clock source : %s", ClockSourceName(source));
switch (source)
{
case JACK_TIMER_SYSTEM_CLOCK:
default:
_jack_get_microseconds = jack_get_microseconds_from_system;
break;
}
}
const char* ClockSourceName(jack_timer_type_t source)
{
switch (source) {
case JACK_TIMER_SYSTEM_CLOCK:
return "system clock via clock_gettime";
}
return "unknown";
}
SERVER_EXPORT jack_time_t GetMicroSeconds()
{
return _jack_get_microseconds();
}
SERVER_EXPORT jack_time_t jack_get_microseconds()
{
return _jack_get_microseconds();
}

View File

@ -0,0 +1,85 @@
/*
Copyright (C) 2004-2008 Grame
Copyright (C) 2018 Greg V
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef __JackPlatformPlug_freebsd__
#define __JackPlatformPlug_freebsd__
#define jack_server_dir "/tmp"
#define jack_client_dir "/tmp"
#define JACK_DEFAULT_DRIVER "oss"
namespace Jack
{
struct JackRequest;
struct JackResult;
class JackPosixMutex;
class JackPosixThread;
class JackPosixSemaphore;
class JackSocketServerChannel;
class JackSocketClientChannel;
class JackSocketServerNotifyChannel;
class JackSocketNotifyChannel;
class JackClientSocket;
class JackNetUnixSocket;
}
/* __JackPlatformMutex__ */
#include "JackPosixMutex.h"
namespace Jack {typedef JackPosixMutex JackMutex; }
/* __JackPlatformThread__ */
#include "JackPosixThread.h"
namespace Jack { typedef JackPosixThread JackThread; }
/* __JackPlatformSynchro__ client activation */
#include "JackPosixSemaphore.h"
namespace Jack { typedef JackPosixSemaphore JackSynchro; }
/* __JackPlatformChannelTransaction__ */
#include "JackSocket.h"
namespace Jack { typedef JackClientSocket JackChannelTransaction; }
/* __JackPlatformProcessSync__ */
#include "JackPosixProcessSync.h"
namespace Jack { typedef JackPosixProcessSync JackProcessSync; }
/* __JackPlatformServerChannel__ */
#include "JackSocketServerChannel.h"
namespace Jack { typedef JackSocketServerChannel JackServerChannel; }
/* __JackPlatformClientChannel__ */
#include "JackSocketClientChannel.h"
namespace Jack { typedef JackSocketClientChannel JackClientChannel; }
/* __JackPlatformServerNotifyChannel__ */
#include "JackSocketServerNotifyChannel.h"
namespace Jack { typedef JackSocketServerNotifyChannel JackServerNotifyChannel; }
/* __JackPlatformNotifyChannel__ */
#include "JackSocketNotifyChannel.h"
namespace Jack { typedef JackSocketNotifyChannel JackNotifyChannel; }
/* __JackPlatformNetSocket__ */
#include "JackNetUnixSocket.h"
namespace Jack { typedef JackNetUnixSocket JackNetSocket; }
#endif

1
freebsd/driver.h Normal file
View File

@ -0,0 +1 @@
../linux/driver.h

34
freebsd/jackAtomic_os.h Normal file
View File

@ -0,0 +1,34 @@
/*
Copyright (C) 2004-2008 Grame
Copyright (C) 2018 Greg V
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef __JackAtomic_freebsd__
#define __JackAtomic_freebsd__
#include "JackTypes.h"
#include <sys/types.h>
#include <machine/atomic.h>
static inline char CAS(volatile UInt32 value, UInt32 newvalue, volatile void* addr)
{
return atomic_cmpset_32((uint32_t*)addr, value, newvalue);
}
#endif

View File

@ -20,6 +20,8 @@ def build(bld):
prog.includes = ['..','../macosx', '../posix', '../common/jack', '../common']
if bld.env['IS_LINUX']:
prog.includes = ['..','../linux', '../posix', '../common/jack', '../common']
if bld.env['IS_FREEBSD']:
prog.includes = ['..','../freebsd', '../posix', '../common/jack', '../common']
if bld.env['IS_SUN']:
prog.includes = ['..','../solaris', '../posix', '../common/jack', '../common']
prog.source = test_program_sources

View File

@ -29,6 +29,8 @@ def build(bld):
os_incdir = ['../linux', '../posix']
if bld.env['IS_MACOSX']:
os_incdir = ['../macosx', '../posix']
if bld.env['IS_FREEBSD']:
os_incdir = ['../freebsd', '../posix']
if bld.env['IS_SUN']:
os_incdir = ['../solaris', '../posix']
if bld.env['IS_WINDOWS']:

15
wscript
View File

@ -191,6 +191,7 @@ def detect_platform(conf):
platforms = [
# ('KEY, 'Human readable name', ['strings', 'to', 'check', 'for'])
('IS_LINUX', 'Linux', ['gnu0', 'gnukfreebsd', 'linux', 'posix']),
('IS_FREEBSD', 'FreeBSD', ['freebsd']),
('IS_MACOSX', 'MacOS X', ['darwin']),
('IS_SUN', 'SunOS', ['sunos']),
('IS_WINDOWS', 'Windows', ['cygwin', 'msys', 'win32'])
@ -230,6 +231,10 @@ def configure(conf):
conf.env.append_unique('CXXFLAGS', ['-Wall', '-Wno-invalid-offsetof'])
conf.env.append_unique('CXXFLAGS', '-std=gnu++11')
if conf.env['IS_FREEBSD']:
conf.check(lib='execinfo', uselib='EXECINFO', define_name='EXECINFO')
conf.check_cfg(package='libsysinfo', args='--cflags --libs')
if not conf.env['IS_MACOSX']:
conf.env.append_unique('LDFLAGS', '-Wl,--no-undefined')
else:
@ -524,6 +529,9 @@ def obj_add_includes(bld, obj):
if bld.env['IS_LINUX']:
obj.includes += ['linux', 'posix']
if bld.env['IS_FREEBSD']:
obj.includes += ['freebsd', 'posix']
if bld.env['IS_MACOSX']:
obj.includes += ['macosx', 'posix']
@ -551,6 +559,9 @@ def build_jackd(bld):
if bld.env['IS_LINUX']:
jackd.use += ['DL', 'M', 'PTHREAD', 'RT', 'STDC++']
if bld.env['IS_FREEBSD']:
jackd.use += ['M', 'PTHREAD']
if bld.env['IS_MACOSX']:
jackd.use += ['DL', 'PTHREAD']
jackd.framework = ['CoreFoundation']
@ -768,7 +779,7 @@ def build_drivers(bld):
use = ['serverlib'], # FIXME: Is this needed?
framework = ['AudioUnit', 'CoreMIDI', 'CoreServices', 'Foundation'])
if bld.env['IS_SUN']:
if bld.env['IS_SUN'] or bld.env['IS_FREEBSD']:
create_driver_obj(
bld,
target = 'boomer',
@ -819,7 +830,7 @@ def build(bld):
bld.recurse('example-clients')
bld.recurse('tools')
if bld.env['IS_LINUX']:
if bld.env['IS_LINUX'] or bld.env['IS_FREEBSD']:
bld.recurse('man')
bld.recurse('systemd')
if not bld.env['IS_WINDOWS']: