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