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