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