15 EnsureSConsVersion(0, 96)
22 # Command-line options
25 opts = Options('scache.conf')
27 ('ARCH', 'Set architecture-specific compilation flags by hand (all flags as 1 argument)',''),
28 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),
29 BoolOption('DEBUG', 'Set to build with debugging information and no optimizations', 0),
30 PathOption('DESTDIR', 'Set the intermediate install "prefix"', '/'),
31 BoolOption('NLS', 'Set to turn on i18n support', 1),
32 PathOption('PREFIX', 'Set the install "prefix"', '/usr/local'),
33 BoolOption('VST', 'Compile with support for VST', 0),
34 BoolOption('VERSIONED', 'Add version information to ardour/gtk executable name inside the build directory', 0),
35 EnumOption('DIST_TARGET', 'Build target for cross compiling packagers', 'auto', allowed_values=('auto', 'i386', 'i686', 'x86_64', 'powerpc', 'tiger', 'panther', 'none' ), ignorecase=2),
36 BoolOption('FPU_OPTIMIZATION', 'Build runtime checked assembler code', 1),
37 BoolOption('FFT_ANALYSIS', 'Include FFT analysis window', 0),
38 BoolOption('SURFACES', 'Build support for control surfaces', 0),
39 BoolOption('DMALLOC', 'Compile and link using the dmalloc library', 0),
40 BoolOption('LIBLO', 'Compile with support for liblo library', 1),
41 BoolOption('COREAUDIO', 'Compile with Apple\'s CoreAudio library -- UNSTABLE', 0)
44 #----------------------------------------------------------------------
45 # a handy helper that provides a way to merge compile/link information
46 # from multiple different "environments"
47 #----------------------------------------------------------------------
49 class LibraryInfo(Environment):
50 def __init__(self,*args,**kw):
51 Environment.__init__ (self,*args,**kw)
53 def Merge (self,others):
55 self.Append (LIBS = other.get ('LIBS',[]))
56 self.Append (LIBPATH = other.get ('LIBPATH', []))
57 self.Append (CPPPATH = other.get('CPPPATH', []))
58 self.Append (LINKFLAGS = other.get('LINKFLAGS', []))
59 self.Replace(LIBPATH = list(Set(self.get('LIBPATH', []))))
60 self.Replace(CPPPATH = list(Set(self.get('CPPPATH',[]))))
61 #doing LINKFLAGS breaks -framework
62 #doing LIBS break link order dependency
65 env = LibraryInfo (options = opts,
68 TARBALL='ardour-' + version + '.tar.bz2',
70 DISTTREE = '#ardour-' + version,
71 DISTCHECKDIR = '#ardour-' + version + '/check'
75 #----------------------------------------------------------------------
77 #----------------------------------------------------------------------
79 # Handy subst-in-file builder
82 def do_subst_in_file(targetfile, sourcefile, dict):
83 """Replace all instances of the keys of dict with their values.
84 For example, if dict is {'%VERSION%': '1.2345', '%BASE%': 'MyProg'},
85 then all instances of %VERSION% in the file will be replaced with 1.2345 etc.
88 f = open(sourcefile, 'rb')
92 raise SCons.Errors.UserError, "Can't read source file %s"%sourcefile
93 for (k,v) in dict.items():
94 contents = re.sub(k, v, contents)
96 f = open(targetfile, 'wb')
100 raise SCons.Errors.UserError, "Can't write target file %s"%targetfile
103 def subst_in_file(target, source, env):
104 if not env.has_key('SUBST_DICT'):
105 raise SCons.Errors.UserError, "SubstInFile requires SUBST_DICT to be set."
106 d = dict(env['SUBST_DICT']) # copy it
107 for (k,v) in d.items():
109 d[k] = env.subst(v())
110 elif SCons.Util.is_String(v):
113 raise SCons.Errors.UserError, "SubstInFile: key %s: %s must be a string or callable"%(k, repr(v))
114 for (t,s) in zip(target, source):
115 return do_subst_in_file(str(t), str(s), d)
117 def subst_in_file_string(target, source, env):
118 """This is what gets printed on the console."""
119 return '\n'.join(['Substituting vars from %s into %s'%(str(s), str(t))
120 for (t,s) in zip(target, source)])
122 def subst_emitter(target, source, env):
123 """Add dependency from substituted SUBST_DICT to target.
124 Returns original target, source tuple unchanged.
126 d = env['SUBST_DICT'].copy() # copy it
127 for (k,v) in d.items():
129 d[k] = env.subst(v())
130 elif SCons.Util.is_String(v):
132 Depends(target, SCons.Node.Python.Value(d))
133 # Depends(target, source) # this doesn't help the install-sapphire-linux.sh problem
134 return target, source
136 subst_action = Action (subst_in_file, subst_in_file_string)
137 env['BUILDERS']['SubstInFile'] = Builder(action=subst_action, emitter=subst_emitter)
140 # internationalization
145 # this is not a builder. we can't list the .po files as a target,
146 # because then scons -c will remove them (even Precious doesn't alter
147 # this). this function is called whenever a .mo file is being
148 # built, and will conditionally update the .po file if necessary.
151 def po_helper(po,pot):
157 print 'Updating ' + po
158 return os.spawnvp (os.P_WAIT, 'msgmerge', args)
160 # mo_builder: builder function for (binary) message catalogs (.mo)
162 # first source: .po file
163 # second source: .pot file
166 def mo_builder(target,source,env):
167 po_helper (source[0].get_path(), source[1].get_path())
171 target[0].get_path(),
174 return os.spawnvp (os.P_WAIT, 'msgfmt', args)
176 mo_bld = Builder (action = mo_builder)
177 env.Append(BUILDERS = {'MoBuild' : mo_bld})
179 # pot_builder: builder function for message templates (.pot)
181 # source: list of C/C++ etc. files to extract messages from
184 def pot_builder(target,source,env):
189 '-o', target[0].get_path(),
190 "--default-domain=" + env['PACKAGE'],
191 '--copyright-holder="Paul Davis"' ]
192 args += [ src.get_path() for src in source ]
194 return os.spawnvp (os.P_WAIT, 'xgettext', args)
196 pot_bld = Builder (action = pot_builder)
197 env.Append(BUILDERS = {'PotBuild' : pot_bld})
200 # utility function, not a builder
203 def i18n (buildenv, sources, installenv):
204 domain = buildenv['PACKAGE']
205 potfile = buildenv['POTFILE']
207 installenv.Alias ('potupdate', buildenv.PotBuild (potfile, sources))
209 p_oze = [ os.path.basename (po) for po in glob.glob ('po/*.po') ]
210 languages = [ po.replace ('.po', '') for po in p_oze ]
211 m_oze = [ po.replace (".po", ".mo") for po in p_oze ]
214 po = 'po/' + mo.replace (".mo", ".po")
215 installenv.Alias ('install', buildenv.MoBuild (mo, [ po, potfile ]))
217 for lang in languages[:]:
218 modir = (os.path.join (install_prefix, 'share/locale/' + lang + '/LC_MESSAGES/'))
219 moname = domain + '.mo'
220 installenv.Alias('install', installenv.InstallAs (os.path.join (modir, moname), lang + '.mo'))
223 # A generic builder for version.cc files
225 # note: requires that DOMAIN, MAJOR, MINOR, MICRO are set in the construction environment
226 # note: assumes one source files, the header that declares the version variables
228 def version_builder (target, source, env):
229 text = "int " + env['DOMAIN'] + "_major_version = " + str (env['MAJOR']) + ";\n"
230 text += "int " + env['DOMAIN'] + "_minor_version = " + str (env['MINOR']) + ";\n"
231 text += "int " + env['DOMAIN'] + "_micro_version = " + str (env['MICRO']) + ";\n"
234 o = file (target[0].get_path(), 'w')
238 print "Could not open", target[0].get_path(), " for writing\n"
241 text = "#ifndef __" + env['DOMAIN'] + "_version_h__\n"
242 text += "#define __" + env['DOMAIN'] + "_version_h__\n"
243 text += "extern int " + env['DOMAIN'] + "_major_version;\n"
244 text += "extern int " + env['DOMAIN'] + "_minor_version;\n"
245 text += "extern int " + env['DOMAIN'] + "_micro_version;\n"
246 text += "#endif /* __" + env['DOMAIN'] + "_version_h__ */\n"
249 o = file (target[1].get_path(), 'w')
253 print "Could not open", target[1].get_path(), " for writing\n"
258 version_bld = Builder (action = version_builder)
259 env.Append (BUILDERS = {'VersionBuild' : version_bld})
262 # a builder that makes a hard link from the 'source' executable to a name with
263 # a "build ID" based on the most recent CVS activity that might be reasonably
264 # related to version activity. this relies on the idea that the SConscript
265 # file that builds the executable is updated with new version info and committed
266 # to the source code repository whenever things change.
269 def versioned_builder(target,source,env):
270 # build ID is composed of a representation of the date of the last CVS transaction
271 # for this (SConscript) file
274 o = file (source[0].get_dir().get_path() + '/CVS/Entries', "r")
276 print "Could not CVS/Entries for reading"
280 lines = o.readlines()
282 if line[0:12] == '/SConscript/':
283 parts = line.split ("/")
289 print "No SConscript CVS update info found - versioned executable cannot be built"
292 tag = time.strftime ('%Y%M%d%H%m', time.strptime (last_date))
293 print "The current build ID is " + tag
295 tagged_executable = source[0].get_path() + '-' + tag
297 if os.path.exists (tagged_executable):
298 print "Replacing existing executable with the same build tag."
299 os.unlink (tagged_executable)
301 return os.link (source[0].get_path(), tagged_executable)
303 verbuild = Builder (action = versioned_builder)
304 env.Append (BUILDERS = {'VersionedExecutable' : verbuild})
307 # source tar file builder
310 def distcopy (target, source, env):
311 treedir = str (target[0])
315 except OSError, (errnum, strerror):
316 if errnum != errno.EEXIST:
317 print 'mkdir ', treedir, ':', strerror
321 # we don't know what characters might be in the file names
322 # so quote them all before passing them to the shell
324 all_files = ([ str(s) for s in source ])
325 cmd += " ".join ([ "'%s'" % quoted for quoted in all_files])
326 cmd += ' | (cd ' + treedir + ' && tar xf -)'
330 def tarballer (target, source, env):
331 cmd = 'tar -jcf ' + str (target[0]) + ' ' + str(source[0]) + " --exclude '*~'"
332 print 'running ', cmd, ' ... '
336 dist_bld = Builder (action = distcopy,
337 target_factory = SCons.Node.FS.default_fs.Entry,
338 source_factory = SCons.Node.FS.default_fs.Entry,
341 tarball_bld = Builder (action = tarballer,
342 target_factory = SCons.Node.FS.default_fs.Entry,
343 source_factory = SCons.Node.FS.default_fs.Entry)
345 env.Append (BUILDERS = {'Distribute' : dist_bld})
346 env.Append (BUILDERS = {'Tarball' : tarball_bld})
348 # ----------------------------------------------------------------------
349 # Construction environment setup
350 # ----------------------------------------------------------------------
354 libraries['core'] = LibraryInfo (CCFLAGS = '-Ilibs')
356 #libraries['sndfile'] = LibraryInfo()
357 #libraries['sndfile'].ParseConfig('pkg-config --cflags --libs sndfile')
359 libraries['lrdf'] = LibraryInfo()
360 libraries['lrdf'].ParseConfig('pkg-config --cflags --libs lrdf')
362 libraries['raptor'] = LibraryInfo()
363 libraries['raptor'].ParseConfig('pkg-config --cflags --libs raptor')
365 libraries['samplerate'] = LibraryInfo()
366 libraries['samplerate'].ParseConfig('pkg-config --cflags --libs samplerate')
368 if env['FFT_ANALYSIS']:
369 libraries['fftw3f'] = LibraryInfo()
370 libraries['fftw3f'].ParseConfig('pkg-config --cflags --libs fftw3f')
372 libraries['jack'] = LibraryInfo()
373 libraries['jack'].ParseConfig('pkg-config --cflags --libs jack')
375 libraries['xml'] = LibraryInfo()
376 libraries['xml'].ParseConfig('pkg-config --cflags --libs libxml-2.0')
378 libraries['xslt'] = LibraryInfo()
379 libraries['xslt'].ParseConfig('pkg-config --cflags --libs libxslt')
381 libraries['glib2'] = LibraryInfo()
382 libraries['glib2'].ParseConfig ('pkg-config --cflags --libs glib-2.0')
383 libraries['glib2'].ParseConfig ('pkg-config --cflags --libs gobject-2.0')
384 libraries['glib2'].ParseConfig ('pkg-config --cflags --libs gmodule-2.0')
385 libraries['glib2'].ParseConfig ('pkg-config --cflags --libs gthread-2.0')
387 libraries['gtk2'] = LibraryInfo()
388 libraries['gtk2'].ParseConfig ('pkg-config --cflags --libs gtk+-2.0')
390 libraries['pango'] = LibraryInfo()
391 libraries['pango'].ParseConfig ('pkg-config --cflags --libs pango')
393 libraries['libgnomecanvas2'] = LibraryInfo()
394 libraries['libgnomecanvas2'].ParseConfig ('pkg-config --cflags --libs libgnomecanvas-2.0')
396 #libraries['flowcanvas'] = LibraryInfo(LIBS='flowcanvas', LIBPATH='#/libs/flowcanvas', CPPPATH='#libs/flowcanvas')
398 # The Ardour Control Protocol Library
400 libraries['ardour_cp'] = LibraryInfo (LIBS='ardour_cp', LIBPATH='#libs/surfaces/control_protocol',
401 CPPPATH='#libs/surfaces/control_protocol')
403 # The Ardour backend/engine
405 libraries['ardour'] = LibraryInfo (LIBS='ardour', LIBPATH='#libs/ardour', CPPPATH='#libs/ardour')
406 libraries['midi++2'] = LibraryInfo (LIBS='midi++', LIBPATH='#libs/midi++2', CPPPATH='#libs/midi++2')
407 libraries['pbd3'] = LibraryInfo (LIBS='pbd', LIBPATH='#libs/pbd3', CPPPATH='#libs/pbd3')
408 libraries['gtkmm2ext'] = LibraryInfo (LIBS='gtkmm2ext', LIBPATH='#libs/gtkmm2ext', CPPPATH='#libs/gtkmm2ext')
409 #libraries['cassowary'] = LibraryInfo(LIBS='cassowary', LIBPATH='#libs/cassowary', CPPPATH='#libs/cassowary')
411 libraries['fst'] = LibraryInfo()
413 libraries['fst'].ParseConfig('pkg-config --cflags --libs libfst')
418 libraries['usb'] = LibraryInfo ()
420 conf = Configure (libraries['usb'])
421 if conf.CheckLib ('usb', 'usb_interrupt_write'):
426 libraries['usb'] = conf.Finish ()
431 libraries['flac'] = LibraryInfo ()
433 conf = Configure (libraries['flac'])
434 conf.CheckLib ('FLAC', 'FLAC__stream_decoder_new')
435 libraries['flac'] = conf.Finish ()
441 libraries['lo'] = LibraryInfo ()
443 conf = Configure (libraries['lo'])
444 if conf.CheckLib ('lo', 'lo_server_new') == False:
445 print "liblo does not appear to be installed."
448 libraries['lo'] = conf.Finish ()
453 libraries['dmalloc'] = LibraryInfo ()
456 # look for the threaded version
459 conf = Configure (libraries['dmalloc'])
460 if conf.CheckLib ('dmallocth', 'dmalloc_shutdown'):
461 have_libdmalloc = True
463 have_libdmalloc = False
465 libraries['dmalloc'] = conf.Finish ()
470 # Audio/MIDI library (needed for MIDI, since audio is all handled via JACK)
473 conf = Configure(env)
475 if conf.CheckCHeader('alsa/asoundlib.h'):
476 libraries['sysmidi'] = LibraryInfo (LIBS='asound')
477 env['SYSMIDI'] = 'ALSA Sequencer'
478 subst_dict['%MIDITAG%'] = "seq"
479 subst_dict['%MIDITYPE%'] = "alsa/sequencer"
480 elif conf.CheckCHeader('/System/Library/Frameworks/CoreMIDI.framework/Headers/CoreMIDI.h'):
481 # this line is needed because scons can't handle -framework in ParseConfig() yet.
482 libraries['sysmidi'] = LibraryInfo (LINKFLAGS= '-framework CoreMIDI -framework CoreFoundation -framework CoreAudio -framework CoreServices -framework AudioUnit -framework AudioToolbox -bind_at_load')
483 env['SYSMIDI'] = 'CoreMIDI'
484 subst_dict['%MIDITAG%'] = "ardour"
485 subst_dict['%MIDITYPE%'] = "coremidi"
487 print "It appears you don't have the required MIDI libraries installed."
494 libraries['sigc2'] = LibraryInfo()
495 libraries['sigc2'].ParseConfig('pkg-config --cflags --libs sigc++-2.0')
496 libraries['glibmm2'] = LibraryInfo()
497 libraries['glibmm2'].ParseConfig('pkg-config --cflags --libs glibmm-2.4')
498 libraries['gdkmm2'] = LibraryInfo()
499 libraries['gdkmm2'].ParseConfig ('pkg-config --cflags --libs gdkmm-2.4')
500 libraries['gtkmm2'] = LibraryInfo()
501 libraries['gtkmm2'].ParseConfig ('pkg-config --cflags --libs gtkmm-2.4')
502 libraries['atkmm'] = LibraryInfo()
503 libraries['atkmm'].ParseConfig ('pkg-config --cflags --libs atkmm-1.6')
504 libraries['pangomm'] = LibraryInfo()
505 libraries['pangomm'].ParseConfig ('pkg-config --cflags --libs pangomm-1.4')
506 libraries['libgnomecanvasmm'] = LibraryInfo()
507 libraries['libgnomecanvasmm'].ParseConfig ('pkg-config --cflags --libs libgnomecanvasmm-2.6')
510 # cannot use system one for the time being
513 libraries['sndfile'] = LibraryInfo(LIBS='libsndfile',
514 LIBPATH='#libs/libsndfile',
515 CPPPATH=['#libs/libsndfile', '#libs/libsndfile/src'])
517 # libraries['libglademm'] = LibraryInfo()
518 # libraries['libglademm'].ParseConfig ('pkg-config --cflags --libs libglademm-2.4')
520 # libraries['flowcanvas'] = LibraryInfo(LIBS='flowcanvas', LIBPATH='#/libs/flowcanvas', CPPPATH='#libs/flowcanvas')
521 libraries['soundtouch'] = LibraryInfo()
522 libraries['soundtouch'].ParseConfig ('pkg-config --cflags --libs soundtouch-1.0')
542 libraries['sigc2'] = LibraryInfo(LIBS='sigc++2',
543 LIBPATH='#libs/sigc++2',
544 CPPPATH='#libs/sigc++2')
545 libraries['glibmm2'] = LibraryInfo(LIBS='glibmm2',
546 LIBPATH='#libs/glibmm2',
547 CPPPATH='#libs/glibmm2')
548 libraries['pangomm'] = LibraryInfo(LIBS='pangomm',
549 LIBPATH='#libs/gtkmm2/pango',
550 CPPPATH='#libs/gtkmm2/pango')
551 libraries['atkmm'] = LibraryInfo(LIBS='atkmm',
552 LIBPATH='#libs/gtkmm2/atk',
553 CPPPATH='#libs/gtkmm2/atk')
554 libraries['gdkmm2'] = LibraryInfo(LIBS='gdkmm2',
555 LIBPATH='#libs/gtkmm2/gdk',
556 CPPPATH='#libs/gtkmm2/gdk')
557 libraries['gtkmm2'] = LibraryInfo(LIBS='gtkmm2',
558 LIBPATH="#libs/gtkmm2/gtk",
559 CPPPATH='#libs/gtkmm2/gtk/')
560 libraries['libgnomecanvasmm'] = LibraryInfo(LIBS='libgnomecanvasmm',
561 LIBPATH='#libs/libgnomecanvasmm',
562 CPPPATH='#libs/libgnomecanvasmm')
564 libraries['soundtouch'] = LibraryInfo(LIBS='soundtouch',
565 LIBPATH='#libs/soundtouch',
566 CPPPATH=['#libs', '#libs/soundtouch'])
567 libraries['sndfile'] = LibraryInfo(LIBS='libsndfile',
568 LIBPATH='#libs/libsndfile',
569 CPPPATH=['#libs/libsndfile', '#libs/libsndfile/src'])
570 # libraries['libglademm'] = LibraryInfo(LIBS='libglademm',
571 # LIBPATH='#libs/libglademm',
572 # CPPPATH='#libs/libglademm')
594 'libs/libgnomecanvasmm',
601 # always build the LGPL control protocol lib, since we link against it ourselves
602 # ditto for generic MIDI
605 surface_subdirs = [ 'libs/surfaces/control_protocol', 'libs/surfaces/generic_midi' ]
609 surface_subdirs += [ 'libs/surfaces/tranzport' ]
610 if os.access ('libs/surfaces/sony9pin', os.F_OK):
611 surface_subdirs += [ 'libs/surfaces/sony9pin' ]
613 opts.Save('scache.conf', env)
614 Help(opts.GenerateHelpText(env))
616 if os.environ.has_key('PATH'):
617 env.Append(PATH = os.environ['PATH'])
619 if os.environ.has_key('PKG_CONFIG_PATH'):
620 env.Append(PKG_CONFIG_PATH = os.environ['PKG_CONFIG_PATH'])
622 if os.environ.has_key('CC'):
623 env['CC'] = os.environ['CC']
625 if os.environ.has_key('CXX'):
626 env['CXX'] = os.environ['CXX']
628 if os.environ.has_key('DISTCC_HOSTS'):
629 env['ENV']['DISTCC_HOSTS'] = os.environ['DISTCC_HOSTS']
630 env['ENV']['HOME'] = os.environ['HOME']
632 final_prefix = '$PREFIX'
633 install_prefix = '$DESTDIR/$PREFIX'
635 subst_dict['INSTALL_PREFIX'] = install_prefix;
637 if env['PREFIX'] == '/usr':
638 final_config_prefix = '/etc'
640 final_config_prefix = env['PREFIX'] + '/etc'
642 config_prefix = '$DESTDIR' + final_config_prefix
645 # SCons should really do this for us
647 conf = Configure (env)
649 have_cxx = conf.TryAction (Action (env['CXX'] + ' --version'))
651 print "This system has no functional C++ compiler. You cannot build Ardour from source without one."
654 print "Congratulations, you have a functioning C++ compiler."
659 # Compiler flags and other system-dependent stuff
663 debug_flags = [ '-g' ]
665 # guess at the platform, used to define compiler flags
667 config_guess = os.popen("tools/config.guess").read()[:-1]
673 config = config_guess.split ("-")
675 print "system triple: " + config_guess
678 if env['DIST_TARGET'] == 'auto':
679 if config[config_arch] == 'apple':
680 # The [.] matches to the dot after the major version, "." would match any character
681 if re.search ("darwin[0-7][.]", config[config_kernel]) != None:
682 env['DIST_TARGET'] = 'panther'
684 env['DIST_TARGET'] = 'tiger'
686 if re.search ("x86_64", config[config_cpu]) != None:
687 env['DIST_TARGET'] = 'x86_64'
688 elif re.search("i[0-5]86", config[config_cpu]) != None:
689 env['DIST_TARGET'] = 'i386'
690 elif re.search("powerpc", config[config_cpu]) != None:
691 env['DIST_TARGET'] = 'powerpc'
693 env['DIST_TARGET'] = 'i686'
694 print "\n*******************************"
695 print "detected DIST_TARGET = " + env['DIST_TARGET']
696 print "*******************************\n"
699 if config[config_cpu] == 'powerpc' and env['DIST_TARGET'] != 'none':
701 # Apple/PowerPC optimization options
703 # -mcpu=7450 does not reliably work with gcc 3.*
705 if env['DIST_TARGET'] == 'panther' or env['DIST_TARGET'] == 'tiger':
706 if config[config_arch] == 'apple':
707 opt_flags.extend ([ "-mcpu=7450", "-faltivec"])
709 opt_flags.extend ([ "-mcpu=7400", "-maltivec", "-mabi=altivec"])
711 opt_flags.extend([ "-mcpu=750", "-mmultiple" ])
712 opt_flags.extend (["-mhard-float", "-mpowerpc-gfxopt"])
714 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':
716 build_host_supports_sse = 0
718 debug_flags.append ("-DARCH_X86")
719 opt_flags.append ("-DARCH_X86")
721 if config[config_kernel] == 'linux' :
723 if env['DIST_TARGET'] != 'i386':
725 flag_line = os.popen ("cat /proc/cpuinfo | grep '^flags'").read()[:-1]
726 x86_flags = flag_line.split (": ")[1:][0].split (' ')
728 if "mmx" in x86_flags:
729 opt_flags.append ("-mmmx")
730 if "sse" in x86_flags:
731 build_host_supports_sse = 1
732 if "3dnow" in x86_flags:
733 opt_flags.append ("-m3dnow")
735 if config[config_cpu] == "i586":
736 opt_flags.append ("-march=i586")
737 elif config[config_cpu] == "i686":
738 opt_flags.append ("-march=i686")
740 if ((env['DIST_TARGET'] == 'i686') or (env['DIST_TARGET'] == 'x86_64')) and build_host_supports_sse:
741 opt_flags.extend (["-msse", "-mfpmath=sse"])
742 debug_flags.extend (["-msse", "-mfpmath=sse"])
743 # end of processor-specific section
745 # optimization section
746 if env['FPU_OPTIMIZATION']:
747 if env['DIST_TARGET'] == 'tiger':
748 opt_flags.append ("-DBUILD_VECLIB_OPTIMIZATIONS")
749 debug_flags.append ("-DBUILD_VECLIB_OPTIMIZATIONS")
750 libraries['core'].Append(LINKFLAGS= '-framework Accelerate')
751 elif env['DIST_TARGET'] == 'i686' or env['DIST_TARGET'] == 'x86_64':
752 opt_flags.append ("-DBUILD_SSE_OPTIMIZATIONS")
753 debug_flags.append ("-DBUILD_SSE_OPTIMIZATIONS")
754 if env['DIST_TARGET'] == 'x86_64':
755 opt_flags.append ("-DUSE_X86_64_ASM")
756 debug_flags.append ("-DUSE_X86_64_ASM")
757 if build_host_supports_sse != 1:
758 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)"
759 # end optimization section
762 # save off guessed arch element in an env
764 env.Append(CONFIG_ARCH=config[config_arch])
768 # ARCH="..." overrides all
771 if env['ARCH'] != '':
772 opt_flags = env['ARCH'].split()
775 # prepend boiler plate optimization flags
780 "-fomit-frame-pointer",
785 if env['DEBUG'] == 1:
786 env.Append(CCFLAGS=" ".join (debug_flags))
788 env.Append(CCFLAGS=" ".join (opt_flags))
790 env.Append(CCFLAGS="-Wall")
793 env.Append(CCFLAGS="-DVST_SUPPORT")
796 env.Append(CCFLAGS="-DHAVE_LIBLO")
799 # everybody needs this
802 env.Merge ([ libraries['core'] ])
808 conf = Configure (env)
811 print 'Checking for internationalization support ...'
812 have_gettext = conf.TryAction(Action('xgettext --version'))
813 if have_gettext[0] != 1:
814 print 'This system is not configured for internationalized applications (no xgettext command). An english-only version will be built\n'
817 if conf.CheckCHeader('libintl.h') == None:
818 print 'This system is not configured for internationalized applications (no libintl.h). An english-only version will be built\n'
825 env.Append(CCFLAGS="-DENABLE_NLS")
828 Export('env install_prefix final_prefix config_prefix final_config_prefix libraries i18n version subst_dict')
831 # the configuration file may be system dependent
834 conf = env.Configure ()
836 if conf.CheckCHeader('/System/Library/Frameworks/CoreAudio.framework/Versions/A/Headers/CoreAudio.h'):
837 subst_dict['%JACK_INPUT%'] = "coreaudio:Built-in Audio:in"
838 subst_dict['%JACK_OUTPUT%'] = "coreaudio:Built-in Audio:out"
840 subst_dict['%JACK_INPUT%'] = "alsa_pcm:playback_"
841 subst_dict['%JACK_OUTPUT%'] = "alsa_pcm:capture_"
843 # posix_memalign available
844 if not conf.CheckFunc('posix_memalign'):
845 print 'Did not find posix_memalign(), using malloc'
846 env.Append(CCFLAGS='-DNO_POSIX_MEMALIGN')
851 rcbuild = env.SubstInFile ('ardour.rc','ardour.rc.in', SUBST_DICT = subst_dict)
853 env.Alias('install', env.Install(os.path.join(config_prefix, 'ardour2'), 'ardour_system.rc'))
854 env.Alias('install', env.Install(os.path.join(config_prefix, 'ardour2'), 'ardour.rc'))
860 Precious (env['DISTTREE'])
863 # note the special "cleanfirst" source name. this triggers removal
864 # of the existing disttree
867 env.Distribute (env['DISTTREE'],
869 'COPYING', 'PACKAGER_README', 'README',
874 glob.glob ('DOCUMENTATION/AUTHORS*') +
875 glob.glob ('DOCUMENTATION/CONTRIBUTORS*') +
876 glob.glob ('DOCUMENTATION/TRANSLATORS*') +
877 glob.glob ('DOCUMENTATION/BUILD*') +
878 glob.glob ('DOCUMENTATION/FAQ*') +
879 glob.glob ('DOCUMENTATION/README*')
882 srcdist = env.Tarball(env['TARBALL'], env['DISTTREE'])
883 env.Alias ('srctar', srcdist)
885 # don't leave the distree around
887 env.AddPreAction (env['DISTTREE'], Action ('rm -rf ' + str (File (env['DISTTREE']))))
888 env.AddPostAction (srcdist, Action ('rm -rf ' + str (File (env['DISTTREE']))))
894 for subdir in coredirs:
895 SConscript (subdir + '/SConscript')
897 for sublistdir in [ subdirs, gtk_subdirs, surface_subdirs ]:
898 for subdir in sublistdir:
899 SConscript (subdir + '/SConscript')
902 env.Clean ('scrub', [ 'scache.conf', '.sconf_temp', '.sconsign.dblite', 'config.log'])