use filechooser widget in export dialog, selected files set format combos, hide progr...
[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 = '3.0'
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('CMT', 'Compile with support for CMT Additions', 1),
32     BoolOption('COREAUDIO', 'Compile with Apple\'s CoreAudio library', 0),
33     BoolOption('GTKOSX', 'Compile for use with GTK-OSX, not GTK-X11', 0),
34     BoolOption('DEBUG', 'Set to build with debugging information and no optimizations', 1),
35     PathOption('DESTDIR', 'Set the intermediate install "prefix"', '/'),
36     EnumOption('DIST_TARGET', 'Build target for cross compiling packagers', 'auto', allowed_values=('auto', 'i386', 'i686', 'x86_64', 'powerpc', 'tiger', 'panther', 'none' ), ignorecase=2),
37     BoolOption('DMALLOC', 'Compile and link using the dmalloc library', 0),
38     BoolOption('EXTRA_WARN', 'Compile with -Wextra, -ansi, and -pedantic.  Might break compilation.  For pedants', 0),
39     BoolOption('FFT_ANALYSIS', 'Include FFT analysis window', 0),
40     BoolOption('FPU_OPTIMIZATION', 'Build runtime checked assembler code', 1),
41     BoolOption('GPROFILE', 'Compile with support for gprofile (Developers only)', 0),
42     BoolOption('LIBLO', 'Compile with support for liblo library', 1),
43     BoolOption('NLS', 'Set to turn on i18n support', 1),
44     PathOption('PREFIX', 'Set the install "prefix"', '/usr/local'),
45     BoolOption('SURFACES', 'Build support for control surfaces', 1),
46     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),
47     BoolOption('TRANZPORT', 'Compile with support for Frontier Designs (if libusb is available)', 1),
48     BoolOption('UNIVERSAL', 'Compile as universal binary.  Requires that external libraries are already universal.', 0),
49     BoolOption('VERSIONED', 'Add revision information to ardour/gtk executable name inside the build directory', 0),
50     BoolOption('VST', 'Compile with support for VST', 0),
51 )
52
53 #----------------------------------------------------------------------
54 # a handy helper that provides a way to merge compile/link information
55 # from multiple different "environments"
56 #----------------------------------------------------------------------
57 #
58 class LibraryInfo(Environment):
59     def __init__(self,*args,**kw):
60         Environment.__init__ (self,*args,**kw)
61     
62     def Merge (self,others):
63         for other in others:
64             self.Append (LIBS = other.get ('LIBS',[]))
65             self.Append (LIBPATH = other.get ('LIBPATH', []))
66             self.Append (CPPPATH = other.get('CPPPATH', []))
67             self.Append (LINKFLAGS = other.get('LINKFLAGS', []))
68         self.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.105.0',
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 conf = Configure(env, custom_tests = { 'CheckPKGConfig' : CheckPKGConfig,
439                                        'CheckPKGVersion' : CheckPKGVersion })
440
441 # I think a more recent version is needed on win32
442 min_pkg_config_version = '0.8.0'
443
444 if not conf.CheckPKGConfig(min_pkg_config_version):
445      print 'pkg-config >= %s not found.' % min_pkg_config_version
446      Exit(1)
447
448 for pkg, version in deps.iteritems():
449         if not conf.CheckPKGVersion( pkg, version ):
450                 print '%s >= %s not found.' %(pkg, version)
451                 DependenciesRequiredMessage()
452                 Exit(1)
453
454 env = conf.Finish()
455
456 # ----------------------------------------------------------------------
457 # Construction environment setup
458 # ----------------------------------------------------------------------
459
460 libraries = { }
461
462 libraries['core'] = LibraryInfo (CCFLAGS = '-Ilibs')
463
464 #libraries['sndfile'] = LibraryInfo()
465 #libraries['sndfile'].ParseConfig('pkg-config --cflags --libs sndfile')
466
467 libraries['lrdf'] = LibraryInfo()
468 libraries['lrdf'].ParseConfig('pkg-config --cflags --libs lrdf')
469
470 libraries['raptor'] = LibraryInfo()
471 libraries['raptor'].ParseConfig('pkg-config --cflags --libs raptor')
472
473 libraries['samplerate'] = LibraryInfo()
474 libraries['samplerate'].ParseConfig('pkg-config --cflags --libs samplerate')
475
476 if env['FFT_ANALYSIS']:
477         libraries['fftw3f'] = LibraryInfo()
478         libraries['fftw3f'].ParseConfig('pkg-config --cflags --libs fftw3f')
479         #
480         # Check for fftw3 header as well as the library
481         conf = Configure (libraries['fftw3f'])
482         if conf.CheckHeader ('fftw3.h') == False:
483                 print "FFT Analysis cannot be compiled without the FFTW3 headers, which don't seem to be installed"
484                 sys.exit (1)
485         libraries['fftw3f'] = conf.Finish();
486
487 libraries['jack'] = LibraryInfo()
488 libraries['jack'].ParseConfig('pkg-config --cflags --libs jack')
489
490 libraries['xml'] = LibraryInfo()
491 libraries['xml'].ParseConfig('pkg-config --cflags --libs libxml-2.0')
492
493 libraries['xslt'] = LibraryInfo()
494 libraries['xslt'].ParseConfig('pkg-config --cflags --libs libxslt')
495
496 libraries['glib2'] = LibraryInfo()
497 libraries['glib2'].ParseConfig ('pkg-config --cflags --libs glib-2.0')
498 libraries['glib2'].ParseConfig ('pkg-config --cflags --libs gobject-2.0')
499 libraries['glib2'].ParseConfig ('pkg-config --cflags --libs gmodule-2.0')
500 libraries['glib2'].ParseConfig ('pkg-config --cflags --libs gthread-2.0')
501
502 libraries['gtk2'] = LibraryInfo()
503 libraries['gtk2'].ParseConfig ('pkg-config --cflags --libs gtk+-2.0')
504
505 libraries['pango'] = LibraryInfo()
506 libraries['pango'].ParseConfig ('pkg-config --cflags --libs pango')
507
508 libraries['libgnomecanvas2'] = LibraryInfo()
509 libraries['libgnomecanvas2'].ParseConfig ('pkg-config --cflags --libs libgnomecanvas-2.0')
510
511 #libraries['flowcanvas'] = LibraryInfo(LIBS='flowcanvas', LIBPATH='#/libs/flowcanvas', CPPPATH='#libs/flowcanvas')
512
513 # The Ardour Control Protocol Library
514
515 libraries['ardour_cp'] = LibraryInfo (LIBS='ardour_cp', LIBPATH='#libs/surfaces/control_protocol',
516                                       CPPPATH='#libs/surfaces/control_protocol')
517
518 # The Ardour backend/engine
519
520 libraries['ardour'] = LibraryInfo (LIBS='ardour', LIBPATH='#libs/ardour', CPPPATH='#libs/ardour')
521 libraries['midi++2'] = LibraryInfo (LIBS='midi++', LIBPATH='#libs/midi++2', CPPPATH='#libs/midi++2')
522 libraries['pbd']    = LibraryInfo (LIBS='pbd', LIBPATH='#libs/pbd', CPPPATH='#libs/pbd')
523 libraries['gtkmm2ext'] = LibraryInfo (LIBS='gtkmm2ext', LIBPATH='#libs/gtkmm2ext', CPPPATH='#libs/gtkmm2ext')
524
525
526 # SCons should really do this for us
527
528 conf = Configure (env)
529
530 have_cxx = conf.TryAction (Action (str(env['CXX']) + ' --version'))
531 if have_cxx[0] != 1:
532     print "This system has no functional C++ compiler. You cannot build Ardour from source without one."
533     sys.exit (1)
534 else:
535     print "Congratulations, you have a functioning C++ compiler."
536
537 env = conf.Finish()
538
539
540 #
541 # Compiler flags and other system-dependent stuff
542 #
543
544 opt_flags = []
545 if env['GPROFILE'] == 1:
546     debug_flags = [ '-O0', '-g', '-pg' ]
547 else:
548     debug_flags = [ '-O0', '-g' ]
549
550 # guess at the platform, used to define compiler flags
551
552 config_guess = os.popen("tools/config.guess").read()[:-1]
553
554 config_cpu = 0
555 config_arch = 1
556 config_kernel = 2
557 config_os = 3
558 config = config_guess.split ("-")
559
560 print "system triple: " + config_guess
561
562 # Autodetect
563 if env['DIST_TARGET'] == 'auto':
564     if config[config_arch] == 'apple':
565         # The [.] matches to the dot after the major version, "." would match any character
566         if re.search ("darwin[0-7][.]", config[config_kernel]) != None:
567             env['DIST_TARGET'] = 'panther'
568         else:
569             env['DIST_TARGET'] = 'tiger'
570     else:
571         if re.search ("x86_64", config[config_cpu]) != None:
572             env['DIST_TARGET'] = 'x86_64'
573         elif re.search("i[0-5]86", config[config_cpu]) != None:
574             env['DIST_TARGET'] = 'i386'
575         elif re.search("powerpc", config[config_cpu]) != None:
576             env['DIST_TARGET'] = 'powerpc'
577         else:
578             env['DIST_TARGET'] = 'i686'
579     print "\n*******************************"
580     print "detected DIST_TARGET = " + env['DIST_TARGET']
581     print "*******************************\n"
582
583
584 if config[config_cpu] == 'powerpc' and env['DIST_TARGET'] != 'none':
585     #
586     # Apple/PowerPC optimization options
587     #
588     # -mcpu=7450 does not reliably work with gcc 3.*
589     #
590     if env['DIST_TARGET'] == 'panther' or env['DIST_TARGET'] == 'tiger':
591         if config[config_arch] == 'apple':
592             ## opt_flags.extend ([ "-mcpu=7450", "-faltivec"])
593             # to support g3s but still have some optimization for above
594             opt_flags.extend ([ "-mcpu=G3", "-mtune=7450"])
595         else:
596             opt_flags.extend ([ "-mcpu=7400", "-maltivec", "-mabi=altivec"])
597     else:
598         opt_flags.extend([ "-mcpu=750", "-mmultiple" ])
599     opt_flags.extend (["-mhard-float", "-mpowerpc-gfxopt"])
600     opt_flags.extend (["-Os"])
601
602 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':
603     
604     build_host_supports_sse = 0
605     
606     debug_flags.append ("-DARCH_X86")
607     opt_flags.append ("-DARCH_X86")
608     
609     if config[config_kernel] == 'linux' :
610         
611         if env['DIST_TARGET'] != 'i386':
612             
613             flag_line = os.popen ("cat /proc/cpuinfo | grep '^flags'").read()[:-1]
614             x86_flags = flag_line.split (": ")[1:][0].split ()
615             
616             if "mmx" in x86_flags:
617                 opt_flags.append ("-mmmx")
618             if "sse" in x86_flags:
619                 build_host_supports_sse = 1
620             if "3dnow" in x86_flags:
621                 opt_flags.append ("-m3dnow")
622             
623             if config[config_cpu] == "i586":
624                 opt_flags.append ("-march=i586")
625             elif config[config_cpu] == "i686":
626                 opt_flags.append ("-march=i686")
627     
628     if ((env['DIST_TARGET'] == 'i686') or (env['DIST_TARGET'] == 'x86_64')) and build_host_supports_sse:
629         opt_flags.extend (["-msse", "-mfpmath=sse", "-DUSE_XMMINTRIN"])
630         debug_flags.extend (["-msse", "-mfpmath=sse", "-DUSE_XMMINTRIN"])
631 # end of processor-specific section
632
633 # optimization section
634 if env['FPU_OPTIMIZATION']:
635     if env['DIST_TARGET'] == 'tiger':
636         opt_flags.append ("-DBUILD_VECLIB_OPTIMIZATIONS")
637         debug_flags.append ("-DBUILD_VECLIB_OPTIMIZATIONS")
638         libraries['core'].Append(LINKFLAGS= '-framework Accelerate')
639     elif env['DIST_TARGET'] == 'i686' or env['DIST_TARGET'] == 'x86_64':
640         opt_flags.append ("-DBUILD_SSE_OPTIMIZATIONS")
641         debug_flags.append ("-DBUILD_SSE_OPTIMIZATIONS")
642         if env['DIST_TARGET'] == 'x86_64':
643             opt_flags.append ("-DUSE_X86_64_ASM")
644             debug_flags.append ("-DUSE_X86_64_ASM")
645         if build_host_supports_sse != 1:
646             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)"
647 # end optimization section
648
649 # handle x86/x86_64 libdir properly
650
651 if env['DIST_TARGET'] == 'x86_64':
652     env['LIBDIR']='lib64'
653 else:
654     env['LIBDIR']='lib'
655
656 #
657 # save off guessed arch element in an env
658 #
659 env.Append(CONFIG_ARCH=config[config_arch])
660
661
662 #
663 # ARCH="..." overrides all
664 #
665
666 if env['ARCH'] != '':
667     opt_flags = env['ARCH'].split()
668
669 #
670 # prepend boiler plate optimization flags
671 #
672
673 opt_flags[:0] = [
674     "-O3",
675     "-fomit-frame-pointer",
676     "-ffast-math",
677     "-fstrength-reduce",
678     "-pipe"
679     ]
680
681 if env['DEBUG'] == 1:
682     env.Append(CCFLAGS=" ".join (debug_flags))
683     env.Append(LINKFLAGS=" ".join (debug_flags))
684 else:
685     env.Append(CCFLAGS=" ".join (opt_flags))
686     env.Append(LINKFLAGS=" ".join (opt_flags))
687
688 if env['UNIVERSAL'] == 1:
689     env.Append(CCFLAGS="-arch i386 -arch ppc")
690     env.Append(LINKFLAGS="-arch i386 -arch ppc")
691
692 #
693 # warnings flags
694 #
695
696 env.Append(CCFLAGS="-Wall")
697 env.Append(CXXFLAGS="-Woverloaded-virtual")
698
699 if env['EXTRA_WARN']:
700     env.Append(CCFLAGS="-Wextra -pedantic -ansi")
701     env.Append(CXXFLAGS="-ansi")
702 #    env.Append(CFLAGS="-iso")
703
704 if env['LIBLO']:
705     env.Append(CCFLAGS="-DHAVE_LIBLO")
706
707
708 #
709 # fix scons nitpickiness on APPLE
710 #
711
712
713 def prep_libcheck(topenv, libinfo):
714     if topenv['DIST_TARGET'] == 'panther' or topenv['DIST_TARGET'] == 'tiger':
715         #
716         # rationale: GTK-Quartz uses jhbuild and installs to /opt/gtk by default.
717         #            All libraries needed should be built against this location
718         if topenv['GTKOSX']:
719             libinfo.Append(CCFLAGS="-I/opt/gtk/include", LINKFLAGS="-L/opt/gtk/lib")
720         libinfo.Append(CCFLAGS="-I/opt/local/include", LINKFLAGS="-L/opt/local/lib")
721             
722 prep_libcheck(env, env)
723
724 #
725 # glibc backtrace API, needed everywhere if we want to do shared_ptr<T> debugging
726 #
727
728 conf = Configure (env)
729 if conf.CheckCHeader('execinfo.h'):
730     conf.env.Append(CXXFLAGS="-DHAVE_EXECINFO")
731 env = conf.Finish ()
732
733 #
734 # Check for libusb
735
736 libraries['usb'] = LibraryInfo ()
737 prep_libcheck(env, libraries['usb'])
738
739 conf = Configure (libraries['usb'])
740 if conf.CheckLib ('usb', 'usb_interrupt_write'):
741     have_libusb = True
742 else:
743     have_libusb = False
744
745 # check for linux/input.h while we're at it for powermate
746 if conf.CheckHeader('linux/input.h'):
747     have_linux_input = True
748 else:
749     have_linux_input = False
750
751 libraries['usb'] = conf.Finish ()
752
753 #
754 # Check for FLAC
755
756 libraries['flac'] = LibraryInfo ()
757 prep_libcheck(env, libraries['flac'])
758 libraries['flac'].Append(CCFLAGS="-I/usr/local/include", LINKFLAGS="-L/usr/local/lib")
759
760 #
761 # june 1st 2007: look for a function that is in FLAC 1.1.2 and not in later versions
762 #                since the version of libsndfile we have internally does not support
763 #                the new API that libFLAC has adopted
764 #
765
766 conf = Configure (libraries['flac'])
767 if conf.CheckLib ('FLAC', 'FLAC__seekable_stream_decoder_set_read_callback', language='CXX'):
768     conf.env.Append(CCFLAGS='-DHAVE_FLAC')
769     use_flac = True
770 else:
771     use_flac = False
772 libraries['flac'] = conf.Finish ()
773 # or if that fails...
774 #libraries['flac']    = LibraryInfo (LIBS='FLAC')
775
776 # boost (we don't link against boost, just use some header files)
777
778 libraries['boost'] = LibraryInfo ()
779 prep_libcheck(env, libraries['boost'])
780 libraries['boost'].Append(CCFLAGS="-I/usr/local/include", LINKFLAGS="-L/usr/local/lib")
781 conf = Configure (libraries['boost'])
782 if conf.CheckHeader ('boost/shared_ptr.hpp', language='CXX') == False:
783         print "Boost header files do not appear to be installed."
784         sys.exit (1)
785     
786 libraries['boost'] = conf.Finish ()
787
788 #
789 # Check for liblo
790
791 if env['LIBLO']:
792     libraries['lo'] = LibraryInfo ()
793     prep_libcheck(env, libraries['lo'])
794
795     conf = Configure (libraries['lo'])
796     if conf.CheckLib ('lo', 'lo_server_new') == False:
797         print "liblo does not appear to be installed."
798         sys.exit (1)
799     
800     libraries['lo'] = conf.Finish ()
801
802 #
803 # Check for dmalloc
804
805 libraries['dmalloc'] = LibraryInfo ()
806 prep_libcheck(env, libraries['dmalloc'])
807
808 #
809 # look for the threaded version
810 #
811
812 conf = Configure (libraries['dmalloc'])
813 if conf.CheckLib ('dmallocth', 'dmalloc_shutdown'):
814     have_libdmalloc = True
815 else:
816     have_libdmalloc = False
817
818 libraries['dmalloc'] = conf.Finish ()
819
820 #
821 # Audio/MIDI library (needed for MIDI, since audio is all handled via JACK. Note, however, that
822 #                     we still need ALSA & CoreAudio to discover audio devices for the engine
823 #                     dialog, regardless of what MIDI subsystem is being used)
824 #
825
826 conf = Configure(env)
827
828 if conf.CheckCHeader('alsa/asoundlib.h'):
829     libraries['sysaudio'] = LibraryInfo (LIBS='asound')
830 elif conf.CheckCHeader('/System/Library/Frameworks/CoreAudio.framework/Versions/A/Headers/CoreAudio.h'):
831     libraries['sysaudio'] = LibraryInfo (LINKFLAGS= '-framework CoreMIDI -framework CoreFoundation -framework CoreAudio -framework CoreServices -framework AudioUnit -framework AudioToolbox -bind_at_load')
832
833 if conf.CheckCHeader('jack/midiport.h'):
834     libraries['sysmidi'] = LibraryInfo (LIBS='jack')
835     env['SYSMIDI'] = 'JACK MIDI'
836     subst_dict['%MIDITAG%'] = "control"
837     subst_dict['%MIDITYPE%'] = "jack"
838     print "Using JACK MIDI"
839 elif conf.CheckCHeader('alsa/asoundlib.h'):
840     libraries['sysmidi'] = LibraryInfo (LIBS='asound')
841     env['SYSMIDI'] = 'ALSA Sequencer'
842     subst_dict['%MIDITAG%'] = "seq"
843     subst_dict['%MIDITYPE%'] = "alsa/sequencer"
844     print "Using ALSA MIDI"
845 elif conf.CheckCHeader('/System/Library/Frameworks/CoreMIDI.framework/Headers/CoreMIDI.h'):
846     # this line is needed because scons can't handle -framework in ParseConfig() yet.
847     if env['GTKOSX']:
848         # We need Carbon as well as the rest
849         libraries['sysmidi'] = LibraryInfo (
850                LINKFLAGS = ' -framework CoreMIDI -framework CoreFoundation -framework CoreAudio -framework CoreServices -framework AudioUnit -framework AudioToolbox -framework Carbon -bind_at_load' )
851     else:
852         libraries['sysmidi'] = LibraryInfo (
853                 LINKFLAGS = ' -framework CoreMIDI -framework CoreFoundation -framework CoreAudio -framework CoreServices -framework AudioUnit -framework AudioToolbox -bind_at_load' )
854     env['SYSMIDI'] = 'CoreMIDI'
855     subst_dict['%MIDITAG%'] = "ardour"
856     subst_dict['%MIDITYPE%'] = "coremidi"
857     print "Using CoreMIDI"
858 else:
859     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."
860     sys.exit (1)
861
862 env = conf.Finish()
863
864 if env['SYSLIBS']:
865
866     syslibdeps = \
867     {
868         'sigc++-2.0'           : '2.0',
869         'gtkmm-2.4'            : '2.8',
870         'libgnomecanvasmm-2.6' : '2.12.0'
871     }
872
873     conf = Configure(env, custom_tests = { 'CheckPKGConfig' : CheckPKGConfig,
874                     'CheckPKGVersion' : CheckPKGVersion })
875
876     for pkg, version in syslibdeps.iteritems():
877         if not conf.CheckPKGVersion( pkg, version ):
878             print '%s >= %s not found.' %(pkg, version)
879             DependenciesRequiredMessage()
880             Exit(1)
881         
882     env = conf.Finish()
883     
884     libraries['sigc2'] = LibraryInfo()
885     libraries['sigc2'].ParseConfig('pkg-config --cflags --libs sigc++-2.0')
886     libraries['glibmm2'] = LibraryInfo()
887     libraries['glibmm2'].ParseConfig('pkg-config --cflags --libs glibmm-2.4')
888     libraries['cairomm'] = LibraryInfo()
889     libraries['cairomm'].ParseConfig('pkg-config --cflags --libs cairomm-1.0')
890     libraries['gdkmm2'] = LibraryInfo()
891     libraries['gdkmm2'].ParseConfig ('pkg-config --cflags --libs gdkmm-2.4')
892     libraries['gtkmm2'] = LibraryInfo()
893     libraries['gtkmm2'].ParseConfig ('pkg-config --cflags --libs gtkmm-2.4')
894     libraries['atkmm'] = LibraryInfo()
895     libraries['atkmm'].ParseConfig ('pkg-config --cflags --libs atkmm-1.6')
896     libraries['pangomm'] = LibraryInfo()
897     libraries['pangomm'].ParseConfig ('pkg-config --cflags --libs pangomm-1.4')
898     libraries['libgnomecanvasmm'] = LibraryInfo()
899     libraries['libgnomecanvasmm'].ParseConfig ('pkg-config --cflags --libs libgnomecanvasmm-2.6')
900
901 #
902 # cannot use system one for the time being
903 #
904     
905     libraries['sndfile-ardour'] = LibraryInfo(LIBS='libsndfile-ardour',
906                                     LIBPATH='#libs/libsndfile',
907                                     CPPPATH=['#libs/libsndfile/src'])
908
909 #    libraries['libglademm'] = LibraryInfo()
910 #    libraries['libglademm'].ParseConfig ('pkg-config --cflags --libs libglademm-2.4')
911
912 #    libraries['flowcanvas'] = LibraryInfo(LIBS='flowcanvas', LIBPATH='#/libs/flowcanvas', CPPPATH='#libs/flowcanvas')
913     libraries['soundtouch'] = LibraryInfo()
914     libraries['soundtouch'].ParseConfig ('pkg-config --cflags --libs libSoundTouch')
915     # Comment the previous line and uncomment this for Debian:
916     #libraries['soundtouch'].ParseConfig ('pkg-config --cflags --libs libSoundTouch')
917
918     libraries['appleutility'] = LibraryInfo(LIBS='libappleutility',
919                                             LIBPATH='#libs/appleutility',
920                                             CPPPATH='#libs/appleutility')
921     
922     coredirs = [
923         'templates',
924         'manual'
925     ]
926     
927     subdirs = [
928         'libs/libsndfile',
929         'libs/pbd',
930         'libs/midi++2',
931         'libs/ardour',
932     # these are unconditionally included but have
933     # tests internally to avoid compilation etc
934     # if VST is not set
935         'libs/fst',
936         'vst',
937     # this is unconditionally included but has
938     # tests internally to avoid compilation etc
939     # if COREAUDIO is not set
940         'libs/appleutility'
941         ]
942     
943     gtk_subdirs = [
944 #        'libs/flowcanvas',
945         'libs/gtkmm2ext',
946         'gtk2_ardour',
947         'libs/clearlooks'
948         ]
949
950 else:
951     libraries['sigc2'] = LibraryInfo(LIBS='sigc++2',
952                                     LIBPATH='#libs/sigc++2',
953                                     CPPPATH='#libs/sigc++2')
954     libraries['glibmm2'] = LibraryInfo(LIBS='glibmm2',
955                                     LIBPATH='#libs/glibmm2',
956                                     CPPPATH='#libs/glibmm2')
957     libraries['pangomm'] = LibraryInfo(LIBS='pangomm',
958                                     LIBPATH='#libs/gtkmm2/pango',
959                                     CPPPATH='#libs/gtkmm2/pango')
960     libraries['atkmm'] = LibraryInfo(LIBS='atkmm',
961                                      LIBPATH='#libs/gtkmm2/atk',
962                                      CPPPATH='#libs/gtkmm2/atk')
963     libraries['gdkmm2'] = LibraryInfo(LIBS='gdkmm2',
964                                       LIBPATH='#libs/gtkmm2/gdk',
965                                       CPPPATH='#libs/gtkmm2/gdk')
966     libraries['gtkmm2'] = LibraryInfo(LIBS='gtkmm2',
967                                      LIBPATH="#libs/gtkmm2/gtk",
968                                      CPPPATH='#libs/gtkmm2/gtk/')
969     libraries['libgnomecanvasmm'] = LibraryInfo(LIBS='libgnomecanvasmm',
970                                                 LIBPATH='#libs/libgnomecanvasmm',
971                                                 CPPPATH='#libs/libgnomecanvasmm')
972     
973     libraries['soundtouch'] = LibraryInfo(LIBS='soundtouch',
974                                           LIBPATH='#libs/soundtouch',
975                                           CPPPATH=['#libs', '#libs/soundtouch'])
976     libraries['sndfile-ardour'] = LibraryInfo(LIBS='libsndfile-ardour',
977                                     LIBPATH='#libs/libsndfile',
978                                     CPPPATH=['#libs/libsndfile', '#libs/libsndfile/src'])
979 #    libraries['libglademm'] = LibraryInfo(LIBS='libglademm',
980 #                                          LIBPATH='#libs/libglademm',
981 #                                          CPPPATH='#libs/libglademm')
982     libraries['appleutility'] = LibraryInfo(LIBS='libappleutility',
983                                             LIBPATH='#libs/appleutility',
984                                             CPPPATH='#libs/appleutility')
985
986     coredirs = [
987         'libs/soundtouch',
988         'templates',
989         'manual'
990     ]
991     
992     subdirs = [
993         'libs/sigc++2',
994         'libs/libsndfile',
995         'libs/pbd',
996         'libs/midi++2',
997         'libs/ardour',
998     # these are unconditionally included but have
999     # tests internally to avoid compilation etc
1000     # if VST is not set
1001         'libs/fst',
1002         'vst',
1003     # this is unconditionally included but has
1004     # tests internally to avoid compilation etc
1005     # if COREAUDIO is not set
1006         'libs/appleutility'
1007         ]
1008     
1009     gtk_subdirs = [
1010         'libs/glibmm2',
1011         'libs/gtkmm2/pango',
1012         'libs/gtkmm2/atk',
1013         'libs/gtkmm2/gdk',
1014         'libs/gtkmm2/gtk',
1015         'libs/libgnomecanvasmm',
1016 #       'libs/flowcanvas',
1017         'libs/gtkmm2ext',
1018         'gtk2_ardour',
1019         'libs/clearlooks'
1020         ]
1021
1022 #
1023 # * always build the LGPL control protocol lib, since we link against it from libardour
1024 # * ditto for generic MIDI
1025 # * tranzport checks whether it should build internally, but we need here so that
1026 #   its included in the tarball
1027 #
1028
1029 surface_subdirs = [ 'libs/surfaces/control_protocol',
1030                     'libs/surfaces/generic_midi',
1031                     'libs/surfaces/tranzport',
1032                     'libs/surfaces/mackie',
1033                     'libs/surfaces/powermate'
1034                     ]
1035
1036 if env['SURFACES']:
1037     if have_libusb:
1038         env['TRANZPORT'] = 1
1039     else:
1040         env['TRANZPORT'] = 0
1041         print 'Disabled building Tranzport code because libusb could not be found'
1042
1043     if have_linux_input:
1044         env['POWERMATE'] = 1
1045     else:
1046         env['POWERMATE'] = 0
1047         print 'Disabled building Powermate code because linux/input.h could not be found'
1048
1049     if os.access ('libs/surfaces/sony9pin', os.F_OK):
1050         surface_subdirs += [ 'libs/surfaces/sony9pin' ]
1051 else:
1052     env['POWERMATE'] = 0
1053     env['TRANZPORT'] = 0
1054
1055 opts.Save('scache.conf', env)
1056 Help(opts.GenerateHelpText(env))
1057
1058 if os.environ.has_key('PATH'):
1059     env.Append(PATH = os.environ['PATH'])
1060
1061 if os.environ.has_key('PKG_CONFIG_PATH'):
1062     env.Append(PKG_CONFIG_PATH = os.environ['PKG_CONFIG_PATH'])
1063
1064 if os.environ.has_key('CC'):
1065     env['CC'] = os.environ['CC']
1066
1067 if os.environ.has_key('CXX'):
1068     env['CXX'] = os.environ['CXX']
1069
1070 if os.environ.has_key('DISTCC_HOSTS'):
1071     env['ENV']['DISTCC_HOSTS'] = os.environ['DISTCC_HOSTS']
1072     env['ENV']['HOME'] = os.environ['HOME']
1073
1074 final_prefix = '$PREFIX'
1075
1076 if env['DESTDIR'] :
1077     install_prefix = '$DESTDIR/$PREFIX'
1078 else:
1079     install_prefix = env['PREFIX']
1080
1081 subst_dict['%INSTALL_PREFIX%'] = install_prefix;
1082 subst_dict['%FINAL_PREFIX%'] = final_prefix;
1083 subst_dict['%PREFIX%'] = final_prefix;
1084
1085 if env['PREFIX'] == '/usr':
1086     final_config_prefix = '/etc'
1087 else:
1088     final_config_prefix = env['PREFIX'] + '/etc'
1089
1090 config_prefix = '$DESTDIR' + final_config_prefix
1091
1092 # For colorgcc
1093 if os.environ.has_key('PATH'):
1094         env['PATH'] = os.environ['PATH']
1095 if os.environ.has_key('TERM'):
1096         env['TERM'] = os.environ['TERM']
1097 if os.environ.has_key('HOME'):
1098         env['HOME'] = os.environ['HOME']
1099
1100 #
1101 # everybody needs this
1102 #
1103
1104 env.Merge ([ libraries['core'] ])
1105
1106
1107 #
1108 # i18n support
1109 #
1110
1111 conf = Configure (env)
1112 if env['NLS']:
1113     nls_error = 'This system is not configured for internationalized applications.  An english-only version will be built:'
1114     print 'Checking for internationalization support ...'
1115     have_gettext = conf.TryAction(Action('xgettext --version'))
1116     if have_gettext[0] != 1:
1117         nls_error += ' No xgettext command.'
1118         env['NLS'] = 0
1119     else:
1120         print "Found xgettext"
1121     
1122     have_msgmerge = conf.TryAction(Action('msgmerge --version'))
1123     if have_msgmerge[0] != 1:
1124         nls_error += ' No msgmerge command.'
1125         env['NLS'] = 0
1126     else:
1127         print "Found msgmerge"
1128     
1129     if not conf.CheckCHeader('libintl.h'):
1130         nls_error += ' No libintl.h.'
1131         env['NLS'] = 0
1132         
1133     if env['NLS'] == 0:
1134         print nls_error
1135     else:
1136         print "International version will be built."
1137 env = conf.Finish()
1138
1139 if env['NLS'] == 1:
1140     env.Append(CCFLAGS="-DENABLE_NLS")
1141
1142 Export('env install_prefix final_prefix config_prefix final_config_prefix libraries i18n ardour_version subst_dict use_flac')
1143
1144 #
1145 # the configuration file may be system dependent
1146 #
1147
1148 conf = env.Configure ()
1149
1150 if conf.CheckCHeader('/System/Library/Frameworks/CoreAudio.framework/Versions/A/Headers/CoreAudio.h'):
1151     subst_dict['%JACK_INPUT%'] = "coreaudio:Built-in Audio:in"
1152     subst_dict['%JACK_OUTPUT%'] = "coreaudio:Built-in Audio:out"
1153 else:
1154     subst_dict['%JACK_INPUT%'] = "system:playback_"
1155     subst_dict['%JACK_OUTPUT%'] = "system:capture_"
1156
1157 # posix_memalign available
1158 if not conf.CheckFunc('posix_memalign'):
1159     print 'Did not find posix_memalign(), using malloc'
1160     env.Append(CCFLAGS='-DNO_POSIX_MEMALIGN')
1161
1162
1163 env = conf.Finish()
1164
1165 # generate the per-user and system rc files from the same source
1166
1167 sysrcbuild = env.SubstInFile ('ardour_system.rc','ardour.rc.in', SUBST_DICT = subst_dict)
1168
1169 # add to the substitution dictionary
1170
1171 subst_dict['%VERSION%'] = ardour_version[0:3]
1172 subst_dict['%EXTRA_VERSION%'] = ardour_version[3:]
1173 subst_dict['%REVISION_STRING%'] = ''
1174 if os.path.exists('.svn'):
1175     subst_dict['%REVISION_STRING%'] = '.' + fetch_svn_revision ('.') + 'svn'
1176
1177 # specbuild = env.SubstInFile ('ardour.spec','ardour.spec.in', SUBST_DICT = subst_dict)
1178
1179 the_revision = env.Command ('frobnicatory_decoy', [], create_stored_revision)
1180 remove_ardour = env.Command ('frobnicatory_decoy2', [],
1181                              [ Delete ('$PREFIX/etc/ardour2'),
1182                                Delete ('$PREFIX/lib/ardour2'),
1183                                Delete ('$PREFIX/bin/ardour2')])
1184
1185 env.Alias('revision', the_revision)
1186 env.Alias('install', env.Install(os.path.join(config_prefix, 'ardour2'), 'ardour_system.rc'))
1187 env.Alias('uninstall', remove_ardour)
1188
1189 Default (sysrcbuild)
1190
1191 # source tarball
1192
1193 Precious (env['DISTTREE'])
1194
1195 env.Distribute (env['DISTTREE'],
1196                [ 'SConstruct', 'svn_revision.h',
1197                   'COPYING', 'PACKAGER_README', 'README',
1198                   'ardour.rc.in',
1199                   'tools/config.guess',
1200                   'icons/icon/ardour_icon_mac_mask.png',
1201                   'icons/icon/ardour_icon_mac.png',
1202                   'icons/icon/ardour_icon_tango_16px_blue.png',
1203                   'icons/icon/ardour_icon_tango_16px_red.png',
1204                   'icons/icon/ardour_icon_tango_22px_blue.png',
1205                   'icons/icon/ardour_icon_tango_22px_red.png',
1206                   'icons/icon/ardour_icon_tango_32px_blue.png',
1207                   'icons/icon/ardour_icon_tango_32px_red.png',
1208                   'icons/icon/ardour_icon_tango_48px_blue.png',
1209                   'icons/icon/ardour_icon_tango_48px_red.png'
1210                   ] +
1211                 glob.glob ('DOCUMENTATION/AUTHORS*') +
1212                 glob.glob ('DOCUMENTATION/CONTRIBUTORS*') +
1213                 glob.glob ('DOCUMENTATION/TRANSLATORS*') +
1214                 glob.glob ('DOCUMENTATION/BUILD*') +
1215                 glob.glob ('DOCUMENTATION/FAQ*') +
1216                 glob.glob ('DOCUMENTATION/README*')
1217                 )
1218
1219 srcdist = env.Tarball(env['TARBALL'], [ env['DISTTREE'], the_revision ])
1220 env.Alias ('srctar', srcdist)
1221
1222 #
1223 # don't leave the distree around
1224 #
1225
1226 env.AddPreAction (env['DISTTREE'], Action ('rm -rf ' + str (File (env['DISTTREE']))))
1227 env.AddPostAction (srcdist, Action ('rm -rf ' + str (File (env['DISTTREE']))))
1228
1229 #
1230 # the subdirs
1231 #
1232
1233 for subdir in coredirs:
1234     SConscript (subdir + '/SConscript')
1235
1236 for sublistdir in [ subdirs, gtk_subdirs, surface_subdirs ]:
1237     for subdir in sublistdir:
1238         SConscript (subdir + '/SConscript')
1239
1240 # cleanup
1241 env.Clean ('scrub', [ 'scache.conf', '.sconf_temp', '.sconsign.dblite', 'config.log'])
1242