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