@@ -4,6 +4,7 @@ man/*.1 | |||||
.stamp_* | .stamp_* | ||||
.DS_Store | .DS_Store | ||||
__pycache__ | __pycache__ | ||||
*.dll | |||||
*.pyc | *.pyc | ||||
*.pkg | *.pkg | ||||
android/.server/ | android/.server/ | ||||
@@ -14,3 +15,7 @@ codeBlocks | |||||
macos/package.xml | macos/package.xml | ||||
macos/package-welcome.txt | macos/package-welcome.txt | ||||
# windows release files | |||||
windows/inno/version.iss | |||||
windows/inno/win32 | |||||
windows/inno/win64 |
@@ -132,6 +132,7 @@ def build(bld): | |||||
] | ] | ||||
includes = ['../windows' ] + includes | includes = ['../windows' ] + includes | ||||
libsuffix = "64" if (bld.env['DEST_CPU'] == "x86_64" and not bld.variant) else "" | libsuffix = "64" if (bld.env['DEST_CPU'] == "x86_64" and not bld.variant) else "" | ||||
buildbindir = os.path.join('..', bld.path.get_bld().srcpath().rstrip(bld.path.srcpath())) | |||||
staticbuild = bool('BUILD_STATIC' in bld.env and bld.env['BUILD_STATIC']) | staticbuild = bool('BUILD_STATIC' in bld.env and bld.env['BUILD_STATIC']) | ||||
uselib.append('REGEX') | uselib.append('REGEX') | ||||
uselib.append('WS2_32') | uselib.append('WS2_32') | ||||
@@ -145,17 +146,23 @@ def build(bld): | |||||
if bld.env['IS_MACOSX']: | if bld.env['IS_MACOSX']: | ||||
clientlib.framework = ['CoreAudio', 'Accelerate'] | clientlib.framework = ['CoreAudio', 'Accelerate'] | ||||
clientlib.defines = 'HAVE_CONFIG_H' | clientlib.defines = 'HAVE_CONFIG_H' | ||||
clientlib.includes = includes | |||||
clientlib.name = 'clientlib' | |||||
clientlib.target = 'jack'+libsuffix | |||||
clientlib.install_path = '${LIBDIR}' | |||||
clientlib.use = uselib | clientlib.use = uselib | ||||
if bld.env['IS_WINDOWS']: | if bld.env['IS_WINDOWS']: | ||||
clientlib.env['cxxshlib_PATTERN'] = 'lib%s.dll' | |||||
clientlib.env['cxxstlib_PATTERN'] = 'lib%s.a' | |||||
clientlib.env['implib_PATTERN'] = 'lib%s.dll.a' | |||||
clientlib.install_path = '${LIBDIR}' | |||||
clientlib.env['cxxshlib_PATTERN'] = 'lib%s.dll' | |||||
clientlib.env['cxxstlib_PATTERN'] = 'lib%s.a' | |||||
clientlib.env['implib_PATTERN'] = 'lib%s.dll.a' | |||||
if staticbuild: | |||||
clientlib.env['SHLIB_MARKER'] = '' | |||||
clientlib.env.append_value('LINKFLAGS', ['-static-libstdc++', '--disable-auto-import']) | |||||
clientlib.env.append_value('LINKFLAGS', ['-Wl,--output-def,lib%s.def' % clientlib.target]) | |||||
bld.install_files(clientlib.install_path, [os.path.join(buildbindir, 'lib%s.def' % clientlib.target)]) | |||||
if bld.env['AUTOSTART_METHOD'] == 'dbus': | if bld.env['AUTOSTART_METHOD'] == 'dbus': | ||||
clientlib.use.append('DBUS-1') | clientlib.use.append('DBUS-1') | ||||
clientlib.includes = includes | |||||
clientlib.name = 'clientlib' | |||||
clientlib.target = 'jack'+libsuffix | |||||
clientlib.source = [] + common_libsources | clientlib.source = [] + common_libsources | ||||
clientlib.source += [ | clientlib.source += [ | ||||
'JackLibClient.cpp', | 'JackLibClient.cpp', | ||||
@@ -202,15 +209,6 @@ def build(bld): | |||||
if bld.env['IS_SUN']: | if bld.env['IS_SUN']: | ||||
clientlib.env.append_value('LINKFLAGS', '-lnsl -lsocket') | clientlib.env.append_value('LINKFLAGS', '-lnsl -lsocket') | ||||
if bld.env['IS_WINDOWS']: | |||||
# remove switch to shared binaries if possible, as we most likely want static builds on Windows | |||||
if staticbuild: | |||||
clientlib.env['SHLIB_MARKER'] = '' | |||||
# statically link libjack to libstdc++, some client apps like ardour come | |||||
# with a different version of libstdc++.dll that takes precedence and results | |||||
# in missing symbols during runtime | |||||
clientlib.env.append_value('LINKFLAGS', ['-static-libstdc++', '--disable-auto-import']) | |||||
if bld.variant: | if bld.variant: | ||||
# if there is variant defined, we expect it to be the 32bit client lib one | # if there is variant defined, we expect it to be the 32bit client lib one | ||||
# we don't want to build other stuff in this variant | # we don't want to build other stuff in this variant | ||||
@@ -223,6 +221,7 @@ def build(bld): | |||||
serverlib.includes = includes | serverlib.includes = includes | ||||
serverlib.name = 'serverlib' | serverlib.name = 'serverlib' | ||||
serverlib.target = 'jackserver'+libsuffix | serverlib.target = 'jackserver'+libsuffix | ||||
serverlib.install_path = '${LIBDIR}' | |||||
serverlib.use = uselib | serverlib.use = uselib | ||||
if bld.env['IS_WINDOWS']: | if bld.env['IS_WINDOWS']: | ||||
serverlib.env['cxxshlib_PATTERN'] = 'lib%s.dll' | serverlib.env['cxxshlib_PATTERN'] = 'lib%s.dll' | ||||
@@ -231,7 +230,8 @@ def build(bld): | |||||
if staticbuild: | if staticbuild: | ||||
serverlib.env['SHLIB_MARKER'] = '' | serverlib.env['SHLIB_MARKER'] = '' | ||||
serverlib.env.append_value('LINKFLAGS', ['-static-libstdc++', '--disable-auto-import']) | serverlib.env.append_value('LINKFLAGS', ['-static-libstdc++', '--disable-auto-import']) | ||||
serverlib.install_path = '${LIBDIR}' | |||||
serverlib.env.append_value('LINKFLAGS', ['-Wl,--output-def,lib%s.def' % serverlib.target]) | |||||
bld.install_files(serverlib.install_path, [os.path.join(buildbindir, 'lib%s.def' % serverlib.target)]) | |||||
serverlib.source = [] + common_libsources | serverlib.source = [] + common_libsources | ||||
serverlib.source += [ | serverlib.source += [ | ||||
'JackAudioDriver.cpp', | 'JackAudioDriver.cpp', | ||||
@@ -325,17 +325,20 @@ def build(bld): | |||||
netlib.includes = includes | netlib.includes = includes | ||||
netlib.name = 'netlib' | netlib.name = 'netlib' | ||||
netlib.target = 'jacknet'+libsuffix | netlib.target = 'jacknet'+libsuffix | ||||
netlib.install_path = '${LIBDIR}' | |||||
netlib.use = ['SAMPLERATE', 'CELT', 'OPUS', 'PTHREAD'] | netlib.use = ['SAMPLERATE', 'CELT', 'OPUS', 'PTHREAD'] | ||||
if bld.env['IS_WINDOWS']: | if bld.env['IS_WINDOWS']: | ||||
netlib.env['cxxshlib_PATTERN'] = 'lib%s.dll' | |||||
netlib.env['cxxstlib_PATTERN'] = 'lib%s.a' | |||||
netlib.env['implib_PATTERN'] = 'lib%s.dll.a' | |||||
if staticbuild: | |||||
netlib.env['SHLIB_MARKER'] = '' | |||||
netlib.use += ['WS2_32', 'WINMM'] | |||||
netlib.use += ['WS2_32', 'WINMM'] | |||||
netlib.env['cxxshlib_PATTERN'] = 'lib%s.dll' | |||||
netlib.env['cxxstlib_PATTERN'] = 'lib%s.a' | |||||
netlib.env['implib_PATTERN'] = 'lib%s.dll.a' | |||||
if staticbuild: | |||||
netlib.env['SHLIB_MARKER'] = '' | |||||
netlib.env.append_value('LINKFLAGS', ['-static-libstdc++', '--disable-auto-import']) | |||||
netlib.env.append_value('LINKFLAGS', ['-Wl,--output-def,lib%s.def' % netlib.target]) | |||||
bld.install_files(netlib.install_path, [os.path.join(buildbindir, 'lib%s.def' % netlib.target)]) | |||||
elif not bld.env['IS_MACOSX']: | elif not bld.env['IS_MACOSX']: | ||||
netlib.use += ['RT'] | |||||
netlib.install_path = '${LIBDIR}' | |||||
netlib.use += ['RT'] | |||||
netlib.source = [ | netlib.source = [ | ||||
'JackNetAPI.cpp', | 'JackNetAPI.cpp', | ||||
'JackNetInterface.cpp', | 'JackNetInterface.cpp', | ||||
@@ -792,7 +792,7 @@ HTML_HEADER = | |||||
# each generated HTML page. If it is left blank doxygen will generate a | # each generated HTML page. If it is left blank doxygen will generate a | ||||
# standard footer. | # standard footer. | ||||
HTML_FOOTER = | |||||
HTML_FOOTER = @SRCDIR@/no_date_footer.html | |||||
# The HTML_STYLESHEET tag can be used to specify a user-defined cascading | # The HTML_STYLESHEET tag can be used to specify a user-defined cascading | ||||
# style sheet that is used by each HTML page. It can be used to | # style sheet that is used by each HTML page. It can be used to | ||||
@@ -2,35 +2,21 @@ | |||||
# encoding: utf-8 | # encoding: utf-8 | ||||
example_programs = { | example_programs = { | ||||
'jack_freewheel' : 'freewheel.c', | |||||
'jack_connect' : 'connect.c', | |||||
'jack_lsp' : 'lsp.c', | |||||
'jack_cpu_load' : 'cpu_load.c', | |||||
'jack_latent_client' : 'latent_client.c', | |||||
'jack_metro' : 'metro.c', | 'jack_metro' : 'metro.c', | ||||
'jack_midi_latency_test' : 'midi_latency_test.c', | |||||
'jack_midiseq' : 'midiseq.c', | 'jack_midiseq' : 'midiseq.c', | ||||
'jack_midisine' : 'midisine.c', | 'jack_midisine' : 'midisine.c', | ||||
'jack_net_master' : 'netmaster.c', | |||||
'jack_net_slave' : 'netslave.c', | |||||
'jack_server_control' : 'server_control.cpp', | |||||
'jack_showtime' : 'showtime.c', | 'jack_showtime' : 'showtime.c', | ||||
'jack_simdtests' : 'simdtests.cpp', | |||||
'jack_simple_client' : 'simple_client.c', | 'jack_simple_client' : 'simple_client.c', | ||||
'jack_zombie' : 'zombie.c', | |||||
'jack_load' : 'ipload.c', | |||||
'jack_unload' : 'ipunload.c', | |||||
'jack_alias' : 'alias.c', | |||||
'jack_bufsize' : 'bufsize.c', | |||||
'jack_wait' : 'wait.c', | |||||
'jack_samplerate' : 'samplerate.c', | |||||
'jack_evmon' : 'evmon.c', | |||||
'jack_monitor_client' : 'monitor_client.c', | |||||
'jack_thru' : 'thru_client.c', | |||||
'jack_cpu_load' : 'cpu_load.c', | |||||
'jack_simple_session_client' : 'simple_session_client.c', | 'jack_simple_session_client' : 'simple_session_client.c', | ||||
'jack_session_notify' : 'session_notify.c', | |||||
'jack_server_control' : 'server_control.cpp', | |||||
'jack_net_slave' : 'netslave.c', | |||||
'jack_net_master' : 'netmaster.c', | |||||
'jack_latent_client' : 'latent_client.c', | |||||
'jack_midi_dump' : 'midi_dump.c', | |||||
'jack_midi_latency_test' : 'midi_latency_test.c', | |||||
'jack_simdtests' : 'simdtests.cpp', | |||||
'jack_property' : 'property.c', | |||||
'jack_thru' : 'thru_client.c', | |||||
'jack_zombie' : 'zombie.c', | |||||
} | } | ||||
example_libs = { | example_libs = { | ||||
@@ -38,12 +24,8 @@ example_libs = { | |||||
} | } | ||||
def configure(conf): | def configure(conf): | ||||
conf.env['BUILD_EXAMPLE_CLIENT_TRANSPORT'] = conf.env['READLINE'] | |||||
conf.env['BUILD_EXAMPLE_CLIENT_REC'] = conf.env['SNDFILE'] | conf.env['BUILD_EXAMPLE_CLIENT_REC'] = conf.env['SNDFILE'] | ||||
conf.env['BUILD_EXAMPLE_ALSA_IO'] = conf.env['SAMPLERATE'] and conf.env['BUILD_DRIVER_ALSA'] | |||||
def build(bld): | def build(bld): | ||||
if bld.env['IS_LINUX']: | if bld.env['IS_LINUX']: | ||||
os_incdir = ['../linux', '../posix'] | os_incdir = ['../linux', '../posix'] | ||||
@@ -78,24 +60,13 @@ def build(bld): | |||||
prog.use += ['RT', 'M'] | prog.use += ['RT', 'M'] | ||||
if bld.env['IS_SUN']: | if bld.env['IS_SUN']: | ||||
prog.use += ['M'] | 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'] | #prog.cflags = ['-Wno-deprecated-declarations', '-Wno-misleading-indentation'] | ||||
#prog.cxxflags = ['-Wno-deprecated-declarations', '-Wno-misleading-indentation'] | #prog.cxxflags = ['-Wno-deprecated-declarations', '-Wno-misleading-indentation'] | ||||
prog.target = example_program | prog.target = example_program | ||||
if bld.env['BUILD_EXAMPLE_CLIENT_TRANSPORT']: | |||||
prog = bld(features = 'c cprogram') | |||||
prog.includes = os_incdir + ['../common/jack', '../common'] | |||||
prog.source = 'transport.c' | |||||
prog.use = ['clientlib'] | |||||
if bld.env['IS_LINUX']: | |||||
prog.use += ['RT', 'READLINE'] | |||||
if bld.env['IS_MACOSX']: | |||||
prog.use += ['READLINE'] | |||||
if bld.env['IS_WINDOWS']: | |||||
prog.use += ['READLINE'] | |||||
prog.target = 'jack_transport' | |||||
if bld.env['BUILD_EXAMPLE_CLIENT_REC']: | if bld.env['BUILD_EXAMPLE_CLIENT_REC']: | ||||
prog = bld(features = 'c cprogram') | prog = bld(features = 'c cprogram') | ||||
prog.includes = os_incdir + ['../common/jack', '../common'] | prog.includes = os_incdir + ['../common/jack', '../common'] | ||||
@@ -109,32 +80,10 @@ def build(bld): | |||||
prog.use += ['RT', 'SNDFILE'] | prog.use += ['RT', 'SNDFILE'] | ||||
if bld.env['IS_WINDOWS']: | if bld.env['IS_WINDOWS']: | ||||
prog.uselib = ['SNDFILE'] | prog.uselib = ['SNDFILE'] | ||||
if bld.env['BUILD_STATIC']: | |||||
prog.env['LIB_PTHREAD'] = [':libwinpthread.a'] | |||||
prog.target = 'jack_rec' | prog.target = 'jack_rec' | ||||
if bld.env['IS_LINUX'] or bld.env['IS_MACOSX']: | |||||
prog = bld(features = 'c cprogram') | |||||
prog.includes = os_incdir + ['.', '..', '../common/jack', '../common'] | |||||
prog.source = ['netsource.c', '../common/netjack_packet.c'] | |||||
prog.env.append_value('CFLAGS', '-DNO_JACK_ERROR') | |||||
prog.use = ['CELT', 'SAMPLERATE', 'OPUS', 'M', 'clientlib'] | |||||
prog.target = 'jack_netsource' | |||||
prog.defines = ['HAVE_CONFIG_H'] | |||||
if bld.env['IS_LINUX'] and bld.env['BUILD_EXAMPLE_ALSA_IO']: | |||||
prog = bld(features = 'c cprogram') | |||||
prog.includes = os_incdir + ['../common/jack', '../common'] | |||||
prog.source = ['alsa_in.c', '../common/memops.c'] | |||||
prog.env.append_value('CFLAGS', '-DNO_JACK_ERROR') | |||||
prog.use = ['clientlib', 'ALSA', 'SAMPLERATE', 'M'] | |||||
prog.target = 'alsa_in' | |||||
prog = bld(features = 'c cprogram') | |||||
prog.includes = os_incdir + ['../common/jack', '../common'] | |||||
prog.source = ['alsa_out.c', '../common/memops.c'] | |||||
prog.env.append_value('CFLAGS', '-DNO_JACK_ERROR') | |||||
prog.use = ['clientlib', 'ALSA', 'SAMPLERATE', 'M'] | |||||
prog.target = 'alsa_out' | |||||
for example_lib, example_lib_source in list(example_libs.items()): | for example_lib, example_lib_source in list(example_libs.items()): | ||||
lib = bld(features = 'c cshlib') | lib = bld(features = 'c cshlib') | ||||
if not bld.env['IS_WINDOWS']: | if not bld.env['IS_WINDOWS']: | ||||
@@ -144,9 +93,7 @@ def build(bld): | |||||
lib.source = example_lib_source | lib.source = example_lib_source | ||||
if bld.env['IS_SUN']: | if bld.env['IS_SUN']: | ||||
lib.env.append_value('LINKFLAGS', '-lm') | lib.env.append_value('LINKFLAGS', '-lm') | ||||
if bld.env['IS_WINDOWS'] and bld.env['BUILD_STATIC']: | |||||
prog.env['LIB_PTHREAD'] = [':libwinpthread.a'] | |||||
lib.use = 'serverlib' | lib.use = 'serverlib' | ||||
lib.install_path = '${ADDON_DIR}/' | lib.install_path = '${ADDON_DIR}/' | ||||
if not bld.env['IS_WINDOWS']: | |||||
bld.symlink_as('${PREFIX}/bin/jack_disconnect', 'jack_connect') | |||||
bld.install_files('${PREFIX}/bin', 'jack_control', chmod=0o755) |
@@ -352,21 +352,22 @@ int JackAlsaDriver::Open(jack_nframes_t nframes, | |||||
capture_latency, | capture_latency, | ||||
playback_latency, | playback_latency, | ||||
midi); | midi); | ||||
if (fDriver) { | |||||
// ALSA driver may have changed the in/out values | |||||
fCaptureChannels = ((alsa_driver_t *)fDriver)->capture_nchannels; | |||||
fPlaybackChannels = ((alsa_driver_t *)fDriver)->playback_nchannels; | |||||
if (JackServerGlobals::on_device_reservation_loop != NULL) { | |||||
device_reservation_loop_running = true; | |||||
if (JackPosixThread::StartImp(&fReservationLoopThread, 0, 0, on_device_reservation_loop, NULL) != 0) { | |||||
device_reservation_loop_running = false; | |||||
} | |||||
} | |||||
return 0; | |||||
} else { | |||||
if (!fDriver) { | |||||
Close(); | Close(); | ||||
return -1; | return -1; | ||||
} | } | ||||
// ALSA driver may have changed the in/out values | |||||
fCaptureChannels = ((alsa_driver_t *)fDriver)->capture_nchannels; | |||||
fPlaybackChannels = ((alsa_driver_t *)fDriver)->playback_nchannels; | |||||
if (JackServerGlobals::on_device_reservation_loop != NULL) { | |||||
device_reservation_loop_running = true; | |||||
if (JackPosixThread::StartImp(&fReservationLoopThread, 0, 0, on_device_reservation_loop, NULL) != 0) { | |||||
device_reservation_loop_running = false; | |||||
} | |||||
} | |||||
return 0; | |||||
} | } | ||||
int JackAlsaDriver::Close() | int JackAlsaDriver::Close() | ||||
@@ -837,10 +837,8 @@ alsa_driver_set_parameters (alsa_driver_t *driver, | |||||
if (driver->playback_nchannels > driver->capture_nchannels) { | if (driver->playback_nchannels > driver->capture_nchannels) { | ||||
driver->max_nchannels = driver->playback_nchannels; | driver->max_nchannels = driver->playback_nchannels; | ||||
driver->user_nchannels = driver->capture_nchannels; | |||||
} else { | } else { | ||||
driver->max_nchannels = driver->capture_nchannels; | driver->max_nchannels = driver->capture_nchannels; | ||||
driver->user_nchannels = driver->playback_nchannels; | |||||
} | } | ||||
alsa_driver_setup_io_function_pointers (driver); | alsa_driver_setup_io_function_pointers (driver); | ||||
@@ -2040,7 +2038,6 @@ alsa_driver_new (char *name, char *playback_alsa_device, | |||||
driver->hw = 0; | driver->hw = 0; | ||||
driver->capture_and_playback_not_synced = FALSE; | driver->capture_and_playback_not_synced = FALSE; | ||||
driver->max_nchannels = 0; | driver->max_nchannels = 0; | ||||
driver->user_nchannels = 0; | |||||
driver->playback_nchannels = user_playback_nchnls; | driver->playback_nchannels = user_playback_nchnls; | ||||
driver->capture_nchannels = user_capture_nchnls; | driver->capture_nchannels = user_capture_nchnls; | ||||
driver->playback_sample_bytes = (shorts_first ? 2:4); | driver->playback_sample_bytes = (shorts_first ? 2:4); | ||||
@@ -72,7 +72,6 @@ typedef struct _alsa_driver { | |||||
unsigned long *capture_interleave_skip; | unsigned long *capture_interleave_skip; | ||||
unsigned long *playback_interleave_skip; | unsigned long *playback_interleave_skip; | ||||
channel_t max_nchannels; | channel_t max_nchannels; | ||||
channel_t user_nchannels; | |||||
channel_t playback_nchannels; | channel_t playback_nchannels; | ||||
channel_t capture_nchannels; | channel_t capture_nchannels; | ||||
unsigned long playback_sample_bytes; | unsigned long playback_sample_bytes; | ||||
@@ -633,7 +633,7 @@ JackCoreMidiDriver::Start() | |||||
jack_info("JackCoreMidiDriver::Start - Enabling physical input ports."); | jack_info("JackCoreMidiDriver::Start - Enabling physical input ports."); | ||||
for (; pi_count < num_physical_inputs; pi_count++) { | for (; pi_count < num_physical_inputs; pi_count++) { | ||||
if (physical_input_ports[pi_count]->Start() < 0) { | |||||
if (!physical_input_ports[pi_count]->Start()) { | |||||
jack_error("JackCoreMidiDriver::Start - Failed to enable physical " | jack_error("JackCoreMidiDriver::Start - Failed to enable physical " | ||||
"input port."); | "input port."); | ||||
goto stop_physical_input_ports; | goto stop_physical_input_ports; | ||||
@@ -643,7 +643,7 @@ JackCoreMidiDriver::Start() | |||||
jack_info("JackCoreMidiDriver::Start - Enabling physical output ports."); | jack_info("JackCoreMidiDriver::Start - Enabling physical output ports."); | ||||
for (; po_count < num_physical_outputs; po_count++) { | for (; po_count < num_physical_outputs; po_count++) { | ||||
if (physical_output_ports[po_count]->Start() < 0) { | |||||
if (!physical_output_ports[po_count]->Start()) { | |||||
jack_error("JackCoreMidiDriver::Start - Failed to enable physical " | jack_error("JackCoreMidiDriver::Start - Failed to enable physical " | ||||
"output port."); | "output port."); | ||||
goto stop_physical_output_ports; | goto stop_physical_output_ports; | ||||
@@ -653,7 +653,7 @@ JackCoreMidiDriver::Start() | |||||
jack_info("JackCoreMidiDriver::Start - Enabling virtual input ports."); | jack_info("JackCoreMidiDriver::Start - Enabling virtual input ports."); | ||||
for (; vi_count < num_virtual_inputs; vi_count++) { | for (; vi_count < num_virtual_inputs; vi_count++) { | ||||
if (virtual_input_ports[vi_count]->Start() < 0) { | |||||
if (!virtual_input_ports[vi_count]->Start()) { | |||||
jack_error("JackCoreMidiDriver::Start - Failed to enable virtual " | jack_error("JackCoreMidiDriver::Start - Failed to enable virtual " | ||||
"input port."); | "input port."); | ||||
goto stop_virtual_input_ports; | goto stop_virtual_input_ports; | ||||
@@ -663,7 +663,7 @@ JackCoreMidiDriver::Start() | |||||
jack_info("JackCoreMidiDriver::Start - Enabling virtual output ports."); | jack_info("JackCoreMidiDriver::Start - Enabling virtual output ports."); | ||||
for (; vo_count < num_virtual_outputs; vo_count++) { | for (; vo_count < num_virtual_outputs; vo_count++) { | ||||
if (virtual_output_ports[vo_count]->Start() < 0) { | |||||
if (!virtual_output_ports[vo_count]->Start()) { | |||||
jack_error("JackCoreMidiDriver::Start - Failed to enable virtual " | jack_error("JackCoreMidiDriver::Start - Failed to enable virtual " | ||||
"output port."); | "output port."); | ||||
goto stop_virtual_output_ports; | goto stop_virtual_output_ports; | ||||
@@ -676,28 +676,28 @@ JackCoreMidiDriver::Start() | |||||
stop_virtual_output_ports: | stop_virtual_output_ports: | ||||
for (int i = 0; i < vo_count; i++) { | for (int i = 0; i < vo_count; i++) { | ||||
if (virtual_output_ports[i]->Stop() < 0) { | |||||
if (!virtual_output_ports[i]->Stop()) { | |||||
jack_error("JackCoreMidiDriver::Start - Failed to disable virtual " | jack_error("JackCoreMidiDriver::Start - Failed to disable virtual " | ||||
"output port."); | "output port."); | ||||
} | } | ||||
} | } | ||||
stop_virtual_input_ports: | stop_virtual_input_ports: | ||||
for (int i = 0; i < vi_count; i++) { | for (int i = 0; i < vi_count; i++) { | ||||
if (virtual_input_ports[i]->Stop() < 0) { | |||||
if (!virtual_input_ports[i]->Stop()) { | |||||
jack_error("JackCoreMidiDriver::Start - Failed to disable virtual " | jack_error("JackCoreMidiDriver::Start - Failed to disable virtual " | ||||
"input port."); | "input port."); | ||||
} | } | ||||
} | } | ||||
stop_physical_output_ports: | stop_physical_output_ports: | ||||
for (int i = 0; i < po_count; i++) { | for (int i = 0; i < po_count; i++) { | ||||
if (physical_output_ports[i]->Stop() < 0) { | |||||
if (!physical_output_ports[i]->Stop()) { | |||||
jack_error("JackCoreMidiDriver::Start - Failed to disable " | jack_error("JackCoreMidiDriver::Start - Failed to disable " | ||||
"physical output port."); | "physical output port."); | ||||
} | } | ||||
} | } | ||||
stop_physical_input_ports: | stop_physical_input_ports: | ||||
for (int i = 0; i < pi_count; i++) { | for (int i = 0; i < pi_count; i++) { | ||||
if (physical_input_ports[i]->Stop() < 0) { | |||||
if (!physical_input_ports[i]->Stop()) { | |||||
jack_error("JackCoreMidiDriver::Start - Failed to disable " | jack_error("JackCoreMidiDriver::Start - Failed to disable " | ||||
"physical input port."); | "physical input port."); | ||||
} | } | ||||
@@ -716,7 +716,7 @@ JackCoreMidiDriver::Stop() | |||||
jack_info("JackCoreMidiDriver::Stop - disabling physical input ports."); | jack_info("JackCoreMidiDriver::Stop - disabling physical input ports."); | ||||
for (int i = 0; i < num_physical_inputs; i++) { | for (int i = 0; i < num_physical_inputs; i++) { | ||||
if (physical_input_ports[i]->Stop() < 0) { | |||||
if (!physical_input_ports[i]->Stop()) { | |||||
jack_error("JackCoreMidiDriver::Stop - Failed to disable physical " | jack_error("JackCoreMidiDriver::Stop - Failed to disable physical " | ||||
"input port."); | "input port."); | ||||
result = -1; | result = -1; | ||||
@@ -726,7 +726,7 @@ JackCoreMidiDriver::Stop() | |||||
jack_info("JackCoreMidiDriver::Stop - disabling physical output ports."); | jack_info("JackCoreMidiDriver::Stop - disabling physical output ports."); | ||||
for (int i = 0; i < num_physical_outputs; i++) { | for (int i = 0; i < num_physical_outputs; i++) { | ||||
if (physical_output_ports[i]->Stop() < 0) { | |||||
if (!physical_output_ports[i]->Stop()) { | |||||
jack_error("JackCoreMidiDriver::Stop - Failed to disable physical " | jack_error("JackCoreMidiDriver::Stop - Failed to disable physical " | ||||
"output port."); | "output port."); | ||||
result = -1; | result = -1; | ||||
@@ -736,7 +736,7 @@ JackCoreMidiDriver::Stop() | |||||
jack_info("JackCoreMidiDriver::Stop - disabling virtual input ports."); | jack_info("JackCoreMidiDriver::Stop - disabling virtual input ports."); | ||||
for (int i = 0; i < num_virtual_inputs; i++) { | for (int i = 0; i < num_virtual_inputs; i++) { | ||||
if (virtual_input_ports[i]->Stop() < 0) { | |||||
if (!virtual_input_ports[i]->Stop()) { | |||||
jack_error("JackCoreMidiDriver::Stop - Failed to disable virtual " | jack_error("JackCoreMidiDriver::Stop - Failed to disable virtual " | ||||
"input port."); | "input port."); | ||||
result = -1; | result = -1; | ||||
@@ -746,7 +746,7 @@ JackCoreMidiDriver::Stop() | |||||
jack_info("JackCoreMidiDriver::Stop - disabling virtual output ports."); | jack_info("JackCoreMidiDriver::Stop - disabling virtual output ports."); | ||||
for (int i = 0; i < num_virtual_outputs; i++) { | for (int i = 0; i < num_virtual_outputs; i++) { | ||||
if (virtual_output_ports[i]->Stop() < 0) { | |||||
if (!virtual_output_ports[i]->Stop()) { | |||||
jack_error("JackCoreMidiDriver::Stop - Failed to disable virtual " | jack_error("JackCoreMidiDriver::Stop - Failed to disable virtual " | ||||
"output port."); | "output port."); | ||||
result = -1; | result = -1; | ||||
@@ -825,7 +825,7 @@ extern "C" { | |||||
desc = jack_driver_descriptor_construct("coremidi", JackDriverSlave, "Apple CoreMIDI API based MIDI backend", &filler); | desc = jack_driver_descriptor_construct("coremidi", JackDriverSlave, "Apple CoreMIDI API based MIDI backend", &filler); | ||||
value.ui = 0; | |||||
value.ui = 0; | |||||
jack_driver_descriptor_add_parameter(desc, &filler, "inchannels", 'i', JackDriverParamUInt, &value, NULL, "CoreMIDI virtual bus", NULL); | jack_driver_descriptor_add_parameter(desc, &filler, "inchannels", 'i', JackDriverParamUInt, &value, NULL, "CoreMIDI virtual bus", NULL); | ||||
jack_driver_descriptor_add_parameter(desc, &filler, "outchannels", 'o', JackDriverParamUInt, &value, NULL, "CoreMIDI virtual bus", NULL); | jack_driver_descriptor_add_parameter(desc, &filler, "outchannels", 'o', JackDriverParamUInt, &value, NULL, "CoreMIDI virtual bus", NULL); | ||||
@@ -0,0 +1,94 @@ | |||||
#! /usr/bin/python3 | |||||
# encoding: utf-8 | |||||
example_tools = { | |||||
'jack_alias' : 'alias.c', | |||||
'jack_bufsize' : 'bufsize.c', | |||||
'jack_connect' : 'connect.c', | |||||
'jack_evmon' : 'evmon.c', | |||||
'jack_freewheel' : 'freewheel.c', | |||||
'jack_load' : 'ipload.c', | |||||
'jack_lsp' : 'lsp.c', | |||||
'jack_midi_dump' : 'midi_dump.c', | |||||
'jack_monitor_client' : 'monitor_client.c', | |||||
'jack_property' : 'property.c', | |||||
'jack_samplerate' : 'samplerate.c', | |||||
'jack_session_notify' : 'session_notify.c', | |||||
'jack_unload' : 'ipunload.c', | |||||
'jack_wait' : 'wait.c', | |||||
} | |||||
def configure(conf): | |||||
conf.env['BUILD_EXAMPLE_ALSA_IO'] = conf.env['SAMPLERATE'] and conf.env['BUILD_DRIVER_ALSA'] | |||||
conf.env['BUILD_EXAMPLE_CLIENT_TRANSPORT'] = conf.env['READLINE'] | |||||
def build(bld): | |||||
if bld.env['IS_LINUX']: | |||||
os_incdir = ['../linux', '../posix'] | |||||
if bld.env['IS_MACOSX']: | |||||
os_incdir = ['../macosx', '../posix'] | |||||
if bld.env['IS_SUN']: | |||||
os_incdir = ['../solaris', '../posix'] | |||||
if bld.env['IS_WINDOWS']: | |||||
os_incdir = ['../windows'] | |||||
for example_tool, example_tool_source in list(example_tools.items()): | |||||
if bld.env['IS_MACOSX']: | |||||
prog = bld(features='c cprogram', framework = ['Foundation']) | |||||
else: | |||||
prog = bld(features='c cprogram') | |||||
prog.includes = os_incdir + ['../common/jack', '../common'] | |||||
prog.source = example_tool_source | |||||
prog.use = ['clientlib'] | |||||
if bld.env['IS_LINUX']: | |||||
prog.use += ['RT', 'M'] | |||||
if bld.env['IS_SUN']: | |||||
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'] | |||||
#prog.cxxflags = ['-Wno-deprecated-declarations', '-Wno-misleading-indentation'] | |||||
prog.target = example_tool | |||||
if bld.env['BUILD_EXAMPLE_CLIENT_TRANSPORT']: | |||||
prog = bld(features = 'c cprogram') | |||||
prog.includes = os_incdir + ['../common/jack', '../common'] | |||||
prog.source = 'transport.c' | |||||
prog.use = ['clientlib'] | |||||
if bld.env['IS_LINUX']: | |||||
prog.use += ['RT', 'READLINE'] | |||||
if bld.env['IS_MACOSX']: | |||||
prog.use += ['READLINE'] | |||||
if bld.env['IS_WINDOWS']: | |||||
prog.use += ['READLINE'] | |||||
if bld.env['BUILD_STATIC']: | |||||
prog.env['LIB_PTHREAD'] = [':libwinpthread.a'] | |||||
prog.target = 'jack_transport' | |||||
if bld.env['IS_LINUX'] or bld.env['IS_MACOSX']: | |||||
prog = bld(features = 'c cprogram') | |||||
prog.includes = os_incdir + ['.', '..', '../common/jack', '../common'] | |||||
prog.source = ['netsource.c', '../common/netjack_packet.c'] | |||||
prog.env.append_value('CFLAGS', '-DNO_JACK_ERROR') | |||||
prog.use = ['CELT', 'SAMPLERATE', 'OPUS', 'M', 'clientlib'] | |||||
prog.target = 'jack_netsource' | |||||
prog.defines = ['HAVE_CONFIG_H'] | |||||
if bld.env['IS_LINUX'] and bld.env['BUILD_EXAMPLE_ALSA_IO']: | |||||
prog = bld(features = 'c cprogram') | |||||
prog.includes = os_incdir + ['../common/jack', '../common'] | |||||
prog.source = ['alsa_in.c', '../common/memops.c'] | |||||
prog.env.append_value('CFLAGS', '-DNO_JACK_ERROR') | |||||
prog.use = ['clientlib', 'ALSA', 'SAMPLERATE', 'M'] | |||||
prog.target = 'alsa_in' | |||||
prog = bld(features = 'c cprogram') | |||||
prog.includes = os_incdir + ['../common/jack', '../common'] | |||||
prog.source = ['alsa_out.c', '../common/memops.c'] | |||||
prog.env.append_value('CFLAGS', '-DNO_JACK_ERROR') | |||||
prog.use = ['clientlib', 'ALSA', 'SAMPLERATE', 'M'] | |||||
prog.target = 'alsa_out' | |||||
if not bld.env['IS_WINDOWS']: | |||||
bld.symlink_as('${PREFIX}/bin/jack_disconnect', 'jack_connect') | |||||
bld.install_files('${PREFIX}/bin', 'jack_control', chmod=0o755) |
@@ -24,7 +24,7 @@ | |||||
#define jack_server_dir "server" | #define jack_server_dir "server" | ||||
#define jack_client_dir "client" | #define jack_client_dir "client" | ||||
#define JACK_DEFAULT_DRIVER "portaudio" | #define JACK_DEFAULT_DRIVER "portaudio" | ||||
#define JACK_LOCATION "C:/Program Files/Jack" | |||||
#define JACK_LOCATION "C:\\Program Files\\JACK2" | |||||
#ifndef ADDON_DIR | #ifndef ADDON_DIR | ||||
#define ADDON_DIR "jack" | #define ADDON_DIR "jack" | ||||
@@ -39,8 +39,10 @@ Source: "win32\bin\qjackctl.exe"; DestDir: "{app}\qjackctl"; Components: qjackct | |||||
Source: "Qt5*.dll"; DestDir: "{app}\qjackctl"; Components: qjackctl; | Source: "Qt5*.dll"; DestDir: "{app}\qjackctl"; Components: qjackctl; | ||||
Source: "qwindows.dll"; DestDir: "{app}\qjackctl\platforms"; Components: qjackctl; | Source: "qwindows.dll"; DestDir: "{app}\qjackctl\platforms"; Components: qjackctl; | ||||
; dev | ; dev | ||||
Source: "win32\include\jack\*.h"; DestDir: "{app}\include"; Components: dev; | |||||
Source: "win32\include\jack\*.h"; DestDir: "{app}\include\jack"; Components: dev; | |||||
Source: "win32\lib\*.a"; DestDir: "{app}\lib"; Components: dev; | Source: "win32\lib\*.a"; DestDir: "{app}\lib"; Components: dev; | ||||
Source: "win32\lib\*.def"; DestDir: "{app}\lib"; Components: dev; | |||||
Source: "win32\lib\*.lib"; DestDir: "{app}\lib"; Components: dev; | |||||
Source: "win32\lib\jack\*.a"; DestDir: "{app}\lib\jack"; Components: dev; | Source: "win32\lib\jack\*.a"; DestDir: "{app}\lib\jack"; Components: dev; | ||||
[Icons] | [Icons] | ||||
@@ -35,13 +35,19 @@ Source: "win64\lib\jack\*.dll"; DestDir: "{app}\jack"; | |||||
Source: "win64\bin\jack_*.exe"; DestDir: "{app}\tools"; | Source: "win64\bin\jack_*.exe"; DestDir: "{app}\tools"; | ||||
; jack client lib (NOTE goes into windir) | ; jack client lib (NOTE goes into windir) | ||||
Source: "win64\lib\libjack64.dll"; DestDir: "{win}"; | Source: "win64\lib\libjack64.dll"; DestDir: "{win}"; | ||||
Source: "win64\lib32\libjack.dll"; DestDir: "{win}"; | |||||
; qjackctl | ; qjackctl | ||||
Source: "win64\bin\qjackctl.exe"; DestDir: "{app}\qjackctl"; Components: qjackctl; | Source: "win64\bin\qjackctl.exe"; DestDir: "{app}\qjackctl"; Components: qjackctl; | ||||
Source: "Qt5*.dll"; DestDir: "{app}\qjackctl"; Components: qjackctl; | Source: "Qt5*.dll"; DestDir: "{app}\qjackctl"; Components: qjackctl; | ||||
Source: "qwindows.dll"; DestDir: "{app}\qjackctl\platforms"; Components: qjackctl; | Source: "qwindows.dll"; DestDir: "{app}\qjackctl\platforms"; Components: qjackctl; | ||||
; dev | ; dev | ||||
Source: "win64\include\jack\*.h"; DestDir: "{app}\include"; Components: dev; | |||||
Source: "win64\include\jack\*.h"; DestDir: "{app}\include\jack"; Components: dev; | |||||
Source: "win64\lib\*.a"; DestDir: "{app}\lib"; Components: dev; | Source: "win64\lib\*.a"; DestDir: "{app}\lib"; Components: dev; | ||||
Source: "win64\lib\*.def"; DestDir: "{app}\lib"; Components: dev; | |||||
Source: "win64\lib\*.lib"; DestDir: "{app}\lib"; Components: dev; | |||||
Source: "win64\lib32\*.a"; DestDir: "{app}\lib32"; Components: dev; | |||||
Source: "win64\lib32\*.def"; DestDir: "{app}\lib32"; Components: dev; | |||||
Source: "win64\lib32\*.lib"; DestDir: "{app}\lib32"; Components: dev; | |||||
Source: "win64\lib\jack\*.a"; DestDir: "{app}\lib\jack"; Components: dev; | Source: "win64\lib\jack\*.a"; DestDir: "{app}\lib\jack"; Components: dev; | ||||
[Icons] | [Icons] | ||||
@@ -204,8 +204,8 @@ JackWinMMEDriver::Open(bool capturing, bool playing, int in_channels, | |||||
new JackWinMMEOutputPort(fAliasName, client_name, | new JackWinMMEOutputPort(fAliasName, client_name, | ||||
playback_driver_name, i); | playback_driver_name, i); | ||||
} catch (std::exception& e) { | } catch (std::exception& e) { | ||||
jack_error("JackWinMMEDriver::Open - while creating output " | |||||
"port: %s", e.what()); | |||||
jack_error("JackWinMMEDriver::Open - while creating output port: %s | %s, %s, %s", | |||||
e.what(), fAliasName, client_name, playback_driver_name); | |||||
continue; | continue; | ||||
} | } | ||||
output_count++; | output_count++; | ||||
@@ -215,10 +215,7 @@ JackWinMMEDriver::Open(bool capturing, bool playing, int in_channels, | |||||
jack_log("JackWinMMEDriver::Open - input_count %d", input_count); | jack_log("JackWinMMEDriver::Open - input_count %d", input_count); | ||||
jack_log("JackWinMMEDriver::Open - output_count %d", output_count); | jack_log("JackWinMMEDriver::Open - output_count %d", output_count); | ||||
if (! (input_count || output_count)) { | |||||
jack_error("JackWinMMEDriver::Open - no WinMME inputs or outputs " | |||||
"allocated."); | |||||
} else if (! JackMidiDriver::Open(capturing, playing, input_count, | |||||
if (! JackMidiDriver::Open(capturing, playing, input_count, | |||||
output_count, monitor, | output_count, monitor, | ||||
capture_driver_name, | capture_driver_name, | ||||
playback_driver_name, capture_latency, | playback_driver_name, capture_latency, | ||||
@@ -286,7 +283,7 @@ JackWinMMEDriver::Start() | |||||
jack_log("JackWinMMEDriver::Start - Enabling input ports."); | jack_log("JackWinMMEDriver::Start - Enabling input ports."); | ||||
for (; input_count < fCaptureChannels; input_count++) { | for (; input_count < fCaptureChannels; input_count++) { | ||||
if (input_ports[input_count]->Start() < 0) { | |||||
if (! input_ports[input_count]->Start()) { | |||||
jack_error("JackWinMMEDriver::Start - Failed to enable input " | jack_error("JackWinMMEDriver::Start - Failed to enable input " | ||||
"port."); | "port."); | ||||
goto stop_input_ports; | goto stop_input_ports; | ||||
@@ -296,7 +293,7 @@ JackWinMMEDriver::Start() | |||||
jack_log("JackWinMMEDriver::Start - Enabling output ports."); | jack_log("JackWinMMEDriver::Start - Enabling output ports."); | ||||
for (; output_count < fPlaybackChannels; output_count++) { | for (; output_count < fPlaybackChannels; output_count++) { | ||||
if (output_ports[output_count]->Start() < 0) { | |||||
if (! output_ports[output_count]->Start()) { | |||||
jack_error("JackWinMMEDriver::Start - Failed to enable output " | jack_error("JackWinMMEDriver::Start - Failed to enable output " | ||||
"port."); | "port."); | ||||
goto stop_output_ports; | goto stop_output_ports; | ||||
@@ -308,14 +305,14 @@ JackWinMMEDriver::Start() | |||||
stop_output_ports: | stop_output_ports: | ||||
for (int i = 0; i < output_count; i++) { | for (int i = 0; i < output_count; i++) { | ||||
if (output_ports[i]->Stop() < 0) { | |||||
if (! output_ports[i]->Stop()) { | |||||
jack_error("JackWinMMEDriver::Start - Failed to disable output " | jack_error("JackWinMMEDriver::Start - Failed to disable output " | ||||
"port."); | "port."); | ||||
} | } | ||||
} | } | ||||
stop_input_ports: | stop_input_ports: | ||||
for (int i = 0; i < input_count; i++) { | for (int i = 0; i < input_count; i++) { | ||||
if (input_ports[i]->Stop() < 0) { | |||||
if (! input_ports[i]->Stop()) { | |||||
jack_error("JackWinMMEDriver::Start - Failed to disable input " | jack_error("JackWinMMEDriver::Start - Failed to disable input " | ||||
"port."); | "port."); | ||||
} | } | ||||
@@ -334,7 +331,7 @@ JackWinMMEDriver::Stop() | |||||
jack_log("JackWinMMEDriver::Stop - disabling input ports."); | jack_log("JackWinMMEDriver::Stop - disabling input ports."); | ||||
for (int i = 0; i < fCaptureChannels; i++) { | for (int i = 0; i < fCaptureChannels; i++) { | ||||
if (input_ports[i]->Stop() < 0) { | |||||
if (! input_ports[i]->Stop()) { | |||||
jack_error("JackWinMMEDriver::Stop - Failed to disable input " | jack_error("JackWinMMEDriver::Stop - Failed to disable input " | ||||
"port."); | "port."); | ||||
result = -1; | result = -1; | ||||
@@ -344,7 +341,7 @@ JackWinMMEDriver::Stop() | |||||
jack_log("JackWinMMEDriver::Stop - disabling output ports."); | jack_log("JackWinMMEDriver::Stop - disabling output ports."); | ||||
for (int i = 0; i < fPlaybackChannels; i++) { | for (int i = 0; i < fPlaybackChannels; i++) { | ||||
if (output_ports[i]->Stop() < 0) { | |||||
if (! output_ports[i]->Stop()) { | |||||
jack_error("JackWinMMEDriver::Stop - Failed to disable output " | jack_error("JackWinMMEDriver::Stop - Failed to disable output " | ||||
"port."); | "port."); | ||||
result = -1; | result = -1; | ||||
@@ -289,6 +289,7 @@ def configure(conf): | |||||
conf.recurse('example-clients') | conf.recurse('example-clients') | ||||
conf.recurse('tools') | |||||
# test for the availability of ucontext, and how it should be used | # test for the availability of ucontext, and how it should be used | ||||
for t in ['gp_regs', 'uc_regs', 'mc_gregs', 'gregs']: | for t in ['gp_regs', 'uc_regs', 'mc_gregs', 'gregs']: | ||||
@@ -424,6 +425,14 @@ def configure(conf): | |||||
conf.env['LIBDIR'] = Options.options.libdir32 | conf.env['LIBDIR'] = Options.options.libdir32 | ||||
else: | else: | ||||
conf.env['LIBDIR'] = conf.env['PREFIX'] + '/lib32' | conf.env['LIBDIR'] = conf.env['PREFIX'] + '/lib32' | ||||
if conf.env['IS_WINDOWS'] and conf.env['BUILD_STATIC']: | |||||
def replaceFor32bit(env): | |||||
for e in env: yield e.replace('x86_64', 'i686', 1) | |||||
for env in ('AR', 'CC', 'CXX', 'LINK_CC', 'LINK_CXX'): | |||||
conf.all_envs[lib32][env] = list(replaceFor32bit(conf.all_envs[lib32][env])) | |||||
conf.all_envs[lib32]['LIB_REGEX'] = ['tre32'] | |||||
# libdb does not work in mixed mode | # libdb does not work in mixed mode | ||||
conf.all_envs[lib32]['HAVE_DB'] = 0 | conf.all_envs[lib32]['HAVE_DB'] = 0 | ||||
conf.all_envs[lib32]['HAVE_DB_H'] = 0 | conf.all_envs[lib32]['HAVE_DB_H'] = 0 | ||||
@@ -804,6 +813,8 @@ def build(bld): | |||||
build_drivers(bld) | build_drivers(bld) | ||||
bld.recurse('example-clients') | bld.recurse('example-clients') | ||||
bld.recurse('tools') | |||||
if bld.env['IS_LINUX']: | if bld.env['IS_LINUX']: | ||||
bld.recurse('man') | bld.recurse('man') | ||||
bld.recurse('systemd') | bld.recurse('systemd') | ||||