Force library compat/current version under macOS
[jack2.git] / common / wscript
blob114eb0a2b3e8eb96b4f5bf7fdef31133a7174879
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         buildbindir = os.path.join('..', bld.path.get_bld().srcpath().rstrip(bld.path.srcpath()))
136         staticbuild = bool('BUILD_STATIC' in bld.env and bld.env['BUILD_STATIC'])
137         uselib.append('REGEX')
138         uselib.append('WS2_32')
139         uselib.append('PSAPI')
140         uselib.append('WINMM')
142     else:
143         libsuffix = ""
145     clientlib = bld(features = ['c', 'cxx', 'cxxshlib', 'cshlib'])
146     if bld.env['IS_MACOSX']:
147         clientlib.framework = ['CoreAudio', 'Accelerate']
148     clientlib.defines = 'HAVE_CONFIG_H'
149     clientlib.includes = includes
150     clientlib.name = 'clientlib'
151     clientlib.target = 'jack'+libsuffix
152     clientlib.install_path = '${LIBDIR}'
153     clientlib.use = uselib
154     if bld.env['IS_WINDOWS']:
155         clientlib.env['cxxshlib_PATTERN'] = 'lib%s.dll'
156         clientlib.env['cxxstlib_PATTERN'] = 'lib%s.a'
157         clientlib.env['implib_PATTERN'] = 'lib%s.dll.a'
158         if staticbuild:
159             clientlib.env['SHLIB_MARKER'] = ''
160         clientlib.env.append_value('LINKFLAGS', ['-static-libstdc++', '--disable-auto-import'])
161         clientlib.env.append_value('LINKFLAGS', ['-Wl,--output-def,lib%s.def' % clientlib.target])
162         bld.install_files(clientlib.install_path, [os.path.join(buildbindir, 'lib%s.def' % clientlib.target)])
164     if bld.env['AUTOSTART_METHOD'] == 'dbus':
165         clientlib.use.append('DBUS-1')
166     clientlib.source = [] + common_libsources
167     clientlib.source += [
168         'JackLibClient.cpp',
169         'JackLibAPI.cpp',
170         'JackMetadata.cpp',
171         ]
173     if bld.env['IS_LINUX']:
174         clientlib.source += [
175             '../posix/JackSocketClientChannel.cpp',
176             '../posix/JackPosixServerLaunch.cpp',
177             ]
179     if bld.env['IS_SUN']:
180         clientlib.source += [
181             '../posix/JackSocketClientChannel.cpp',
182             '../posix/JackPosixServerLaunch.cpp',
183             ]
185     if bld.env['IS_MACOSX']:
186         clientlib.source += [
187             '../posix/JackSocketClientChannel.cpp',
188             '../posix/JackPosixServerLaunch.cpp',
189             ]
191     if bld.env['IS_WINDOWS']:
192         clientlib.source += [
193             '../windows/JackWinNamedPipe.cpp',
194             '../windows/JackWinNamedPipeClientChannel.cpp',
195             '../windows/JackWinServerLaunch.cpp',
196             '../windows/JackMMCSS.cpp',
197             ]
199     if bld.env['IS_MACOSX']:
200         clientlib.cnum = bld.env['JACK_API_VERSION']
201         clientlib.vnum = bld.env['JACK_VERSION']
202     elif not bld.env['IS_WINDOWS']:
203         clientlib.vnum = bld.env['JACK_API_VERSION']
205     if bld.env['IS_LINUX']:
206         clientlib.env.append_value('CPPFLAGS', '-fvisibility=hidden')
208     if bld.env['IS_MACOSX']:
209         clientlib.env.append_value('CPPFLAGS', '-fvisibility=hidden')
210         clientlib.env.append_value('LINKFLAGS', '-single_module')
212     if bld.env['IS_SUN']:
213         clientlib.env.append_value('LINKFLAGS', '-lnsl -lsocket')
215     if bld.variant:
216         # if there is variant defined, we expect it to be the 32bit client lib one
217         # we don't want to build other stuff in this variant
218         return
220     serverlib = bld(features = ['c', 'cxx', 'cxxshlib', 'cshlib'])
221     if bld.env['IS_MACOSX']:
222         serverlib.framework = ['CoreAudio', 'CoreFoundation', 'Accelerate']
223     serverlib.defines = ['HAVE_CONFIG_H','SERVER_SIDE']
224     serverlib.includes = includes
225     serverlib.name = 'serverlib'
226     serverlib.target = 'jackserver'+libsuffix
227     serverlib.install_path = '${LIBDIR}'
228     serverlib.use = uselib
229     if bld.env['IS_WINDOWS']:
230         serverlib.env['cxxshlib_PATTERN'] = 'lib%s.dll'
231         serverlib.env['cxxstlib_PATTERN'] = 'lib%s.a'
232         serverlib.env['implib_PATTERN'] = 'lib%s.dll.a'
233         if staticbuild:
234             serverlib.env['SHLIB_MARKER'] = ''
235         serverlib.env.append_value('LINKFLAGS', ['-static-libstdc++', '--disable-auto-import'])
236         serverlib.env.append_value('LINKFLAGS', ['-Wl,--output-def,lib%s.def' % serverlib.target])
237         bld.install_files(serverlib.install_path, [os.path.join(buildbindir, 'lib%s.def' % serverlib.target)])
238     serverlib.source = [] + common_libsources
239     serverlib.source += [
240         'JackAudioDriver.cpp',
241         'JackTimedDriver.cpp',
242         'JackMidiDriver.cpp',
243         'JackDriver.cpp',
244         'JackEngine.cpp',
245         'JackExternalClient.cpp',
246         'JackFreewheelDriver.cpp',
247         'JackInternalClient.cpp',
248         'JackInternalSessionLoader.cpp',
249         'JackServer.cpp',
250         'JackThreadedDriver.cpp',
251         'JackRestartThreadedDriver.cpp',
252         'JackWaitThreadedDriver.cpp',
253         'JackWaitCallbackDriver.cpp',
254         'JackServerAPI.cpp',
255         'JackDriverLoader.cpp',
256         'JackServerGlobals.cpp',
257         'JackControlAPI.cpp',
258         'JackNetTool.cpp',
259         'JackNetInterface.cpp',
260         'JackArgParser.cpp',
261         'JackRequestDecoder.cpp',
262         'JackMidiAsyncQueue.cpp',
263         'JackMidiAsyncWaitQueue.cpp',
264         'JackMidiBufferReadQueue.cpp',
265         'JackMidiBufferWriteQueue.cpp',
266         'JackMidiRawInputWriteQueue.cpp',
267         'JackMidiRawOutputWriteQueue.cpp',
268         'JackMidiReadQueue.cpp',
269         'JackMidiReceiveQueue.cpp',
270         'JackMidiSendQueue.cpp',
271         'JackMidiUtil.cpp',
272         'JackMidiWriteQueue.cpp',
273         'JackMetadata.cpp',
274         ]
276     if bld.env['IS_LINUX']:
277         serverlib.source += [
278             '../posix/JackSocketServerChannel.cpp',
279             '../posix/JackSocketNotifyChannel.cpp',
280             '../posix/JackSocketServerNotifyChannel.cpp',
281             '../posix/JackNetUnixSocket.cpp',
282             ]
284     if bld.env['IS_SUN']:
285         serverlib.source += [
286             '../posix/JackSocketServerChannel.cpp',
287             '../posix/JackSocketNotifyChannel.cpp',
288             '../posix/JackSocketServerNotifyChannel.cpp',
289             '../posix/JackNetUnixSocket.cpp',
290             ]
292     if bld.env['IS_MACOSX']:
293         serverlib.source += [
294             '../posix/JackSocketServerChannel.cpp',
295             '../posix/JackSocketNotifyChannel.cpp',
296             '../posix/JackSocketServerNotifyChannel.cpp',
297             '../posix/JackNetUnixSocket.cpp',
298             ]
300     if bld.env['IS_WINDOWS']:
301         serverlib.source += [
302             '../windows/JackMMCSS.cpp',
303             '../windows/JackWinNamedPipe.cpp',
304             '../windows/JackWinNamedPipeServerChannel.cpp',
305             '../windows/JackWinNamedPipeServerNotifyChannel.cpp',
306             '../windows/JackWinNamedPipeNotifyChannel.cpp',
307             '../windows/JackNetWinSocket.cpp',
308             ]
310     if bld.env['IS_MACOSX']:
311         serverlib.cnum = bld.env['JACK_API_VERSION']
312         serverlib.vnum = bld.env['JACK_VERSION']
313     elif not bld.env['IS_WINDOWS']:
314         serverlib.vnum = bld.env['JACK_API_VERSION']
316     if bld.env['IS_LINUX']:
317         serverlib.env.append_value('CPPFLAGS', '-fvisibility=hidden')
319     if bld.env['IS_MACOSX']:
320         serverlib.env.append_value('CPPFLAGS', '-fvisibility=hidden')
321         serverlib.env.append_value('LINKFLAGS', '-single_module')
323     if bld.env['IS_SUN']:
324         serverlib.env.append_value('LINKFLAGS', '-lnsl -lsocket')
326     if bld.env['BUILD_NETLIB']:
327         netlib = bld(features = ['c', 'cxx', 'cxxshlib', 'cshlib'])
328         if bld.env['IS_MACOSX']:
329             netlib.framework =  ['CoreAudio']
330         netlib.defines = ['HAVE_CONFIG_H','SERVER_SIDE']
331         netlib.includes = includes
332         netlib.name = 'netlib'
333         netlib.target = 'jacknet'+libsuffix
334         netlib.install_path = '${LIBDIR}'
335         netlib.use = ['SAMPLERATE', 'CELT', 'OPUS', 'PTHREAD']
336         if bld.env['IS_WINDOWS']:
337             netlib.use += ['WS2_32', 'WINMM']
338             netlib.env['cxxshlib_PATTERN'] = 'lib%s.dll'
339             netlib.env['cxxstlib_PATTERN'] = 'lib%s.a'
340             netlib.env['implib_PATTERN'] = 'lib%s.dll.a'
341             if staticbuild:
342                 netlib.env['SHLIB_MARKER'] = ''
343             netlib.env.append_value('LINKFLAGS', ['-static-libstdc++', '--disable-auto-import'])
344             netlib.env.append_value('LINKFLAGS', ['-Wl,--output-def,lib%s.def' % netlib.target])
345             bld.install_files(netlib.install_path, [os.path.join(buildbindir, 'lib%s.def' % netlib.target)])
346         elif not bld.env['IS_MACOSX']:
347             netlib.use += ['RT']
348         netlib.source = [
349             'JackNetAPI.cpp',
350             'JackNetInterface.cpp',
351             'JackNetTool.cpp',
352             'JackException.cpp',
353             'JackAudioAdapterInterface.cpp',
354             'JackLibSampleRateResampler.cpp',
355             'JackResampler.cpp',
356             'JackGlobals.cpp',
357             'ringbuffer.c']
359         if bld.env['IS_LINUX']:
360             netlib.source += ['../posix/JackNetUnixSocket.cpp','../posix/JackPosixThread.cpp', '../posix/JackPosixMutex.cpp', '../linux/JackLinuxTime.c']
361             netlib.env.append_value('CPPFLAGS', '-fvisibility=hidden')
363         if bld.env['IS_SUN']:
364             netlib.source += ['../posix/JackNetUnixSocket.cpp','../posix/JackPosixThread.cpp', '../posix/JackPosixMutex.cpp', '../solaris/JackSolarisTime.c']
365             netlib.env.append_value('CPPFLAGS', '-fvisibility=hidden')
368         if bld.env['IS_MACOSX']:
369             netlib.source += ['../posix/JackNetUnixSocket.cpp','../posix/JackPosixThread.cpp', '../posix/JackPosixMutex.cpp', '../macosx/JackMachThread.mm', '../macosx/JackMachTime.c']
370             netlib.env.append_value('LINKFLAGS', '-single_module')
372         if bld.env['IS_WINDOWS']:
373             netlib.source += ['../windows/JackNetWinSocket.cpp','../windows/JackWinThread.cpp', '../windows/JackMMCSS.cpp', '../windows/JackWinTime.c']
375         if bld.env['IS_MACOSX']:
376             netlib.cnum = bld.env['JACK_API_VERSION']
377             netlib.vnum = bld.env['JACK_VERSION']
378         elif not bld.env['IS_WINDOWS']:
379             netlib.vnum = bld.env['JACK_API_VERSION']
381     create_jack_process_obj(bld, 'netmanager', 'JackNetManager.cpp', serverlib)
383     create_jack_process_obj(bld, 'profiler', 'JackProfiler.cpp', serverlib)
385     net_adapter_sources = [
386         'JackResampler.cpp',
387         'JackLibSampleRateResampler.cpp',
388         'JackAudioAdapter.cpp',
389         'JackAudioAdapterInterface.cpp',
390         'JackNetAdapter.cpp',
391         ]
393     if bld.env['BUILD_ADAPTER']:
394         process = create_jack_process_obj(bld, 'netadapter', net_adapter_sources, serverlib)
395         process.use += ['SAMPLERATE']
397     audio_adapter_sources = [
398         'JackResampler.cpp',
399         'JackLibSampleRateResampler.cpp',
400         'JackAudioAdapter.cpp',
401         'JackAudioAdapterInterface.cpp',
402         'JackAudioAdapterFactory.cpp',
403          ]
405     if bld.env['BUILD_ADAPTER'] and bld.env['IS_MACOSX']:
406          audio_adapter_sources += ['../macosx/coreaudio/JackCoreAudioAdapter.mm']
407          process = create_jack_process_obj(bld,
408               'audioadapter',
409               audio_adapter_sources,
410               serverlib,
411               framework = [
412                       'CoreAudio',
413                       'AudioUnit',
414                       'AudioToolbox',
415                       'CoreServices'
416               ]
417          )
418          process.use += ['SAMPLERATE']
420     if bld.env['BUILD_ADAPTER'] and bld.env['IS_LINUX'] and bld.env['BUILD_DRIVER_ALSA']:
421          audio_adapter_sources += ['../linux/alsa/JackAlsaAdapter.cpp']
422          process = create_jack_process_obj(bld, 'audioadapter', audio_adapter_sources, serverlib)
423          process.use += ['ALSA', 'SAMPLERATE']
425     if bld.env['BUILD_ADAPTER'] and bld.env['IS_SUN']:
426          audio_adapter_sources += ['../solaris/oss/JackOSSAdapter.cpp', 'memops.c']
427          process = create_jack_process_obj(bld, 'audioadapter', audio_adapter_sources, serverlib)
428          process.use += 'SAMPLERATE'
430     if bld.env['BUILD_ADAPTER'] and bld.env['IS_WINDOWS']:
431          audio_adapter_sources += ['../windows/portaudio/JackPortAudioAdapter.cpp', '../windows/portaudio/JackPortAudioDevices.cpp']
432          process = create_jack_process_obj(bld, 'audioadapter', audio_adapter_sources, serverlib)
433          process.use += ['SAMPLERATE', 'PORTAUDIO']
436     bld.install_files('${PREFIX}/include/jack', bld.path.ant_glob('jack/*.h'))
438     # process jack.pc.in -> jack.pc
439     obj = bld(
440         features = 'subst_pc',
441         source = '../jack.pc.in',
442         target = 'jack.pc',
443         install_path = '${PKGCONFDIR}',
444         INCLUDEDIR = os.path.normpath(bld.env['PREFIX'] + '/include'),
445         CLIENTLIB = clientlib.target,
446         SERVERLIB = serverlib.target,
447         )