b0dfbb292c1acf959b702b081b854e8f0459f472
[ardour.git] / SConstruct
1 # -*- python -*-
2
3 import os
4 import sys
5 import re
6 import shutil
7 import glob
8 import errno
9 import time
10 import platform
11 import string
12 import commands
13 from sets import Set
14 import SCons.Node.FS
15
16 SConsignFile()
17 EnsureSConsVersion(0, 96)
18
19 ardour_version = '2.2'
20
21 subst_dict = { }
22
23 #
24 # Command-line options
25 #
26
27 opts = Options('scache.conf')
28 opts.AddOptions(
29     ('ARCH', 'Set architecture-specific compilation flags by hand (all flags as 1 argument)',''),
30     BoolOption('AUDIOUNITS', 'Compile with Apple\'s AudioUnit library. (experimental)', 0),
31     BoolOption('COREAUDIO', 'Compile with Apple\'s CoreAudio library', 0),
32     BoolOption('GTKOSX', 'Compile for use with GTK-OSX, not GTK-X11', 0),
33     BoolOption('NATIVE_OSX_KEYS', 'Build key bindings file that matches OS X conventions', 0),
34     BoolOption('DEBUG', 'Set to build with debugging information and no optimizations', 0),
35     PathOption('DESTDIR', 'Set the intermediate install "prefix"', '/'),
36     EnumOption('DIST_TARGET', 'Build target for cross compiling packagers', 'auto', allowed_values=('auto', 'i386', 'i686', 'x86_64', 'powerpc', 'tiger', 'panther', 'none' ), ignorecase=2),
37     BoolOption('DMALLOC', 'Compile and link using the dmalloc library', 0),
38     BoolOption('EXTRA_WARN', 'Compile with -Wextra, -ansi, and -pedantic.  Might break compilation.  For pedants', 0),
39     BoolOption('FFT_ANALYSIS', 'Include FFT analysis window', 0),
40     BoolOption('FPU_OPTIMIZATION', 'Build runtime checked assembler code', 1),
41     BoolOption('LIBLO', 'Compile with support for liblo library', 1),
42     BoolOption('NLS', 'Set to turn on i18n support', 1),
43     PathOption('PREFIX', 'Set the install "prefix"', '/usr/local'),
44     BoolOption('SURFACES', 'Build support for control surfaces', 1),
45     BoolOption('SYSLIBS', 'USE AT YOUR OWN RISK: CANCELS ALL SUPPORT FROM ARDOUR AUTHORS: Use existing system versions of various libraries instead of internal ones', 0),
46     BoolOption('UNIVERSAL', 'Compile as universal binary.  Requires that external libraries are already universal.', 0),
47     BoolOption('VERSIONED', 'Add revision information to ardour/gtk executable name inside the build directory', 0),
48     BoolOption('VST', 'Compile with support for VST', 0),
49     BoolOption('LV2', 'Compile with support for LV2 (if slv2 is available)', 1),
50     BoolOption('GPROFILE', 'Compile with support for gprofile (Developers only)', 0),
51     BoolOption('TRANZPORT', 'Compile with support for Frontier Designs (if libusb is available)', 1)
52 )
53
54 #----------------------------------------------------------------------
55 # a handy helper that provides a way to merge compile/link information
56 # from multiple different "environments"
57 #----------------------------------------------------------------------
58 #
59 class LibraryInfo(Environment):
60     def __init__(self,*args,**kw):
61         Environment.__init__ (self,*args,**kw)
62     
63     def Merge (self,others):
64         for other in others:
65             self.Append (LIBS = other.get ('LIBS',[]))
66             self.Append (LIBPATH = other.get ('LIBPATH', []))
67             self.Append (CPPPATH = other.get('CPPPATH', []))
68             self.Append (LINKFLAGS = other.get('LINKFLAGS', []))
69             self.Append (CCFLAGS = other.get('CCFLAGS', []))
70         self.Replace(LIBPATH = list(Set(self.get('LIBPATH', []))))
71         self.Replace(CPPPATH = list(Set(self.get('CPPPATH',[]))))
72         #doing LINKFLAGS breaks -framework
73         #doing LIBS break link order dependency
74     
75     def ENV_update(self, src_ENV):
76         for k in src_ENV.keys():
77             if k in self['ENV'].keys() and k in [ 'PATH', 'LD_LIBRARY_PATH',
78                                                   'LIB', 'INCLUDE' ]:
79                 self['ENV'][k]=SCons.Util.AppendPath(self['ENV'][k], src_ENV[k])
80             else:
81                 self['ENV'][k]=src_ENV[k]
82
83 env = LibraryInfo (options = opts,
84                    CPPPATH = [ '.' ],
85                    VERSION = ardour_version,
86                    TARBALL='ardour-' + ardour_version + '.tar.bz2',
87                    DISTFILES = [ ],
88                    DISTTREE  = '#ardour-' + ardour_version,
89                    DISTCHECKDIR = '#ardour-' + ardour_version + '/check'
90                    )
91
92 env.ENV_update(os.environ)
93
94 #----------------------------------------------------------------------
95 # Builders
96 #----------------------------------------------------------------------
97
98 # Handy subst-in-file builder
99 #
100
101 def do_subst_in_file(targetfile, sourcefile, dict):
102     """Replace all instances of the keys of dict with their values.
103     For example, if dict is {'%VERSION%': '1.2345', '%BASE%': 'MyProg'},
104     then all instances of %VERSION% in the file will be replaced with 1.2345 etc.
105     """
106     try:
107         f = open(sourcefile, 'rb')
108         contents = f.read()
109         f.close()
110     except:
111         raise SCons.Errors.UserError, "Can't read source file %s"%sourcefile
112     for (k,v) in dict.items():
113         contents = re.sub(k, v, contents)
114     try:
115         f = open(targetfile, 'wb')
116         f.write(contents)
117         f.close()
118     except:
119         raise SCons.Errors.UserError, "Can't write target file %s"%targetfile
120     return 0 # success
121
122 def subst_in_file(target, source, env):
123     if not env.has_key('SUBST_DICT'):
124         raise SCons.Errors.UserError, "SubstInFile requires SUBST_DICT to be set."
125     d = dict(env['SUBST_DICT']) # copy it
126     for (k,v) in d.items():
127         if callable(v):
128             d[k] = env.subst(v())
129         elif SCons.Util.is_String(v):
130             d[k]=env.subst(v)
131         else:
132             raise SCons.Errors.UserError, "SubstInFile: key %s: %s must be a string or callable"%(k, repr(v))
133     for (t,s) in zip(target, source):
134         return do_subst_in_file(str(t), str(s), d)
135
136 def subst_in_file_string(target, source, env):
137     """This is what gets printed on the console."""
138     return '\n'.join(['Substituting vars from %s into %s'%(str(s), str(t))
139                       for (t,s) in zip(target, source)])
140
141 def subst_emitter(target, source, env):
142     """Add dependency from substituted SUBST_DICT to target.
143     Returns original target, source tuple unchanged.
144     """
145     d = env['SUBST_DICT'].copy() # copy it
146     for (k,v) in d.items():
147         if callable(v):
148             d[k] = env.subst(v())
149         elif SCons.Util.is_String(v):
150             d[k]=env.subst(v)
151     Depends(target, SCons.Node.Python.Value(d))
152     # Depends(target, source) # this doesn't help the install-sapphire-linux.sh problem
153     return target, source
154
155 subst_action = Action (subst_in_file, subst_in_file_string)
156 env['BUILDERS']['SubstInFile'] = Builder(action=subst_action, emitter=subst_emitter)
157
158 #
159 # internationalization
160 #
161
162 # po_builder: builder function to copy po files to the parent directory while updating them
163 #
164 # first source:  .po file
165 # second source: .pot file
166 #
167
168 def po_builder(target,source,env):
169     os.spawnvp (os.P_WAIT, 'cp', ['cp', str(source[0]), str(target[0])])
170     args = [ 'msgmerge',
171              '--update',
172              str(target[0]),
173              str(source[1])
174              ]
175     print 'Updating ' + str(target[0])
176     return os.spawnvp (os.P_WAIT, 'msgmerge', args)
177
178 po_bld = Builder (action = po_builder)
179 env.Append(BUILDERS = {'PoBuild' : po_bld})
180
181 # mo_builder: builder function for (binary) message catalogs (.mo)
182 #
183 # first source:  .po file
184 #
185
186 def mo_builder(target,source,env):
187     args = [ 'msgfmt',
188              '-c',
189              '-o',
190              target[0].get_path(),
191              source[0].get_path()
192              ]
193     return os.spawnvp (os.P_WAIT, 'msgfmt', args)
194
195 mo_bld = Builder (action = mo_builder)
196 env.Append(BUILDERS = {'MoBuild' : mo_bld})
197
198 # pot_builder: builder function for message templates (.pot)
199 #
200 # source: list of C/C++ etc. files to extract messages from
201 #
202
203 def pot_builder(target,source,env):
204     args = [ 'xgettext',
205              '--keyword=_',
206              '--keyword=N_',
207              '--from-code=UTF-8',
208              '-o', target[0].get_path(),
209              "--default-domain=" + env['PACKAGE'],
210              '--copyright-holder="Paul Davis"' ]
211     args += [ src.get_path() for src in source ]
212     
213     return os.spawnvp (os.P_WAIT, 'xgettext', args)
214
215 pot_bld = Builder (action = pot_builder)
216 env.Append(BUILDERS = {'PotBuild' : pot_bld})
217
218 #
219 # utility function, not a builder
220 #
221
222 def i18n (buildenv, sources, installenv):
223     domain = buildenv['PACKAGE']
224     potfile = buildenv['POTFILE']
225     
226     installenv.Alias ('potupdate', buildenv.PotBuild (potfile, sources))
227     
228     p_oze = [ os.path.basename (po) for po in glob.glob ('po/*.po') ]
229     languages = [ po.replace ('.po', '') for po in p_oze ]
230     
231     for po_file in p_oze:
232         buildenv.PoBuild(po_file, ['po/'+po_file, potfile])
233         mo_file = po_file.replace (".po", ".mo")
234         installenv.Alias ('install', buildenv.MoBuild (mo_file, po_file))
235         installenv.Alias ('msgupdate', buildenv.MoBuild (mo_file, po_file))
236     
237     for lang in languages:
238         modir = (os.path.join (install_prefix, 'share/locale/' + lang + '/LC_MESSAGES/'))
239         moname = domain + '.mo'
240         installenv.Alias('install', installenv.InstallAs (os.path.join (modir, moname), lang + '.mo'))
241
242
243 def fetch_svn_revision (path):
244     cmd = "LANG= "
245     cmd += "svn info "
246     cmd += path
247     cmd += " | awk '/^Revision:/ { print $2}'"
248     return commands.getoutput (cmd)
249
250 def create_stored_revision (target = None, source = None, env = None):
251     if os.path.exists('.svn'):    
252         rev = fetch_svn_revision ('.');
253         try:
254             text  = "#ifndef __ardour_svn_revision_h__\n"
255             text += "#define __ardour_svn_revision_h__\n"
256             text += "static const char* ardour_svn_revision = \"" + rev + "\";\n";
257             text += "#endif\n"
258             print '============> writing svn revision info to svn_revision.h\n'
259             o = file ('svn_revision.h', 'w')
260             o.write (text)
261             o.close ()
262         except IOError:
263             print "Could not open svn_revision.h for writing\n"
264             sys.exit (-1)
265     else:
266         print "You cannot use \"scons revision\" on without using a checked out"
267         print "copy of the Ardour source code repository"
268         sys.exit (-1)
269
270 #
271 # A generic builder for version.cc files
272 #
273 # note: requires that DOMAIN, MAJOR, MINOR, MICRO are set in the construction environment
274 # note: assumes one source files, the header that declares the version variables
275 #
276
277 def version_builder (target, source, env):
278
279     text  = "int " + env['DOMAIN'] + "_major_version = " + str (env['MAJOR']) + ";\n"
280     text += "int " + env['DOMAIN'] + "_minor_version = " + str (env['MINOR']) + ";\n"
281     text += "int " + env['DOMAIN'] + "_micro_version = " + str (env['MICRO']) + ";\n"
282     
283     try:
284         o = file (target[0].get_path(), 'w')
285         o.write (text)
286         o.close ()
287     except IOError:
288         print "Could not open", target[0].get_path(), " for writing\n"
289         sys.exit (-1)
290
291     text  = "#ifndef __" + env['DOMAIN'] + "_version_h__\n"
292     text += "#define __" + env['DOMAIN'] + "_version_h__\n"
293     text += "extern const char* " + env['DOMAIN'] + "_revision;\n"
294     text += "extern int " + env['DOMAIN'] + "_major_version;\n"
295     text += "extern int " + env['DOMAIN'] + "_minor_version;\n"
296     text += "extern int " + env['DOMAIN'] + "_micro_version;\n"
297     text += "#endif /* __" + env['DOMAIN'] + "_version_h__ */\n"
298     
299     try:
300         o = file (target[1].get_path(), 'w')
301         o.write (text)
302         o.close ()
303     except IOError:
304         print "Could not open", target[1].get_path(), " for writing\n"
305         sys.exit (-1)
306         
307     return None
308
309 version_bld = Builder (action = version_builder)
310 env.Append (BUILDERS = {'VersionBuild' : version_bld})
311
312 #
313 # a builder that makes a hard link from the 'source' executable to a name with
314 # a "build ID" based on the most recent CVS activity that might be reasonably
315 # related to version activity. this relies on the idea that the SConscript
316 # file that builds the executable is updated with new version info and committed
317 # to the source code repository whenever things change.
318 #
319
320 def versioned_builder(target,source,env):
321     w, r = os.popen2( "LANG= svn info | awk '/^Revision:/ { print $2}'")
322     
323     last_revision = r.readline().strip()
324     w.close()
325     r.close()
326     if last_revision == "":
327         print "No SVN info found - versioned executable cannot be built"
328         return -1
329     
330     print "The current build ID is " + last_revision
331     
332     tagged_executable = source[0].get_path() + '-' + last_revision
333     
334     if os.path.exists (tagged_executable):
335         print "Replacing existing executable with the same build tag."
336         os.unlink (tagged_executable)
337     
338     return os.link (source[0].get_path(), tagged_executable)
339
340 verbuild = Builder (action = versioned_builder)
341 env.Append (BUILDERS = {'VersionedExecutable' : verbuild})
342
343 #
344 # source tar file builder
345 #
346
347 def distcopy (target, source, env):
348     treedir = str (target[0])
349     
350     try:
351         os.mkdir (treedir)
352     except OSError, (errnum, strerror):
353         if errnum != errno.EEXIST:
354             print 'mkdir ', treedir, ':', strerror
355     
356     cmd = 'tar cf - '
357     #
358     # we don't know what characters might be in the file names
359     # so quote them all before passing them to the shell
360     #
361     all_files = ([ str(s) for s in source ])
362     cmd += " ".join ([ "'%s'" % quoted for quoted in all_files])
363     cmd += ' | (cd ' + treedir + ' && tar xf -)'
364     p = os.popen (cmd)
365     return p.close ()
366
367 def tarballer (target, source, env):
368     cmd = 'tar -jcf ' + str (target[0]) +  ' ' + str(source[0]) + "  --exclude '*~'" + " --exclude .svn --exclude '.svn/*'"
369     print 'running ', cmd, ' ... '
370     p = os.popen (cmd)
371     return p.close ()
372
373 dist_bld = Builder (action = distcopy,
374                     target_factory = SCons.Node.FS.default_fs.Entry,
375                     source_factory = SCons.Node.FS.default_fs.Entry,
376                     multi = 1)
377
378 tarball_bld = Builder (action = tarballer,
379                        target_factory = SCons.Node.FS.default_fs.Entry,
380                        source_factory = SCons.Node.FS.default_fs.Entry)
381
382 env.Append (BUILDERS = {'Distribute' : dist_bld})
383 env.Append (BUILDERS = {'Tarball' : tarball_bld})
384
385 #
386 # Make sure they know what they are doing
387 #
388
389 if env['VST']:
390     if os.path.isfile('.personal_use_only'):
391         print "Enabling VST support. Note that distributing a VST-enabled ardour\nis a violation of several different licences.\nBuild with VST=false if you intend to distribute ardour to others."
392     else:
393         sys.stdout.write ("Are you building Ardour for personal use (rather than distribution to others)? [no]: ")
394         answer = sys.stdin.readline ()
395         answer = answer.rstrip().strip()
396         if answer == "yes" or answer == "y":
397             fh = open('.personal_use_only', 'w')
398             fh.close()
399             print "OK, VST support will be enabled"
400         else:
401             print 'You cannot build Ardour with VST support for distribution to others.\nIt is a violation of several different licenses. Build with VST=false.'
402             sys.exit (-1);
403 else:
404     if os.path.isfile('.personal_use_only'):
405         os.remove('.personal_use_only')
406
407 ####################
408 # push environment
409 ####################
410
411 def pushEnvironment(context):
412     if os.environ.has_key('PATH'):
413         context.Append(PATH = os.environ['PATH'])
414         
415     if os.environ.has_key('PKG_CONFIG_PATH'):
416         context.Append(PKG_CONFIG_PATH = os.environ['PKG_CONFIG_PATH'])
417             
418     if os.environ.has_key('CC'):
419         context['CC'] = os.environ['CC']
420                 
421     if os.environ.has_key('CXX'):
422         context['CXX'] = os.environ['CXX']
423
424     if os.environ.has_key('DISTCC_HOSTS'):
425         context['ENV']['DISTCC_HOSTS'] = os.environ['DISTCC_HOSTS']
426         context['ENV']['HOME'] = os.environ['HOME']
427
428 pushEnvironment (env)
429
430 #######################
431 # Dependency Checking #
432 #######################
433
434 deps = \
435 {
436         'glib-2.0'             : '2.10.1',
437         'gthread-2.0'          : '2.10.1',
438         'gtk+-2.0'             : '2.8.1',
439         'libxml-2.0'           : '2.6.0',
440         'samplerate'           : '0.1.0',
441         'raptor'               : '1.4.2',
442         'lrdf'                 : '0.4.0',
443         'jack'                 : '0.101.1',
444         'libgnomecanvas-2.0'   : '2.0'
445 }
446
447 def DependenciesRequiredMessage():
448         print 'You do not have the necessary dependencies required to build ardour'
449         print 'Please consult http://ardour.org/building for more information'
450
451 def CheckPKGConfig(context, version):
452     context.Message( 'Checking for pkg-config version >= %s... ' %version )
453     ret = context.TryAction('pkg-config --atleast-pkgconfig-version=%s' % version)[0]
454     context.Result( ret )
455     return ret
456
457 def CheckPKGVersion(context, name, version):
458     context.Message( 'Checking for %s... ' % name )
459     ret = context.TryAction('pkg-config --atleast-version=%s %s' %(version,name) )[0]
460     context.Result( ret )
461     return ret
462
463 def CheckPKGExists(context, name):
464     context.Message ('Checking for %s...' % name)
465     ret = context.TryAction('pkg-config --exists %s' % name)[0]
466     context.Result (ret)
467     return ret
468
469 conf = Configure(env, custom_tests = { 'CheckPKGConfig' : CheckPKGConfig,
470                                        'CheckPKGVersion' : CheckPKGVersion })
471
472 # I think a more recent version is needed on win32
473 min_pkg_config_version = '0.8.0'
474
475 if not conf.CheckPKGConfig(min_pkg_config_version):
476      print 'pkg-config >= %s not found.' % min_pkg_config_version
477      Exit(1)
478
479 for pkg, version in deps.iteritems():
480         if not conf.CheckPKGVersion( pkg, version ):
481                 print '%s >= %s not found.' %(pkg, version)
482                 DependenciesRequiredMessage()
483                 Exit(1)
484
485 env = conf.Finish()
486
487 # ----------------------------------------------------------------------
488 # Construction environment setup
489 # ----------------------------------------------------------------------
490
491 libraries = { }
492
493 libraries['core'] = LibraryInfo (CCFLAGS = '-Ilibs')
494
495 #libraries['sndfile'] = LibraryInfo()
496 #libraries['sndfile'].ParseConfig('pkg-config --cflags --libs sndfile')
497
498 libraries['lrdf'] = LibraryInfo()
499 libraries['lrdf'].ParseConfig('pkg-config --cflags --libs lrdf')
500
501 libraries['raptor'] = LibraryInfo()
502 libraries['raptor'].ParseConfig('pkg-config --cflags --libs raptor')
503
504 libraries['samplerate'] = LibraryInfo()
505 libraries['samplerate'].ParseConfig('pkg-config --cflags --libs samplerate')
506
507 conf = env.Configure (custom_tests = { 'CheckPKGExists' : CheckPKGExists } )
508
509 if conf.CheckPKGExists ('fftw3f'):
510     libraries['fftw3f'] = LibraryInfo()
511     libraries['fftw3f'].ParseConfig('pkg-config --cflags --libs fftw3f')
512
513 if conf.CheckPKGExists ('fftw3'):
514     libraries['fftw3'] = LibraryInfo()
515     libraries['fftw3'].ParseConfig('pkg-config --cflags --libs fftw3')
516
517 env = conf.Finish ()
518
519 if env['FFT_ANALYSIS']:
520         #
521         # Check for fftw3 header as well as the library
522         #
523
524         conf = Configure(libraries['fftw3'])
525
526         if conf.CheckHeader ('fftw3.h') == False:
527             print ('FFT Analysis cannot be compiled without the FFTW3 headers, which do not seem to be installed')
528             sys.exit (1)            
529         conf.Finish()
530
531 if env['LV2']:
532         conf = env.Configure(custom_tests = { 'CheckPKGExists' : CheckPKGExists })
533         
534         if conf.CheckPKGExists ('\"slv2 >= 0.4.4\"'):
535                 libraries['slv2'] = LibraryInfo()
536                 libraries['slv2'].ParseConfig('pkg-config --cflags --libs slv2')
537         else:
538                 print 'Building Ardour with LV2 support requires SLV2 >= 0.4.4'
539                 env['LV2'] = 0
540         conf.Finish()
541         
542 libraries['jack'] = LibraryInfo()
543 libraries['jack'].ParseConfig('pkg-config --cflags --libs jack')
544
545 libraries['xml'] = LibraryInfo()
546 libraries['xml'].ParseConfig('pkg-config --cflags --libs libxml-2.0')
547
548 libraries['xslt'] = LibraryInfo()
549 libraries['xslt'].ParseConfig('pkg-config --cflags --libs libxslt')
550
551 libraries['glib2'] = LibraryInfo()
552 libraries['glib2'].ParseConfig ('pkg-config --cflags --libs glib-2.0')
553 libraries['glib2'].ParseConfig ('pkg-config --cflags --libs gobject-2.0')
554 libraries['glib2'].ParseConfig ('pkg-config --cflags --libs gmodule-2.0')
555 libraries['glib2'].ParseConfig ('pkg-config --cflags --libs gthread-2.0')
556
557 libraries['gtk2'] = LibraryInfo()
558 libraries['gtk2'].ParseConfig ('pkg-config --cflags --libs gtk+-2.0')
559
560 libraries['pango'] = LibraryInfo()
561 libraries['pango'].ParseConfig ('pkg-config --cflags --libs pango')
562
563 libraries['libgnomecanvas2'] = LibraryInfo()
564 libraries['libgnomecanvas2'].ParseConfig ('pkg-config --cflags --libs libgnomecanvas-2.0')
565
566 #libraries['flowcanvas'] = LibraryInfo(LIBS='flowcanvas', LIBPATH='#/libs/flowcanvas', CPPPATH='#libs/flowcanvas')
567
568 # The Ardour Control Protocol Library
569
570 libraries['ardour_cp'] = LibraryInfo (LIBS='ardour_cp', LIBPATH='#libs/surfaces/control_protocol',
571                                       CPPPATH='#libs/surfaces/control_protocol')
572
573 # The Ardour backend/engine
574
575 libraries['ardour'] = LibraryInfo (LIBS='ardour', LIBPATH='#libs/ardour', CPPPATH='#libs/ardour')
576 libraries['midi++2'] = LibraryInfo (LIBS='midi++', LIBPATH='#libs/midi++2', CPPPATH='#libs/midi++2')
577 libraries['pbd']    = LibraryInfo (LIBS='pbd', LIBPATH='#libs/pbd', CPPPATH='#libs/pbd')
578 libraries['gtkmm2ext'] = LibraryInfo (LIBS='gtkmm2ext', LIBPATH='#libs/gtkmm2ext', CPPPATH='#libs/gtkmm2ext')
579
580
581 # SCons should really do this for us
582
583 conf = env.Configure ()
584
585 have_cxx = conf.TryAction (Action (str(env['CXX']) + ' --version'))
586 if have_cxx[0] != 1:
587     print "This system has no functional C++ compiler. You cannot build Ardour from source without one."
588     sys.exit (1)
589 else:
590     print "Congratulations, you have a functioning C++ compiler."
591
592 env = conf.Finish()
593
594
595 #
596 # Compiler flags and other system-dependent stuff
597 #
598
599 opt_flags = []
600 if env['GPROFILE'] == 1:
601     debug_flags = [ '-g', '-pg' ]
602 else:
603     debug_flags = [ '-g' ]
604
605 # guess at the platform, used to define compiler flags
606
607 config_guess = os.popen("tools/config.guess").read()[:-1]
608
609 config_cpu = 0
610 config_arch = 1
611 config_kernel = 2
612 config_os = 3
613 config = config_guess.split ("-")
614
615 print "system triple: " + config_guess
616
617 # Autodetect
618 if env['DIST_TARGET'] == 'auto':
619     if config[config_arch] == 'apple':
620         # The [.] matches to the dot after the major version, "." would match any character
621         if re.search ("darwin[0-7][.]", config[config_kernel]) != None:
622             env['DIST_TARGET'] = 'panther'
623         else:
624             env['DIST_TARGET'] = 'tiger'
625     else:
626         if re.search ("x86_64", config[config_cpu]) != None:
627             env['DIST_TARGET'] = 'x86_64'
628         elif re.search("i[0-5]86", config[config_cpu]) != None:
629             env['DIST_TARGET'] = 'i386'
630         elif re.search("powerpc", config[config_cpu]) != None:
631             env['DIST_TARGET'] = 'powerpc'
632         else:
633             env['DIST_TARGET'] = 'i686'
634     print "\n*******************************"
635     print "detected DIST_TARGET = " + env['DIST_TARGET']
636     print "*******************************\n"
637
638
639 if config[config_cpu] == 'powerpc' and env['DIST_TARGET'] != 'none':
640     #
641     # Apple/PowerPC optimization options
642     #
643     # -mcpu=7450 does not reliably work with gcc 3.*
644     #
645     if env['DIST_TARGET'] == 'panther' or env['DIST_TARGET'] == 'tiger':
646         if config[config_arch] == 'apple':
647             ## opt_flags.extend ([ "-mcpu=7450", "-faltivec"])
648             # to support g3s but still have some optimization for above
649             opt_flags.extend ([ "-mcpu=G3", "-mtune=7450"])
650         else:
651             opt_flags.extend ([ "-mcpu=7400", "-maltivec", "-mabi=altivec"])
652     else:
653         opt_flags.extend([ "-mcpu=750", "-mmultiple" ])
654     opt_flags.extend (["-mhard-float", "-mpowerpc-gfxopt"])
655     opt_flags.extend (["-Os"])
656
657 elif ((re.search ("i[0-9]86", config[config_cpu]) != None) or (re.search ("x86_64", config[config_cpu]) != None)) and env['DIST_TARGET'] != 'none':
658     
659     build_host_supports_sse = 0
660     
661     debug_flags.append ("-DARCH_X86")
662     opt_flags.append ("-DARCH_X86")
663     
664     if config[config_kernel] == 'linux' :
665         
666         if env['DIST_TARGET'] != 'i386':
667             
668             flag_line = os.popen ("cat /proc/cpuinfo | grep '^flags'").read()[:-1]
669             x86_flags = flag_line.split (": ")[1:][0].split ()
670             
671             if "mmx" in x86_flags:
672                 opt_flags.append ("-mmmx")
673             if "sse" in x86_flags:
674                 build_host_supports_sse = 1
675             if "3dnow" in x86_flags:
676                 opt_flags.append ("-m3dnow")
677             
678             if config[config_cpu] == "i586":
679                 opt_flags.append ("-march=i586")
680             elif config[config_cpu] == "i686":
681                 opt_flags.append ("-march=i686")
682     
683     if ((env['DIST_TARGET'] == 'i686') or (env['DIST_TARGET'] == 'x86_64')) and build_host_supports_sse:
684         opt_flags.extend (["-msse", "-mfpmath=sse", "-DUSE_XMMINTRIN"])
685         debug_flags.extend (["-msse", "-mfpmath=sse", "-DUSE_XMMINTRIN"])
686 # end of processor-specific section
687
688 # optimization section
689 if env['FPU_OPTIMIZATION']:
690     if env['DIST_TARGET'] == 'tiger':
691         opt_flags.append ("-DBUILD_VECLIB_OPTIMIZATIONS")
692         debug_flags.append ("-DBUILD_VECLIB_OPTIMIZATIONS")
693         libraries['core'].Append(LINKFLAGS= '-framework Accelerate')
694     elif env['DIST_TARGET'] == 'i686' or env['DIST_TARGET'] == 'x86_64':
695         opt_flags.append ("-DBUILD_SSE_OPTIMIZATIONS")
696         debug_flags.append ("-DBUILD_SSE_OPTIMIZATIONS")
697         if env['DIST_TARGET'] == 'x86_64':
698             opt_flags.append ("-DUSE_X86_64_ASM")
699             debug_flags.append ("-DUSE_X86_64_ASM")
700         if build_host_supports_sse != 1:
701             print "\nWarning: you are building Ardour with SSE support even though your system does not support these instructions. (This may not be an error, especially if you are a package maintainer)"
702 # end optimization section
703
704 # handle x86/x86_64 libdir properly
705
706 if env['DIST_TARGET'] == 'x86_64':
707     env['LIBDIR']='lib64'
708 else:
709     env['LIBDIR']='lib'
710
711 #
712 # save off guessed arch element in an env
713 #
714 env.Append(CONFIG_ARCH=config[config_arch])
715
716
717 #
718 # ARCH="..." overrides all
719 #
720
721 if env['ARCH'] != '':
722     opt_flags = env['ARCH'].split()
723
724 #
725 # prepend boiler plate optimization flags
726 #
727
728 opt_flags[:0] = [
729     "-O3",
730     "-fomit-frame-pointer",
731     "-ffast-math",
732     "-fstrength-reduce",
733     "-pipe"
734     ]
735
736 if env['DEBUG'] == 1:
737     env.Append(CCFLAGS=" ".join (debug_flags))
738     env.Append(LINKFLAGS=" ".join (debug_flags))
739 else:
740     env.Append(CCFLAGS=" ".join (opt_flags))
741     env.Append(LINKFLAGS=" ".join (opt_flags))
742
743 if env['UNIVERSAL'] == 1:
744     env.Append(CCFLAGS="-arch i386 -arch ppc")
745     env.Append(LINKFLAGS="-arch i386 -arch ppc")
746
747 #
748 # warnings flags
749 #
750
751 env.Append(CCFLAGS="-Wall")
752 env.Append(CXXFLAGS="-Woverloaded-virtual")
753
754 if env['EXTRA_WARN']:
755     env.Append(CCFLAGS="-Wextra -pedantic -ansi")
756     env.Append(CXXFLAGS="-ansi")
757 #    env.Append(CFLAGS="-iso")
758
759 if env['LIBLO']:
760     env.Append(CCFLAGS="-DHAVE_LIBLO")
761
762
763 #
764 # fix scons nitpickiness on APPLE
765 #
766
767
768 def prep_libcheck(topenv, libinfo):
769     if topenv['DIST_TARGET'] == 'panther' or topenv['DIST_TARGET'] == 'tiger':
770         #
771         # rationale: GTK-Quartz uses jhbuild and installs to /opt/gtk by default.
772         #            All libraries needed should be built against this location
773         if topenv['GTKOSX']:
774                 libinfo.Append(CPPPATH="/opt/gtk/include", LIBPATH="/opt/gtk/lib")
775                 libinfo.Append(CXXFLAGS="-I/opt/gtk/include", LINKFLAGS="-L/opt/gtk/lib")
776         libinfo.Append(CPPPATH="/opt/local/include", LIBPATH="/opt/local/lib")
777         libinfo.Append(CXXFLAGS="-I/opt/local/include", LINKFLAGS="-L/opt/local/lib")
778
779 prep_libcheck(env, env)
780
781
782 libraries['vamp'] = LibraryInfo (LIBS='vampsdk',
783                                  LIBPATH='#libs/vamp-sdk',
784                                  CPPPATH='#libs/vamp-sdk/vamp')
785
786 env['RUBBERBAND'] = False
787
788 conf = Configure (env)
789
790 if conf.CheckHeader ('fftw3.h'):
791     env['RUBBERBAND'] = True
792     libraries['rubberband'] = LibraryInfo (LIBS='rubberband',
793                                            LIBPATH='#libs/rubberband',
794                                            CPPPATH='#libs/rubberband',
795                                            CCFLAGS='-DUSE_RUBBERBAND')
796 else:
797     print ""
798     print "-------------------------------------------------------------------------"
799     print "You do not have the FFTW single-precision development package installed."
800     print "This prevents Ardour from using the Rubberband library for timestretching"
801     print "and pitchshifting. It will fall back on SoundTouch for timestretch, and "
802     print "pitchshifting will not be available."
803     print "-------------------------------------------------------------------------"
804     print ""
805
806 conf.Finish()
807
808 #
809 # Check for libusb
810
811 libraries['usb'] = LibraryInfo ()
812 prep_libcheck(env, libraries['usb'])
813
814 conf = Configure (libraries['usb'])
815 if conf.CheckLib ('usb', 'usb_interrupt_write'):
816     have_libusb = True
817 else:
818     have_libusb = False
819
820 # check for linux/input.h while we're at it for powermate
821 if conf.CheckHeader('linux/input.h'):
822     have_linux_input = True
823 else:
824     have_linux_input = False
825
826 libraries['usb'] = conf.Finish ()
827
828 #
829 # Check for FLAC
830
831 libraries['flac'] = LibraryInfo ()
832 prep_libcheck(env, libraries['flac'])
833 libraries['flac'].Append(CPPPATH="/usr/local/include", LIBPATH="/usr/local/lib")
834
835 #
836 # june 1st 2007: look for a function that is in FLAC 1.1.2 and not in later versions
837 #                since the version of libsndfile we have internally does not support
838 #                the new API that libFLAC has adopted
839 #
840
841 conf = Configure (libraries['flac'])
842 if conf.CheckLib ('FLAC', 'FLAC__seekable_stream_decoder_init', language='CXX'):
843     conf.env.Append(CCFLAGS='-DHAVE_FLAC')
844     use_flac = True
845 else:
846     use_flac = False
847     
848 libraries['flac'] = conf.Finish ()
849
850 # or if that fails...
851 #libraries['flac']    = LibraryInfo (LIBS='FLAC')
852
853 # boost (we don't link against boost, just use some header files)
854
855 libraries['boost'] = LibraryInfo ()
856 prep_libcheck(env, libraries['boost'])
857 libraries['boost'].Append(CPPPATH="/usr/local/include", LIBPATH="/usr/local/lib")
858 conf = Configure (libraries['boost'])
859 if conf.CheckHeader ('boost/shared_ptr.hpp', language='CXX') == False:
860         print "Boost header files do not appear to be installed."
861         sys.exit (1)
862     
863 libraries['boost'] = conf.Finish ()
864
865 #
866 # Check for liblo
867
868 if env['LIBLO']:
869     libraries['lo'] = LibraryInfo ()
870     prep_libcheck(env, libraries['lo'])
871
872     conf = Configure (libraries['lo'])
873     if conf.CheckLib ('lo', 'lo_server_new') == False:
874         print "liblo does not appear to be installed."
875         sys.exit (1)
876     
877     libraries['lo'] = conf.Finish ()
878
879 #
880 # Check for dmalloc
881
882 libraries['dmalloc'] = LibraryInfo ()
883 prep_libcheck(env, libraries['dmalloc'])
884
885 #
886 # look for the threaded version
887 #
888
889 conf = Configure (libraries['dmalloc'])
890 if conf.CheckLib ('dmallocth', 'dmalloc_shutdown'):
891     have_libdmalloc = True
892 else:
893     have_libdmalloc = False
894
895 libraries['dmalloc'] = conf.Finish ()
896
897 #
898 # Audio/MIDI library (needed for MIDI, since audio is all handled via JACK)
899 #
900
901 conf = Configure(env)
902
903 if conf.CheckCHeader('alsa/asoundlib.h'):
904     libraries['sysmidi'] = LibraryInfo (LIBS='asound')
905     env['SYSMIDI'] = 'ALSA Sequencer'
906     subst_dict['%MIDITAG%'] = "seq"
907     subst_dict['%MIDITYPE%'] = "alsa/sequencer"
908 elif conf.CheckCHeader('/System/Library/Frameworks/CoreMIDI.framework/Headers/CoreMIDI.h'):
909     # this line is needed because scons can't handle -framework in ParseConfig() yet.
910     if env['GTKOSX']:
911         # We need Carbon as well as the rest
912         libraries['sysmidi'] = LibraryInfo (
913                 LINKFLAGS = ' -framework CoreMIDI -framework CoreFoundation -framework CoreAudio -framework CoreServices -framework AudioUnit -framework AudioToolbox -framework Carbon -bind_at_load' )
914     else:
915         libraries['sysmidi'] = LibraryInfo (
916                 LINKFLAGS = ' -framework CoreMIDI -framework CoreFoundation -framework CoreAudio -framework CoreServices -framework AudioUnit -framework AudioToolbox -bind_at_load' )
917     env['SYSMIDI'] = 'CoreMIDI'
918     subst_dict['%MIDITAG%'] = "ardour"
919     subst_dict['%MIDITYPE%'] = "coremidi"
920 else:
921     print "It appears you don't have the required MIDI libraries installed. For Linux this means you are missing the development package for ALSA libraries."
922     sys.exit (1)
923
924 env = conf.Finish()
925
926 if env['SYSLIBS']:
927
928     syslibdeps = \
929     {
930         'sigc++-2.0'           : '2.0',
931         'gtkmm-2.4'            : '2.8',
932         'libgnomecanvasmm-2.6' : '2.12.0'
933     }
934
935     conf = Configure(env, custom_tests = { 'CheckPKGConfig' : CheckPKGConfig,
936                     'CheckPKGVersion' : CheckPKGVersion })
937
938     for pkg, version in syslibdeps.iteritems():
939         if not conf.CheckPKGVersion( pkg, version ):
940             print '%s >= %s not found.' %(pkg, version)
941             DependenciesRequiredMessage()
942             Exit(1)
943     
944     env = conf.Finish()
945     
946     libraries['sigc2'] = LibraryInfo()
947     libraries['sigc2'].ParseConfig('pkg-config --cflags --libs sigc++-2.0')
948     libraries['glibmm2'] = LibraryInfo()
949     libraries['glibmm2'].ParseConfig('pkg-config --cflags --libs glibmm-2.4')
950     libraries['cairomm'] = LibraryInfo()
951     libraries['cairomm'].ParseConfig('pkg-config --cflags --libs cairomm-1.0')
952     libraries['gdkmm2'] = LibraryInfo()
953     libraries['gdkmm2'].ParseConfig ('pkg-config --cflags --libs gdkmm-2.4')
954     libraries['gtkmm2'] = LibraryInfo()
955     libraries['gtkmm2'].ParseConfig ('pkg-config --cflags --libs gtkmm-2.4')
956     libraries['atkmm'] = LibraryInfo()
957     libraries['atkmm'].ParseConfig ('pkg-config --cflags --libs atkmm-1.6')
958     libraries['pangomm'] = LibraryInfo()
959     libraries['pangomm'].ParseConfig ('pkg-config --cflags --libs pangomm-1.4')
960     libraries['libgnomecanvasmm'] = LibraryInfo()
961     libraries['libgnomecanvasmm'].ParseConfig ('pkg-config --cflags --libs libgnomecanvasmm-2.6')
962
963 #
964 # cannot use system one for the time being
965 #
966     
967     libraries['sndfile-ardour'] = LibraryInfo(LIBS='libsndfile-ardour',
968                                     LIBPATH='#libs/libsndfile',
969                                     CPPPATH=['#libs/libsndfile/src'])
970
971 #    libraries['libglademm'] = LibraryInfo()
972 #    libraries['libglademm'].ParseConfig ('pkg-config --cflags --libs libglademm-2.4')
973
974 #    libraries['flowcanvas'] = LibraryInfo(LIBS='flowcanvas', LIBPATH='#/libs/flowcanvas', CPPPATH='#libs/flowcanvas')
975     libraries['soundtouch'] = LibraryInfo()
976     #libraries['soundtouch'].ParseConfig ('pkg-config --cflags --libs soundtouch-1.0')
977     # Comment the previous line and uncomment this for Debian:
978     libraries['soundtouch'].ParseConfig ('pkg-config --cflags --libs libSoundTouch')
979
980     libraries['appleutility'] = LibraryInfo(LIBS='libappleutility',
981                                             LIBPATH='#libs/appleutility',
982                                             CPPPATH='#libs/appleutility')
983     
984     coredirs = [
985         'templates'
986     ]
987     
988     subdirs = [
989         'libs/libsndfile',
990         'libs/pbd',
991         'libs/midi++2',
992         'libs/ardour',
993         'libs/vamp-sdk',
994     # these are unconditionally included but have
995     # tests internally to avoid compilation etc
996     # if VST is not set
997         'libs/fst',
998         'vst',
999     # this is unconditionally included but has
1000     # tests internally to avoid compilation etc
1001     # if COREAUDIO is not set
1002         'libs/appleutility'
1003         ]
1004     
1005     gtk_subdirs = [
1006 #        'libs/flowcanvas',
1007         'libs/gtkmm2ext',
1008         'gtk2_ardour',
1009         'libs/clearlooks'
1010         ]
1011
1012 else:
1013     libraries['sigc2'] = LibraryInfo(LIBS='sigc++2',
1014                                     LIBPATH='#libs/sigc++2',
1015                                     CPPPATH='#libs/sigc++2')
1016     libraries['glibmm2'] = LibraryInfo(LIBS='glibmm2',
1017                                     LIBPATH='#libs/glibmm2',
1018                                     CPPPATH='#libs/glibmm2')
1019     libraries['pangomm'] = LibraryInfo(LIBS='pangomm',
1020                                     LIBPATH='#libs/gtkmm2/pango',
1021                                     CPPPATH='#libs/gtkmm2/pango')
1022     libraries['atkmm'] = LibraryInfo(LIBS='atkmm',
1023                                      LIBPATH='#libs/gtkmm2/atk',
1024                                      CPPPATH='#libs/gtkmm2/atk')
1025     libraries['gdkmm2'] = LibraryInfo(LIBS='gdkmm2',
1026                                       LIBPATH='#libs/gtkmm2/gdk',
1027                                       CPPPATH='#libs/gtkmm2/gdk')
1028     libraries['gtkmm2'] = LibraryInfo(LIBS='gtkmm2',
1029                                      LIBPATH="#libs/gtkmm2/gtk",
1030                                      CPPPATH='#libs/gtkmm2/gtk/')
1031     libraries['libgnomecanvasmm'] = LibraryInfo(LIBS='libgnomecanvasmm',
1032                                                 LIBPATH='#libs/libgnomecanvasmm',
1033                                                 CPPPATH='#libs/libgnomecanvasmm')
1034     
1035     libraries['soundtouch'] = LibraryInfo(LIBS='soundtouch',
1036                                           LIBPATH='#libs/soundtouch',
1037                                           CPPPATH=['#libs', '#libs/soundtouch'])
1038     libraries['sndfile-ardour'] = LibraryInfo(LIBS='libsndfile-ardour',
1039                                     LIBPATH='#libs/libsndfile',
1040                                     CPPPATH=['#libs/libsndfile', '#libs/libsndfile/src'])
1041 #    libraries['libglademm'] = LibraryInfo(LIBS='libglademm',
1042 #                                          LIBPATH='#libs/libglademm',
1043 #                                          CPPPATH='#libs/libglademm')
1044     libraries['appleutility'] = LibraryInfo(LIBS='libappleutility',
1045                                             LIBPATH='#libs/appleutility',
1046                                             CPPPATH='#libs/appleutility')
1047
1048     coredirs = [
1049         'templates'
1050     ]
1051     
1052     subdirs = [
1053         'libs/sigc++2',
1054         'libs/libsndfile',
1055         'libs/pbd',
1056         'libs/midi++2',
1057         'libs/ardour',
1058         'libs/vamp-sdk',
1059     # these are unconditionally included but have
1060     # tests internally to avoid compilation etc
1061     # if VST is not set
1062         'libs/fst',
1063         'vst',
1064     # this is unconditionally included but has
1065     # tests internally to avoid compilation etc
1066     # if COREAUDIO is not set
1067         'libs/appleutility'
1068         ]
1069     
1070     gtk_subdirs = [
1071         'libs/glibmm2',
1072         'libs/gtkmm2/pango',
1073         'libs/gtkmm2/atk',
1074         'libs/gtkmm2/gdk',
1075         'libs/gtkmm2/gtk',
1076         'libs/libgnomecanvasmm',
1077         'libs/gtkmm2ext',
1078         'gtk2_ardour',
1079         'libs/clearlooks'
1080         ]
1081
1082 #
1083 # * always build the LGPL control protocol lib, since we link against it from libardour
1084 # * ditto for generic MIDI
1085 # * tranzport checks whether it should build internally, but we need here so that
1086 #   its included in the tarball
1087 #
1088
1089 surface_subdirs = [ 'libs/surfaces/control_protocol',
1090                     'libs/surfaces/generic_midi',
1091                     'libs/surfaces/tranzport',
1092                     'libs/surfaces/mackie',
1093                     'libs/surfaces/powermate'
1094                     ]
1095
1096 if env['SURFACES']:
1097     if have_libusb:
1098         env['TRANZPORT'] = 1
1099     else:
1100         env['TRANZPORT'] = 0
1101         print 'Disabled building Tranzport code because libusb could not be found'
1102
1103     if have_linux_input:
1104         env['POWERMATE'] = 1
1105     else:
1106         env['POWERMATE'] = 0
1107         print 'Disabled building Powermate code because linux/input.h could not be found'
1108
1109     if os.access ('libs/surfaces/sony9pin', os.F_OK):
1110         surface_subdirs += [ 'libs/surfaces/sony9pin' ]
1111 else:
1112     env['POWERMATE'] = 0
1113     env['TRANZPORT'] = 0
1114
1115 #
1116 # timestretch libraries
1117 #
1118
1119 timefx_subdirs = ['libs/soundtouch']
1120 if env['RUBBERBAND']:
1121     timefx_subdirs += ['libs/rubberband']
1122
1123 opts.Save('scache.conf', env)
1124 Help(opts.GenerateHelpText(env))
1125
1126 final_prefix = '$PREFIX'
1127
1128 if env['DESTDIR'] :
1129     install_prefix = '$DESTDIR/$PREFIX'
1130 else:
1131     install_prefix = env['PREFIX']
1132
1133 subst_dict['%INSTALL_PREFIX%'] = install_prefix;
1134 subst_dict['%FINAL_PREFIX%'] = final_prefix;
1135 subst_dict['%PREFIX%'] = final_prefix;
1136
1137 if env['PREFIX'] == '/usr':
1138     final_config_prefix = '/etc'
1139 else:
1140     final_config_prefix = env['PREFIX'] + '/etc'
1141
1142 config_prefix = '$DESTDIR' + final_config_prefix
1143
1144 #
1145 # everybody needs this
1146 #
1147
1148 env.Merge ([ libraries['core'] ])
1149
1150
1151 #
1152 # i18n support
1153 #
1154
1155 conf = Configure (env)
1156 if env['NLS']:
1157     nls_error = 'This system is not configured for internationalized applications.  An english-only version will be built:'
1158     print 'Checking for internationalization support ...'
1159     have_gettext = conf.TryAction(Action('xgettext --version'))
1160     if have_gettext[0] != 1:
1161         nls_error += ' No xgettext command.'
1162         env['NLS'] = 0
1163     else:
1164         print "Found xgettext"
1165     
1166     have_msgmerge = conf.TryAction(Action('msgmerge --version'))
1167     if have_msgmerge[0] != 1:
1168         nls_error += ' No msgmerge command.'
1169         env['NLS'] = 0
1170     else:
1171         print "Found msgmerge"
1172     
1173     if not conf.CheckCHeader('libintl.h'):
1174         nls_error += ' No libintl.h.'
1175         env['NLS'] = 0
1176         
1177     if env['NLS'] == 0:
1178         print nls_error
1179     else:
1180         print "International version will be built."
1181 env = conf.Finish()
1182
1183 if env['NLS'] == 1:
1184     env.Append(CCFLAGS="-DENABLE_NLS")
1185
1186 Export('env install_prefix final_prefix config_prefix final_config_prefix libraries i18n ardour_version subst_dict use_flac')
1187
1188 #
1189 # the configuration file may be system dependent
1190 #
1191
1192 conf = env.Configure ()
1193
1194 if conf.CheckCHeader('/System/Library/Frameworks/CoreAudio.framework/Versions/A/Headers/CoreAudio.h'):
1195     subst_dict['%JACK_INPUT%'] = "coreaudio:Built-in Audio:in"
1196     subst_dict['%JACK_OUTPUT%'] = "coreaudio:Built-in Audio:out"
1197 else:
1198     subst_dict['%JACK_INPUT%'] = "alsa_pcm:playback_"
1199     subst_dict['%JACK_OUTPUT%'] = "alsa_pcm:capture_"
1200
1201 # posix_memalign available
1202 if not conf.CheckFunc('posix_memalign'):
1203     print 'Did not find posix_memalign(), using malloc'
1204     env.Append(CCFLAGS='-DNO_POSIX_MEMALIGN')
1205
1206
1207 env = conf.Finish()
1208
1209 # generate the per-user and system rc files from the same source
1210
1211 sysrcbuild = env.SubstInFile ('ardour_system.rc','ardour.rc.in', SUBST_DICT = subst_dict)
1212
1213 # add to the substitution dictionary
1214
1215 subst_dict['%VERSION%'] = ardour_version[0:3]
1216 subst_dict['%EXTRA_VERSION%'] = ardour_version[3:]
1217 subst_dict['%REVISION_STRING%'] = ''
1218 if os.path.exists('.svn'):
1219     subst_dict['%REVISION_STRING%'] = '.' + fetch_svn_revision ('.') + 'svn'
1220
1221 # specbuild = env.SubstInFile ('ardour.spec','ardour.spec.in', SUBST_DICT = subst_dict)
1222
1223 the_revision = env.Command ('frobnicatory_decoy', [], create_stored_revision)
1224 remove_ardour = env.Command ('frobnicatory_decoy2', [],
1225                              [ Delete ('$PREFIX/etc/ardour2'),
1226                                Delete ('$PREFIX/lib/ardour2'),
1227                                Delete ('$PREFIX/bin/ardour2')])
1228
1229 env.Alias('revision', the_revision)
1230 env.Alias('install', env.Install(os.path.join(config_prefix, 'ardour2'), 'ardour_system.rc'))
1231 env.Alias('uninstall', remove_ardour)
1232
1233 Default (sysrcbuild)
1234
1235 # source tarball
1236
1237 Precious (env['DISTTREE'])
1238
1239 env.Distribute (env['DISTTREE'],
1240                [ 'SConstruct', 'svn_revision.h',
1241                   'COPYING', 'PACKAGER_README', 'README',
1242                   'ardour.rc.in',
1243                   'tools/config.guess',
1244                   'icons/icon/ardour_icon_mac_mask.png',
1245                   'icons/icon/ardour_icon_mac.png',
1246                   'icons/icon/ardour_icon_tango_16px_blue.png',
1247                   'icons/icon/ardour_icon_tango_16px_red.png',
1248                   'icons/icon/ardour_icon_tango_22px_blue.png',
1249                   'icons/icon/ardour_icon_tango_22px_red.png',
1250                   'icons/icon/ardour_icon_tango_32px_blue.png',
1251                   'icons/icon/ardour_icon_tango_32px_red.png',
1252                   'icons/icon/ardour_icon_tango_48px_blue.png',
1253                   'icons/icon/ardour_icon_tango_48px_red.png'
1254                   ] +
1255                 glob.glob ('DOCUMENTATION/AUTHORS*') +
1256                 glob.glob ('DOCUMENTATION/CONTRIBUTORS*') +
1257                 glob.glob ('DOCUMENTATION/TRANSLATORS*') +
1258                 glob.glob ('DOCUMENTATION/BUILD*') +
1259                 glob.glob ('DOCUMENTATION/FAQ*') +
1260                 glob.glob ('DOCUMENTATION/README*')
1261                 )
1262
1263 srcdist = env.Tarball(env['TARBALL'], [ env['DISTTREE'], the_revision ])
1264 env.Alias ('srctar', srcdist)
1265
1266 #
1267 # don't leave the distree around
1268 #
1269
1270 env.AddPreAction (env['DISTTREE'], Action ('rm -rf ' + str (File (env['DISTTREE']))))
1271 env.AddPostAction (srcdist, Action ('rm -rf ' + str (File (env['DISTTREE']))))
1272
1273 #
1274 # the subdirs
1275 #
1276
1277 for subdir in coredirs:
1278     SConscript (subdir + '/SConscript')
1279
1280 for sublistdir in [ subdirs, timefx_subdirs, gtk_subdirs, surface_subdirs ]:
1281     for subdir in sublistdir:
1282         SConscript (subdir + '/SConscript')
1283
1284 # cleanup
1285 env.Clean ('scrub', [ 'scache.conf', '.sconf_temp', '.sconsign.dblite', 'config.log'])
1286