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