465138d90d2f62a357cd610695c9a6feced11220
[ardour.git] / libs / ardour / SConscript
1 # -*- python -*-
2
3 import os
4 import os.path
5 import glob
6
7 Import('env final_prefix install_prefix final_config_prefix libraries i18n')
8
9 ardour = env.Copy()
10
11 #
12 # this defines the version number of libardour
13
14
15 domain = 'libardour2'
16
17 ardour.Append(DOMAIN = domain, MAJOR = 2, MINOR = 0, MICRO = 0)
18 ardour.Append(CXXFLAGS = "-DPACKAGE=\\\"" + domain + "\\\"")
19 ardour.Append(CXXFLAGS="-DLIBSIGC_DISABLE_DEPRECATED")
20 ardour.Append(PACKAGE = domain)
21 ardour.Append(POTFILE = domain + '.pot')
22
23 #
24 # explicitly reference the control protocol LGPL library for includes
25
26  
27 ardour.Append(CPPPATH = '#libs/surfaces/control_protocol')
28
29 ardour_files=Split("""
30 bundle.cc
31 chan_count.cc
32 diskstream.cc
33 directory_names.cc
34 filename_extensions.cc
35 filesystem_paths.cc
36 find_session.cc
37 tape_file_matcher.cc
38 template_utils.cc
39 track.cc
40 audio_diskstream.cc
41 audio_library.cc
42 audio_playlist.cc
43 audio_track.cc
44 audioengine.cc
45 port.cc
46 audio_port.cc
47 midi_port.cc
48 port_set.cc
49 buffer.cc
50 audio_buffer.cc
51 midi_buffer.cc
52 buffer_set.cc
53 meter.cc
54 amp.cc
55 panner.cc
56 filter.cc
57 audiofilesource.cc
58 audioregion.cc
59 audiosource.cc
60 midi_source.cc
61 midi_diskstream.cc
62 midi_playlist.cc
63 midi_track.cc
64 midi_region.cc
65 midi_model.cc
66 note.cc
67 smf_source.cc
68 auditioner.cc
69 automation.cc
70 automation_event.cc
71 configuration.cc
72 control_protocol_manager.cc
73 control_protocol_search_path.cc
74 crossfade.cc
75 curve.cc
76 cycle_timer.cc
77 default_click.cc
78 enums.cc
79 gain.cc
80 gdither.cc
81 globals.cc
82 import.cc
83 automatable.cc
84 automation_control.cc
85 processor.cc
86 io_processor.cc
87 plugin_insert.cc
88 port_insert.cc
89 io.cc
90 jack_slave.cc
91 ladspa_plugin.cc
92 location.cc
93 mtc_slave.cc
94 named_selection.cc
95 pcm_utils.cc
96 playlist.cc
97 playlist_factory.cc
98 plugin.cc
99 plugin_manager.cc
100 recent_sessions.cc
101 region.cc
102 region_factory.cc
103 reverse.cc
104 resampled_source.cc
105 quantize.cc
106 route.cc
107 route_group.cc
108 send.cc
109 session.cc
110 session_butler.cc
111 session_click.cc
112 session_command.cc
113 session_directory.cc
114 session_events.cc
115 session_export.cc
116 session_midi.cc
117 session_process.cc
118 session_state.cc
119 session_state_utils.cc
120 session_time.cc
121 session_timefx.cc
122 session_transport.cc
123 session_utils.cc
124 silentfilesource.cc
125 sndfile_helpers.cc
126 sndfilesource.cc
127 source.cc
128 source_factory.cc
129 tempo.cc
130 utils.cc
131 version.cc
132 mix.cc
133 """)
134
135 arch_specific_objects = [ ]
136
137 osc_files = [ 'osc.cc' ]
138 vst_files = [ 'vst_plugin.cc', 'session_vst.cc' ]
139 audiounit_files = [ 'audio_unit.cc' ]
140 coreaudio_files = [ 'coreaudiosource.cc' ]
141 extra_sources = [ ]
142
143 if ardour['VST']:
144         extra_sources += vst_files
145         ardour.Append(CCFLAGS="-DVST_SUPPORT", CPPPATH="#libs/fst")
146
147 if ardour['LIBLO']:
148     extra_sources += osc_files
149
150 ardour.Append(CCFLAGS="-D_REENTRANT -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE")
151 ardour.Append(CXXFLAGS="-DDATA_DIR=\\\"" + os.path.join (final_prefix, 'share') + "\\\"")
152 ardour.Append(CXXFLAGS="-DMODULE_DIR=\\\"" + os.path.join (final_prefix, env['LIBDIR']) + "\\\"")
153 ardour.Append(CXXFLAGS="-DCONFIG_DIR=\\\"" + final_config_prefix + "\\\"")
154 ardour.Append(CXXFLAGS="-DLOCALEDIR=\\\"" + os.path.join (final_prefix, 'share', 'locale') + "\\\"")
155
156 ardour.Merge ([ libraries['jack'] ])
157
158 #
159 # See if JACK supports jack_client_open()
160 #
161
162 jack_test_source_file = """
163 #include <jack/jack.h>
164 int main(int argc, char **argv)
165 {
166     jack_client_open ("foo", 0, 0);
167     return 0;
168 }
169 """
170 def CheckJackClientOpen(context):
171         context.Message('Checking for jack_client_open()...')
172         result = context.TryLink(jack_test_source_file, '.c')
173         context.Result(result)
174         return result
175
176 #
177 # See if JACK supports jack_recompute_total_latencies()
178 #
179
180 jack_test_source_file = """
181 #include <jack/jack.h>
182 int main(int argc, char **argv)
183 {
184     jack_recompute_total_latencies ((jack_client_t*) 0);
185     return 0;
186 }
187 """
188 def CheckJackRecomputeLatencies(context):
189         context.Message('Checking for jack_recompute_total_latencies()...')
190         result = context.TryLink(jack_test_source_file, '.c')
191         context.Result(result)
192         return result
193
194 jack_video_frame_offset_test = """
195 #include <jack/transport.h>
196 int main(int argc, char** argv)
197 {
198         jack_position_t pos;
199
200         pos.valid & JackVideoFrameOffset;
201         return 0;
202 }
203 """
204 def CheckJackVideoFrameOffset(context):
205         context.Message('Checking for JackVideoFrameOffset in jack_position_bits_t enum...')
206         result = context.TryLink(jack_video_frame_offset_test, '.c')
207         context.Result(result)
208         return result
209
210
211 #
212 # See if JACK supports jack_recompute_total_latency() (single port version)
213 #
214
215 jack_port_latency_test = """
216 #include <jack/jack.h>
217 int main(int argc, char **argv)
218 {
219     jack_recompute_total_latency ((jack_client_t*) 0, (jack_port_t*) 0);
220     return 0;
221 }
222 """
223 def CheckJackRecomputeLatency(context):
224         context.Message('Checking for jack_recompute_total_latency()...')
225         result = context.TryLink(jack_port_latency_test, '.c')
226         context.Result(result)
227         return result
228
229 #
230 # See if JACK supports jack_port_ensure_monitor_input()
231 #
232 jack_ensure_monitor_input_test = """
233 #include <jack/jack.h>
234 int main(int argc, char** argv)
235 {
236             jack_port_t **port;
237
238             jack_port_ensure_monitor (*port, 1);
239             return 0;
240
241 }
242 """
243
244 def CheckJackEnsureMonitorInput(context):
245         context.Message('Checking for jack_port_ensure_monitor_input()...')
246         result = context.TryLink(jack_ensure_monitor_input_test, '.c')
247         context.Result(result)
248         return result
249
250 conf = Configure(ardour, custom_tests = {
251         'CheckJackClientOpen' : CheckJackClientOpen,
252         'CheckJackRecomputeLatencies' : CheckJackRecomputeLatencies,
253         'CheckJackRecomputeLatency' : CheckJackRecomputeLatency,
254         'CheckJackVideoFrameOffset' : CheckJackVideoFrameOffset,
255         'CheckJackEnsureMonitorInput' : CheckJackEnsureMonitorInput
256 })
257
258 if conf.CheckJackClientOpen():
259         ardour.Append(CXXFLAGS="-DHAVE_JACK_CLIENT_OPEN")
260
261 if conf.CheckJackRecomputeLatencies():
262     ardour.Append(CXXFLAGS="-DHAVE_JACK_RECOMPUTE_LATENCIES")
263
264 if conf.CheckJackRecomputeLatency():
265     ardour.Append(CXXFLAGS="-DHAVE_JACK_RECOMPUTE_LATENCY")
266
267 if conf.CheckJackVideoFrameOffset():
268         ardour.Append(CXXFLAGS="-DHAVE_JACK_VIDEO_SUPPORT")
269         
270 if conf.CheckJackEnsureMonitorInput():
271         ardour.Append(CXXFLAGS='-DHAVE_JACK_PORT_ENSURE_MONITOR')
272 else:
273     print '\nWARNING: You need at least svn revision 985 of jack for hardware monitoring to work correctly.\n'
274
275 #
276 # Optional header files
277 #
278
279 if conf.CheckCHeader('wordexp.h'):
280     ardour.Append(CXXFLAGS="-DHAVE_WORDEXP")
281
282 if conf.CheckCHeader('sys/vfs.h'):
283     ardour.Append(CXXFLAGS="-DHAVE_SYS_VFS_H")
284
285 if conf.CheckCHeader('/System/Library/Frameworks/CoreMIDI.framework/Headers/CoreMIDI.h'):
286     ardour.Append(LINKFLAGS="-framework CoreMIDI")
287
288 if conf.CheckCHeader('/System/Library/Frameworks/AudioToolbox.framework/Headers/ExtendedAudioFile.h'):
289     ardour.Append(LINKFLAGS="-framework AudioToolbox")
290
291 if conf.CheckCHeader('/System/Library/Frameworks/CoreAudio.framework/Headers/CoreAudio.h'):
292     ardour.Append(CXXFLAGS="-DHAVE_WEAK_COREAUDIO")
293
294 if conf.CheckCHeader('/System/Library/Frameworks/AudioUnit.framework/Headers/AudioUnit.h') and ardour['AUDIOUNITS']:
295     ardour.Append(CXXFLAGS="-DHAVE_AUDIOUNITS")
296     ardour.Append(LINKFLAGS="-framework AudioUnit")
297     extra_sources += audiounit_files
298  
299 if ardour['COREAUDIO']:
300     ardour.Append(CXXFLAGS="-DHAVE_COREAUDIO")    
301     extra_sources += coreaudio_files
302
303 if env['CONFIG_ARCH'] == 'apple':
304     # this next line avoids issues with circular dependencies between libardour and libardour_cp.
305     # it is based on the (entirely reasonable) assumption that a system with CoreAudio is OS X
306     #
307     ardour.Append(LINKFLAGS='-undefined suppress -flat_namespace') 
308
309 ardour = conf.Finish ()
310
311 ardour.Merge ([
312              libraries['core'],
313              libraries['xml'],
314              libraries['sndfile-ardour'],
315              libraries['raptor'],
316              libraries['lrdf'],
317              libraries['samplerate'],
318              libraries['sigc2'],
319              libraries['pbd'],
320              libraries['soundtouch'],
321              libraries['midi++2'],
322              libraries['glib2'],
323              libraries['glibmm2']
324              ])
325
326 if ardour['LIBLO']:
327     ardour.Merge ([ libraries['lo'] ])
328
329 if ardour['COREAUDIO'] or ardour['AUDIOUNITS']:
330     ardour.Merge ([ libraries['appleutility'] ])
331
332 def SharedAsmObjectEmitter(target, source, env):
333     for tgt in target:
334         tgt.attributes.shared = 1
335     return (target, source)
336
337
338 env['BUILDERS']['SharedAsmObject'] = Builder (action = '$CXX -c -fPIC $SOURCE -o $TARGET',
339                                               emitter = SharedAsmObjectEmitter,
340                                               suffix = '$SHOBJSUFFIX',
341                                               src_suffix = '.s',
342                                               single_source = 1)
343 #
344 # handle objects that should always be compiled with -msse in their own
345 # special environment, which is exactly like "ardour" but unconditionally
346 # includes -msse
347
348
349
350 always_sse_objects = []
351 sse_env = ardour.Copy()
352 sse_env.Append (CXXFLAGS="-msse")
353
354 if env['FPU_OPTIMIZATION']:
355         if env['DIST_TARGET'] == "i386":
356                 arch_specific_objects = env.SharedAsmObject('sse_functions.os', 'sse_functions.s')
357                 always_sse_objects += [ sse_env.SharedObject (source = 'sse_functions_xmm.cc') ]
358         if env['DIST_TARGET'] == "i686":
359                 arch_specific_objects = env.SharedAsmObject('sse_functions.os', 'sse_functions.s')
360                 always_sse_objects += [ sse_env.SharedObject (source = 'sse_functions_xmm.cc') ]
361         if env['DIST_TARGET'] == "x86_64":
362                 arch_specific_objects = env.SharedAsmObject('sse_functions_64bit.os', 'sse_functions_64bit.s')
363                 always_sse_objects += [ sse_env.SharedObject (source = 'sse_functions_xmm.cc') ]
364                         
365 libardour = ardour.SharedLibrary('ardour', ardour_files + always_sse_objects + extra_sources + arch_specific_objects)
366
367 Default(libardour)
368
369 if env['NLS']:
370         i18n (ardour, ardour_files + vst_files + coreaudio_files + audiounit_files, env)
371
372
373 env.Alias('install', env.Install(os.path.join(install_prefix, env['LIBDIR'], 'ardour2'), libardour))
374
375 env.Alias('version', ardour.VersionBuild(['version.cc', 'ardour/version.h'], []))
376
377 env.Alias('tarball', env.Distribute (env['DISTTREE'],
378                                      [ 'SConscript', 'i18n.h', 'gettext.h', 'sse_functions_xmm.cc', 'sse_functions.s', 'sse_functions_64bit.s' ] +
379                                      ardour_files + osc_files + vst_files + coreaudio_files + audiounit_files +
380                                      glob.glob('po/*.po') + glob.glob('ardour/*.h')))