Do not skip shared libs on windows if using original regex.h
[jack2.git] / common / wscript
blobcb794e28b5d3244113155bdc0fa264320f5627e8
1 #! /usr/bin/python3
2 # encoding: utf-8
4 import re
5 import os
7 def configure(conf):
8     conf.env['BUILD_NETLIB'] = conf.env['SAMPLERATE']
9     conf.env['BUILD_ADAPTER'] = conf.env['SAMPLERATE']
11     if conf.env['IS_WINDOWS']:
12         try:
13             conf.check(header_name='regex.h', lib='regex', uselib_store='REGEX', define_name='HAVE_REGEX_H')
14         except:
15             conf.check(header_name='tre/regex.h', lib='tre', uselib_store='REGEX', define_name='HAVE_TRE_REGEX_H')
16         conf.check(header_name='winsock2.h', lib='ws2_32', uselib_store='WS2_32', define_name='HAVE_WINSOCK2_H')
17         conf.check(header_name=['windows.h', 'mmsystem.h'], lib='winmm', uselib_store='WINMM', define_name='HAVE_MMSYSTEM_H')
18         conf.check(header_name=['windows.h', 'psapi.h'], lib='psapi', uselib_store='PSAPI', define_name='HAVE_PSAPI_H')
20 def create_jack_process_obj(bld, target, sources, uselib = None, framework = None):
21     process = bld(features = ['cxx', 'cxxshlib'])
22     if not bld.env['IS_WINDOWS']:
23         process.env['cxxshlib_PATTERN'] = '%s.so'
24     process.defines  = ['HAVE_CONFIG_H','SERVER_SIDE']
25     if bld.env['IS_MACOSX']:
26         if framework:
27             process.framework = framework
28         env_includes = ['../macosx', '../posix', '../macosx/coreaudio']
29     if bld.env['IS_LINUX']:
30         env_includes = ['../linux', '../posix', '../linux/alsa']
31     if bld.env['IS_SUN']:
32         env_includes = ['../solaris', '../posix', '../solaris/oss']
33     if bld.env['IS_WINDOWS']:
34         env_includes = ['../windows', '../windows/portaudio']
35     process.includes = ['.'] + env_includes + ['jack', '..']
36     process.name     = target
37     process.target   = target
38     process.source   = sources
39     if bld.env['IS_LINUX'] or bld.env['IS_MACOSX']:
40         process.env.append_value('CPPFLAGS', '-fvisibility=hidden')
41     process.install_path = '${ADDON_DIR}/'
42     process.use = [uselib.name]
43     return process
45 def build(bld):
46     common_libsources = [
47         'JackActivationCount.cpp',
48         'JackAPI.cpp',
49         'JackClient.cpp',
50         'JackConnectionManager.cpp',
51         'ringbuffer.c',
52         'JackError.cpp',
53         'JackException.cpp',
54         'JackFrameTimer.cpp',
55         'JackGraphManager.cpp',
56         'JackPort.cpp',
57         'JackPortType.cpp',
58         'JackAudioPort.cpp',
59         'JackMidiPort.cpp',
60         'JackMidiAPI.cpp',
61         'JackEngineControl.cpp',
62         'JackShmMem.cpp',
63         'JackGenericClientChannel.cpp',
64         'shm.c',
65         'JackGlobals.cpp',
66         'JackTransportEngine.cpp',
67         'JackTools.cpp',
68         'JackMessageBuffer.cpp',
69         'JackEngineProfiling.cpp',
70         ]
72     includes = ['.', './jack']
73     if not bld.variant:
74         includes.append('..')
75     else:
76         includes.append('../..')
77     uselib = ['CELT', 'OPUS', 'DB', 'PTHREAD']
79     if bld.env['IS_LINUX']:
80         common_libsources += [
81             'JackDebugClient.cpp',
82             'timestamps.c',
83             'promiscuous.c',
84             '../posix/JackPosixThread.cpp',
85             '../posix/JackPosixProcessSync.cpp',
86             '../posix/JackPosixMutex.cpp',
87             '../posix/JackSocket.cpp',
88             '../linux/JackLinuxFutex.cpp',
89             '../linux/JackLinuxTime.c',
90             ]
91         includes = ['../linux', '../posix'] + includes
92         uselib.append('RT')
93         uselib.append('DL')
95     if bld.env['IS_SUN']:
96         common_libsources += [
97             'JackDebugClient.cpp',
98             'timestamps.c',
99             'promiscuous.c',
100            '../posix/JackPosixThread.cpp',
101            '../posix/JackFifo.cpp',
102            '../posix/JackPosixProcessSync.cpp',
103            '../posix/JackPosixMutex.cpp',
104            '../posix/JackSocket.cpp',
105            '../solaris/JackSolarisTime.c',
106            ]
107         includes = ['../solaris', '../posix'] + includes
108         uselib.append('RT')
110     if bld.env['IS_MACOSX']:
111         common_libsources += [
112             'JackDebugClient.cpp',
113             'timestamps.c',
114             'promiscuous.c',
115             '../posix/JackPosixProcessSync.cpp',
116             '../posix/JackPosixThread.cpp',
117             '../posix/JackPosixMutex.cpp',
118             '../macosx/JackMachThread.mm',
119             '../macosx/JackMachSemaphore.mm',
120             '../posix/JackSocket.cpp',
121             '../macosx/JackMachTime.c',
122             ]
123         includes = ['../macosx', '../macosx/RPC', '../posix'] + includes
125     if bld.env['IS_WINDOWS']:
126         common_libsources += [
127             '../windows/JackWinMutex.cpp',
128             '../windows/JackWinProcessSync.cpp',
129             '../windows/JackWinSemaphore.cpp',
130             '../windows/JackWinThread.cpp',
131             '../windows/JackWinTime.c',
132             ]
133         includes = ['../windows' ] + includes
134         libsuffix = "64" if (bld.env['DEST_CPU'] == "x86_64" and not bld.variant) else ""
135         skipshared = bool('HAVE_TRE_REGEX_H' in bld.env)
136         uselib.append('REGEX')
137         uselib.append('WS2_32')
138         uselib.append('PSAPI')
139         uselib.append('WINMM')
141     else:
142         libsuffix = ""
144     clientlib = bld(features = ['c', 'cxx', 'cxxshlib', 'cshlib'])
145     if bld.env['IS_MACOSX']:
146         clientlib.framework = ['CoreAudio', 'Accelerate']
147     clientlib.defines = 'HAVE_CONFIG_H'
148     clientlib.use = uselib
149     if bld.env['IS_WINDOWS']:
150          clientlib.env['cxxshlib_PATTERN'] = 'lib%s.dll'
151          clientlib.env['cxxstlib_PATTERN'] = 'lib%s.a'
152          clientlib.env['implib_PATTERN'] = 'lib%s.dll.a'
153     clientlib.install_path = '${LIBDIR}'
154     if bld.env['AUTOSTART_METHOD'] == 'dbus':
155         clientlib.use.append('DBUS-1')
156     clientlib.includes = includes
157     clientlib.name         = 'clientlib'
158     clientlib.target       = 'jack'+libsuffix
159     clientlib.source = [] + common_libsources
160     clientlib.source += [
161         'JackLibClient.cpp',
162         'JackLibAPI.cpp',
163         'JackMetadata.cpp',
164         ]
166     if bld.env['IS_LINUX']:
167         clientlib.source += [
168             '../posix/JackSocketClientChannel.cpp',
169             '../posix/JackPosixServerLaunch.cpp',
170             ]
172     if bld.env['IS_SUN']:
173         clientlib.source += [
174             '../posix/JackSocketClientChannel.cpp',
175             '../posix/JackPosixServerLaunch.cpp',
176             ]
178     if bld.env['IS_MACOSX']:
179         clientlib.source += [
180             '../posix/JackSocketClientChannel.cpp',
181             '../posix/JackPosixServerLaunch.cpp',
182             ]
184     if bld.env['IS_WINDOWS']:
185         clientlib.source += [
186             '../windows/JackWinNamedPipe.cpp',
187             '../windows/JackWinNamedPipeClientChannel.cpp',
188             '../windows/JackWinServerLaunch.cpp',
189             '../windows/JackMMCSS.cpp',
190             ]
192     if not bld.env['IS_WINDOWS']:
193         clientlib.vnum = bld.env['JACK_API_VERSION']
195     if bld.env['IS_LINUX']:
196         clientlib.env.append_value('CPPFLAGS', '-fvisibility=hidden')
198     if bld.env['IS_MACOSX']:
199         clientlib.env.append_value('CPPFLAGS', '-fvisibility=hidden')
200         clientlib.env.append_value('LINKFLAGS', '-single_module')
202     if bld.env['IS_SUN']:
203         clientlib.env.append_value('LINKFLAGS', '-lnsl -lsocket')
205     if bld.env['IS_WINDOWS']:
206         # remove switch to shared binaries if possible, as we most likely want static builds on Windows
207         if skipshared:
208             clientlib.env['SHLIB_MARKER'] = ''
209         # statically link libjack to libstdc++, some client apps like ardour come
210         # with a different version of libstdc++.dll that takes precedence and results
211         # in missing symbols during runtime
212         clientlib.env.append_value('LINKFLAGS', ['-static-libstdc++', '--disable-auto-import'])
214     if bld.variant:
215         # if there is variant defined, we expect it to be the 32bit client lib one
216         # we don't want to build other stuff in this variant
217         return
219     serverlib = bld(features = ['c', 'cxx', 'cxxshlib', 'cshlib'])
220     if bld.env['IS_MACOSX']:
221         serverlib.framework = ['CoreAudio', 'CoreFoundation', 'Accelerate']
222     serverlib.defines = ['HAVE_CONFIG_H','SERVER_SIDE']
223     serverlib.includes = includes
224     serverlib.name = 'serverlib'
225     serverlib.target = 'jackserver'+libsuffix
226     serverlib.use = uselib
227     if bld.env['IS_WINDOWS']:
228         serverlib.env['cxxshlib_PATTERN'] = 'lib%s.dll'
229         serverlib.env['cxxstlib_PATTERN'] = 'lib%s.a'
230         serverlib.env['implib_PATTERN'] = 'lib%s.dll.a'
231         if skipshared:
232             serverlib.env['SHLIB_MARKER'] = ''
233         serverlib.env.append_value('LINKFLAGS', ['-static-libstdc++', '--disable-auto-import'])
234     serverlib.install_path = '${LIBDIR}'
235     serverlib.source = [] + common_libsources
236     serverlib.source += [
237         'JackAudioDriver.cpp',
238         'JackTimedDriver.cpp',
239         'JackMidiDriver.cpp',
240         'JackDriver.cpp',
241         'JackEngine.cpp',
242         'JackExternalClient.cpp',
243         'JackFreewheelDriver.cpp',
244         'JackInternalClient.cpp',
245         'JackInternalSessionLoader.cpp',
246         'JackServer.cpp',
247         'JackThreadedDriver.cpp',
248         'JackRestartThreadedDriver.cpp',
249         'JackWaitThreadedDriver.cpp',
250         'JackWaitCallbackDriver.cpp',
251         'JackServerAPI.cpp',
252         'JackDriverLoader.cpp',
253         'JackServerGlobals.cpp',
254         'JackControlAPI.cpp',
255         'JackNetTool.cpp',
256         'JackNetInterface.cpp',
257         'JackArgParser.cpp',
258         'JackRequestDecoder.cpp',
259         'JackMidiAsyncQueue.cpp',
260         'JackMidiAsyncWaitQueue.cpp',
261         'JackMidiBufferReadQueue.cpp',
262         'JackMidiBufferWriteQueue.cpp',
263         'JackMidiRawInputWriteQueue.cpp',
264         'JackMidiRawOutputWriteQueue.cpp',
265         'JackMidiReadQueue.cpp',
266         'JackMidiReceiveQueue.cpp',
267         'JackMidiSendQueue.cpp',
268         'JackMidiUtil.cpp',
269         'JackMidiWriteQueue.cpp',
270         'JackMetadata.cpp',
271         ]
273     if bld.env['IS_LINUX']:
274         serverlib.source += [
275             '../posix/JackSocketServerChannel.cpp',
276             '../posix/JackSocketNotifyChannel.cpp',
277             '../posix/JackSocketServerNotifyChannel.cpp',
278             '../posix/JackNetUnixSocket.cpp',
279             ]
281     if bld.env['IS_SUN']:
282         serverlib.source += [
283             '../posix/JackSocketServerChannel.cpp',
284             '../posix/JackSocketNotifyChannel.cpp',
285             '../posix/JackSocketServerNotifyChannel.cpp',
286             '../posix/JackNetUnixSocket.cpp',
287             ]
289     if bld.env['IS_MACOSX']:
290         serverlib.source += [
291             '../posix/JackSocketServerChannel.cpp',
292             '../posix/JackSocketNotifyChannel.cpp',
293             '../posix/JackSocketServerNotifyChannel.cpp',
294             '../posix/JackNetUnixSocket.cpp',
295             ]
297     if bld.env['IS_WINDOWS']:
298         serverlib.source += [
299             '../windows/JackMMCSS.cpp',
300             '../windows/JackWinNamedPipe.cpp',
301             '../windows/JackWinNamedPipeServerChannel.cpp',
302             '../windows/JackWinNamedPipeServerNotifyChannel.cpp',
303             '../windows/JackWinNamedPipeNotifyChannel.cpp',
304             '../windows/JackNetWinSocket.cpp',
305             ]
307     if not bld.env['IS_WINDOWS']:
308         serverlib.vnum = bld.env['JACK_API_VERSION']
310     if bld.env['IS_LINUX']:
311         serverlib.env.append_value('CPPFLAGS', '-fvisibility=hidden')
313     if bld.env['IS_MACOSX']:
314         serverlib.env.append_value('CPPFLAGS', '-fvisibility=hidden')
315         serverlib.env.append_value('LINKFLAGS', '-single_module')
317     if bld.env['IS_SUN']:
318         serverlib.env.append_value('LINKFLAGS', '-lnsl -lsocket')
320     if bld.env['BUILD_NETLIB']:
321         netlib = bld(features = ['c', 'cxx', 'cxxshlib', 'cshlib'])
322         if bld.env['IS_MACOSX']:
323             netlib.framework =  ['CoreAudio']
324         netlib.defines = ['HAVE_CONFIG_H','SERVER_SIDE']
325         netlib.includes = includes
326         netlib.name = 'netlib'
327         netlib.target = 'jacknet'+libsuffix
328         netlib.use = ['SAMPLERATE', 'CELT', 'OPUS', 'PTHREAD']
329         if bld.env['IS_WINDOWS']:
330              netlib.env['cxxshlib_PATTERN'] = 'lib%s.dll'
331              netlib.env['cxxstlib_PATTERN'] = 'lib%s.a'
332              netlib.env['implib_PATTERN'] = 'lib%s.dll.a'
333              if skipshared:
334                  netlib.env['SHLIB_MARKER'] = ''
335              netlib.use += ['WS2_32', 'WINMM']
336         elif not bld.env['IS_MACOSX']:
337              netlib.use += ['RT']
338         netlib.install_path = '${LIBDIR}'
339         netlib.source = [
340             'JackNetAPI.cpp',
341             'JackNetInterface.cpp',
342             'JackNetTool.cpp',
343             'JackException.cpp',
344             'JackAudioAdapterInterface.cpp',
345             'JackLibSampleRateResampler.cpp',
346             'JackResampler.cpp',
347             'JackGlobals.cpp',
348             'ringbuffer.c']
350         if bld.env['IS_LINUX']:
351             netlib.source += ['../posix/JackNetUnixSocket.cpp','../posix/JackPosixThread.cpp', '../posix/JackPosixMutex.cpp', '../linux/JackLinuxTime.c']
352             netlib.env.append_value('CPPFLAGS', '-fvisibility=hidden')
354         if bld.env['IS_SUN']:
355             netlib.source += ['../posix/JackNetUnixSocket.cpp','../posix/JackPosixThread.cpp', '../posix/JackPosixMutex.cpp', '../solaris/JackSolarisTime.c']
356             netlib.env.append_value('CPPFLAGS', '-fvisibility=hidden')
359         if bld.env['IS_MACOSX']:
360             netlib.source += ['../posix/JackNetUnixSocket.cpp','../posix/JackPosixThread.cpp', '../posix/JackPosixMutex.cpp', '../macosx/JackMachThread.mm', '../macosx/JackMachTime.c']
361             netlib.env.append_value('LINKFLAGS', '-single_module')
363         if bld.env['IS_WINDOWS']:
364             netlib.source += ['../windows/JackNetWinSocket.cpp','../windows/JackWinThread.cpp', '../windows/JackMMCSS.cpp', '../windows/JackWinTime.c']
366         if not bld.env['IS_WINDOWS']:
367             netlib.vnum = bld.env['JACK_API_VERSION']
369     create_jack_process_obj(bld, 'netmanager', 'JackNetManager.cpp', serverlib)
371     create_jack_process_obj(bld, 'profiler', 'JackProfiler.cpp', serverlib)
373     net_adapter_sources = [
374         'JackResampler.cpp',
375         'JackLibSampleRateResampler.cpp',
376         'JackAudioAdapter.cpp',
377         'JackAudioAdapterInterface.cpp',
378         'JackNetAdapter.cpp',
379         ]
381     if bld.env['BUILD_ADAPTER']:
382         process = create_jack_process_obj(bld, 'netadapter', net_adapter_sources, serverlib)
383         process.use += ['SAMPLERATE']
385     audio_adapter_sources = [
386         'JackResampler.cpp',
387         'JackLibSampleRateResampler.cpp',
388         'JackAudioAdapter.cpp',
389         'JackAudioAdapterInterface.cpp',
390         'JackAudioAdapterFactory.cpp',
391          ]
393     if bld.env['BUILD_ADAPTER'] and bld.env['IS_MACOSX']:
394          audio_adapter_sources += ['../macosx/coreaudio/JackCoreAudioAdapter.mm']
395          process = create_jack_process_obj(bld,
396               'audioadapter',
397               audio_adapter_sources,
398               serverlib,
399               framework = [
400                       'CoreAudio',
401                       'AudioUnit',
402                       'AudioToolbox',
403                       'CoreServices'
404               ]
405          )
406          process.use += ['SAMPLERATE']
408     if bld.env['BUILD_ADAPTER'] and bld.env['IS_LINUX'] and bld.env['BUILD_DRIVER_ALSA']:
409          audio_adapter_sources += ['../linux/alsa/JackAlsaAdapter.cpp']
410          process = create_jack_process_obj(bld, 'audioadapter', audio_adapter_sources, serverlib)
411          process.use += ['ALSA', 'SAMPLERATE']
413     if bld.env['BUILD_ADAPTER'] and bld.env['IS_SUN']:
414          audio_adapter_sources += ['../solaris/oss/JackOSSAdapter.cpp', 'memops.c']
415          process = create_jack_process_obj(bld, 'audioadapter', audio_adapter_sources, serverlib)
416          process.use += 'SAMPLERATE'
418     if bld.env['BUILD_ADAPTER'] and bld.env['IS_WINDOWS']:
419          audio_adapter_sources += ['../windows/portaudio/JackPortAudioAdapter.cpp', '../windows/portaudio/JackPortAudioDevices.cpp']
420          process = create_jack_process_obj(bld, 'audioadapter', audio_adapter_sources, serverlib)
421          process.use += ['SAMPLERATE', 'PORTAUDIO']
424     bld.install_files('${PREFIX}/include/jack', bld.path.ant_glob('jack/*.h'))
426     # process jack.pc.in -> jack.pc
427     obj = bld(
428         features = 'subst_pc',
429         source = '../jack.pc.in',
430         target = 'jack.pc',
431         install_path = '${PKGCONFDIR}',
432         INCLUDEDIR = os.path.normpath(bld.env['PREFIX'] + '/include'),
433         CLIENTLIB = clientlib.target,
434         SERVERLIB = serverlib.target,
435         )