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