17 EnsureSConsVersion(0, 96)
24 # Command-line options
27 opts = Options('scache.conf')
29 ('ARCH', 'Set architecture-specific compilation flags by hand (all flags as 1 argument)',''),
30 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),
31 BoolOption('DEBUG', 'Set to build with debugging information and no optimizations', 0),
32 PathOption('DESTDIR', 'Set the intermediate install "prefix"', '/'),
33 BoolOption('NLS', 'Set to turn on i18n support', 1),
34 PathOption('PREFIX', 'Set the install "prefix"', '/usr/local'),
35 BoolOption('VST', 'Compile with support for VST', 0),
36 BoolOption('VERSIONED', 'Add version information to ardour/gtk executable name inside the build directory', 0),
37 EnumOption('DIST_TARGET', 'Build target for cross compiling packagers', 'auto', allowed_values=('auto', 'i386', 'i686', 'x86_64', 'powerpc', 'tiger', 'panther', 'none' ), ignorecase=2),
38 BoolOption('FPU_OPTIMIZATION', 'Build runtime checked assembler code', 1),
39 BoolOption('FFT_ANALYSIS', 'Include FFT analysis window', 0),
40 BoolOption('SURFACES', 'Build support for control surfaces', 0),
41 BoolOption('DMALLOC', 'Compile and link using the dmalloc library', 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')
386 libraries['gtk2'] = LibraryInfo()
387 libraries['gtk2'].ParseConfig ('pkg-config --cflags --libs gtk+-2.0')
389 libraries['pango'] = LibraryInfo()
390 libraries['pango'].ParseConfig ('pkg-config --cflags --libs pango')
392 libraries['libgnomecanvas2'] = LibraryInfo()
393 libraries['libgnomecanvas2'].ParseConfig ('pkg-config --cflags --libs libgnomecanvas-2.0')
395 #libraries['flowcanvas'] = LibraryInfo(LIBS='flowcanvas', LIBPATH='#/libs/flowcanvas', CPPPATH='#libs/flowcanvas')
397 # The Ardour Control Protocol Library
399 libraries['ardour_cp'] = LibraryInfo (LIBS='ardour_cp', LIBPATH='#libs/surfaces/control_protocol',
400 CPPPATH='#libs/surfaces/control_protocol')
402 # The Ardour backend/engine
404 libraries['ardour'] = LibraryInfo (LIBS='ardour', LIBPATH='#libs/ardour', CPPPATH='#libs/ardour')
405 libraries['midi++2'] = LibraryInfo (LIBS='midi++', LIBPATH='#libs/midi++2', CPPPATH='#libs/midi++2')
406 libraries['pbd3'] = LibraryInfo (LIBS='pbd', LIBPATH='#libs/pbd3', CPPPATH='#libs/pbd3')
407 libraries['gtkmm2ext'] = LibraryInfo (LIBS='gtkmm2ext', LIBPATH='#libs/gtkmm2ext', CPPPATH='#libs/gtkmm2ext')
408 #libraries['cassowary'] = LibraryInfo(LIBS='cassowary', LIBPATH='#libs/cassowary', CPPPATH='#libs/cassowary')
410 libraries['fst'] = LibraryInfo()
412 libraries['fst'].ParseConfig('pkg-config --cflags --libs libfst')
417 libraries['usb'] = LibraryInfo ()
419 conf = Configure (libraries['usb'])
420 if conf.CheckLib ('usb', 'usb_interrupt_write'):
425 libraries['usb'] = conf.Finish ()
430 libraries['lo'] = LibraryInfo ()
432 conf = Configure (libraries['lo'])
433 if conf.CheckLib ('lo', 'lo_server_new') == False:
434 print "liblo does not appear to be installed."
437 libraries['lo'] = conf.Finish ()
442 libraries['dmalloc'] = LibraryInfo ()
445 # look for the threaded version
448 conf = Configure (libraries['dmalloc'])
449 if conf.CheckLib ('dmallocth', 'dmalloc_shutdown'):
450 have_libdmalloc = True
452 have_libdmalloc = False
454 libraries['dmalloc'] = conf.Finish ()
459 # Audio/MIDI library (needed for MIDI, since audio is all handled via JACK)
462 conf = Configure(env)
464 if conf.CheckCHeader('jack/midiport.h'):
465 libraries['sysmidi'] = LibraryInfo (LIBS='jack')
466 env['SYSMIDI'] = 'JACK MIDI'
467 subst_dict['%MIDITAG%'] = "control"
468 subst_dict['%MIDITYPE%'] = "jack"
469 elif conf.CheckCHeader('alsa/asoundlib.h'):
470 libraries['sysmidi'] = LibraryInfo (LIBS='asound')
471 env['SYSMIDI'] = 'ALSA Sequencer'
472 subst_dict['%MIDITAG%'] = "seq"
473 subst_dict['%MIDITYPE%'] = "alsa/sequencer"
474 elif conf.CheckCHeader('/System/Library/Frameworks/CoreMIDI.framework/Headers/CoreMIDI.h'):
475 # this line is needed because scons can't handle -framework in ParseConfig() yet.
476 libraries['sysmidi'] = LibraryInfo (LINKFLAGS= '-framework CoreMIDI -framework CoreFoundation -framework CoreAudio -framework CoreServices -framework AudioUnit -framework AudioToolbox -bind_at_load')
477 env['SYSMIDI'] = 'CoreMIDI'
478 subst_dict['%MIDITAG%'] = "ardour"
479 subst_dict['%MIDITYPE%'] = "coremidi"
485 libraries['sigc2'] = LibraryInfo()
486 libraries['sigc2'].ParseConfig('pkg-config --cflags --libs sigc++-2.0')
487 libraries['glibmm2'] = LibraryInfo()
488 libraries['glibmm2'].ParseConfig('pkg-config --cflags --libs glibmm-2.4')
489 libraries['gdkmm2'] = LibraryInfo()
490 libraries['gdkmm2'].ParseConfig ('pkg-config --cflags --libs gdkmm-2.4')
491 libraries['gtkmm2'] = LibraryInfo()
492 libraries['gtkmm2'].ParseConfig ('pkg-config --cflags --libs gtkmm-2.4')
493 libraries['atkmm'] = LibraryInfo()
494 libraries['atkmm'].ParseConfig ('pkg-config --cflags --libs atkmm-1.6')
495 libraries['pangomm'] = LibraryInfo()
496 libraries['pangomm'].ParseConfig ('pkg-config --cflags --libs pangomm-1.4')
497 libraries['libgnomecanvasmm'] = LibraryInfo()
498 libraries['libgnomecanvasmm'].ParseConfig ('pkg-config --cflags --libs libgnomecanvasmm-2.6')
500 # libraries['libglademm'] = LibraryInfo()
501 # libraries['libglademm'].ParseConfig ('pkg-config --cflags --libs libglademm-2.4')
503 # libraries['flowcanvas'] = LibraryInfo(LIBS='flowcanvas', LIBPATH='#/libs/flowcanvas', CPPPATH='#libs/flowcanvas')
504 libraries['soundtouch'] = LibraryInfo()
505 libraries['soundtouch'].ParseConfig ('pkg-config --cflags --libs libSoundTouch')
524 libraries['sigc2'] = LibraryInfo(LIBS='sigc++2',
525 LIBPATH='#libs/sigc++2',
526 CPPPATH='#libs/sigc++2')
527 libraries['glibmm2'] = LibraryInfo(LIBS='glibmm2',
528 LIBPATH='#libs/glibmm2',
529 CPPPATH='#libs/glibmm2')
530 libraries['pangomm'] = LibraryInfo(LIBS='pangomm',
531 LIBPATH='#libs/gtkmm2/pango',
532 CPPPATH='#libs/gtkmm2/pango')
533 libraries['atkmm'] = LibraryInfo(LIBS='atkmm',
534 LIBPATH='#libs/gtkmm2/atk',
535 CPPPATH='#libs/gtkmm2/atk')
536 libraries['gdkmm2'] = LibraryInfo(LIBS='gdkmm2',
537 LIBPATH='#libs/gtkmm2/gdk',
538 CPPPATH='#libs/gtkmm2/gdk')
539 libraries['gtkmm2'] = LibraryInfo(LIBS='gtkmm2',
540 LIBPATH="#libs/gtkmm2/gtk",
541 CPPPATH='#libs/gtkmm2/gtk/')
542 libraries['libgnomecanvasmm'] = LibraryInfo(LIBS='libgnomecanvasmm',
543 LIBPATH='#libs/libgnomecanvasmm',
544 CPPPATH='#libs/libgnomecanvasmm')
546 libraries['soundtouch'] = LibraryInfo(LIBS='soundtouch',
547 LIBPATH='#libs/soundtouch',
548 CPPPATH=['#libs', '#libs/soundtouch'])
549 # libraries['libglademm'] = LibraryInfo(LIBS='libglademm',
550 # LIBPATH='#libs/libglademm',
551 # CPPPATH='#libs/libglademm')
572 'libs/libgnomecanvasmm',
579 # always build the LGPL control protocol lib, since we link against it ourselves
580 # ditto for generic MIDI
583 surface_subdirs = [ 'libs/surfaces/control_protocol', 'libs/surfaces/generic_midi' ]
587 surface_subdirs += [ 'libs/surfaces/tranzport' ]
588 if os.access ('libs/surfaces/sony9pin', os.F_OK):
589 surface_subdirs += [ 'libs/surfaces/sony9pin' ]
591 opts.Save('scache.conf', env)
592 Help(opts.GenerateHelpText(env))
594 if os.environ.has_key('PATH'):
595 env.Append(PATH = os.environ['PATH'])
597 if os.environ.has_key('TERM'):
598 env.Append(PATH = os.environ['TERM'])
600 if os.environ.has_key('HOME'):
601 env.Append(HOME = os.environ['HOME'])
603 if os.environ.has_key('PKG_CONFIG_PATH'):
604 env.Append(PKG_CONFIG_PATH = os.environ['PKG_CONFIG_PATH'])
606 if os.environ.has_key('CC'):
607 env['CC'] = os.environ['CC']
609 if os.environ.has_key('CXX'):
610 env['CXX'] = os.environ['CXX']
612 if os.environ.has_key('DISTCC_HOSTS'):
613 env['ENV']['DISTCC_HOSTS'] = os.environ['DISTCC_HOSTS']
614 env['ENV']['HOME'] = os.environ['HOME']
616 final_prefix = '$PREFIX'
617 install_prefix = '$DESTDIR/$PREFIX'
619 subst_dict['INSTALL_PREFIX'] = install_prefix;
621 if env['PREFIX'] == '/usr':
622 final_config_prefix = '/etc'
624 final_config_prefix = env['PREFIX'] + '/etc'
626 config_prefix = '$DESTDIR' + final_config_prefix
629 # SCons should really do this for us
631 conf = Configure (env)
633 have_cxx = conf.TryAction (Action (env['CXX'] + ' --version'))
635 print "This system has no functional C++ compiler. You cannot build Ardour from source without one."
638 print "Congratulations, you have a functioning C++ compiler."
643 # Compiler flags and other system-dependent stuff
647 debug_flags = [ '-g' ]
649 # guess at the platform, used to define compiler flags
651 config_guess = os.popen("tools/config.guess").read()[:-1]
657 config = config_guess.split ("-")
659 print "system triple: " + config_guess
662 if env['DIST_TARGET'] == 'auto':
663 if config[config_arch] == 'apple':
664 # The [.] matches to the dot after the major version, "." would match any character
665 if re.search ("darwin[0-7][.]", config[config_kernel]) != None:
666 env['DIST_TARGET'] = 'panther'
668 env['DIST_TARGET'] = 'tiger'
670 if re.search ("x86_64", config[config_cpu]) != None:
671 env['DIST_TARGET'] = 'x86_64'
672 elif re.search("i[0-5]86", config[config_cpu]) != None:
673 env['DIST_TARGET'] = 'i386'
674 elif re.search("powerpc", config[config_cpu]) != None:
675 env['DIST_TARGET'] = 'powerpc'
677 env['DIST_TARGET'] = 'i686'
678 print "\n*******************************"
679 print "detected DIST_TARGET = " + env['DIST_TARGET']
680 print "*******************************\n"
683 if config[config_cpu] == 'powerpc' and env['DIST_TARGET'] != 'none':
685 # Apple/PowerPC optimization options
687 # -mcpu=7450 does not reliably work with gcc 3.*
689 if env['DIST_TARGET'] == 'panther' or env['DIST_TARGET'] == 'tiger':
690 if config[config_arch] == 'apple':
691 opt_flags.extend ([ "-mcpu=7450", "-faltivec"])
693 opt_flags.extend ([ "-mcpu=7400", "-maltivec", "-mabi=altivec"])
695 opt_flags.extend([ "-mcpu=750", "-mmultiple" ])
696 opt_flags.extend (["-mhard-float", "-mpowerpc-gfxopt"])
698 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':
700 build_host_supports_sse = 0
702 debug_flags.append ("-DARCH_X86")
703 opt_flags.append ("-DARCH_X86")
705 if config[config_kernel] == 'linux' :
707 if env['DIST_TARGET'] != 'i386':
709 flag_line = os.popen ("cat /proc/cpuinfo | grep '^flags'").read()[:-1]
710 x86_flags = flag_line.split (": ")[1:][0].split (' ')
712 if "mmx" in x86_flags:
713 opt_flags.append ("-mmmx")
714 if "sse" in x86_flags:
715 build_host_supports_sse = 1
716 if "3dnow" in x86_flags:
717 opt_flags.append ("-m3dnow")
719 if config[config_cpu] == "i586":
720 opt_flags.append ("-march=i586")
721 elif config[config_cpu] == "i686":
722 opt_flags.append ("-march=i686")
724 if ((env['DIST_TARGET'] == 'i686') or (env['DIST_TARGET'] == 'x86_64')) and build_host_supports_sse:
725 opt_flags.extend (["-msse", "-mfpmath=sse"])
726 debug_flags.extend (["-msse", "-mfpmath=sse"])
727 # end of processor-specific section
729 # optimization section
730 if env['FPU_OPTIMIZATION']:
731 if env['DIST_TARGET'] == 'tiger':
732 opt_flags.append ("-DBUILD_VECLIB_OPTIMIZATIONS")
733 debug_flags.append ("-DBUILD_VECLIB_OPTIMIZATIONS")
734 libraries['core'].Append(LINKFLAGS= '-framework Accelerate')
735 elif env['DIST_TARGET'] == 'i686' or env['DIST_TARGET'] == 'x86_64':
736 opt_flags.append ("-DBUILD_SSE_OPTIMIZATIONS")
737 debug_flags.append ("-DBUILD_SSE_OPTIMIZATIONS")
738 if env['DIST_TARGET'] == 'x86_64':
739 opt_flags.append ("-DUSE_X86_64_ASM")
740 debug_flags.append ("-DUSE_X86_64_ASM")
741 if build_host_supports_sse != 1:
742 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)"
743 # end optimization section
746 # ARCH="..." overrides all
749 if env['ARCH'] != '':
750 opt_flags = env['ARCH'].split()
753 # prepend boiler plate optimization flags
758 "-fomit-frame-pointer",
763 if env['DEBUG'] == 1:
764 env.Append(CCFLAGS=" ".join (debug_flags))
766 env.Append(CCFLAGS=" ".join (opt_flags))
768 env.Append(CCFLAGS="-Wall")
771 env.Append(CCFLAGS="-DVST_SUPPORT")
774 # everybody needs this
777 env.Merge ([ libraries['core'] ])
783 conf = Configure (env)
786 print 'Checking for internationalization support ...'
787 have_gettext = conf.TryAction(Action('xgettext --version'))
788 if have_gettext[0] != 1:
789 print 'This system is not configured for internationalized applications (no xgettext command). An english-only version will be built\n'
792 if conf.CheckCHeader('libintl.h') == None:
793 print 'This system is not configured for internationalized applications (no libintl.h). An english-only version will be built\n'
800 env.Append(CCFLAGS="-DENABLE_NLS")
803 Export('env install_prefix final_prefix config_prefix final_config_prefix libraries i18n version subst_dict')
806 # the configuration file may be system dependent
809 conf = env.Configure ()
811 if conf.CheckCHeader('/System/Library/Frameworks/CoreAudio.framework/Versions/A/Headers/CoreAudio.h'):
812 subst_dict['%JACK_INPUT%'] = "coreaudio:Built-in Audio:in"
813 subst_dict['%JACK_OUTPUT%'] = "coreaudio:Built-in Audio:out"
815 subst_dict['%JACK_INPUT%'] = "alsa_pcm:playback_"
816 subst_dict['%JACK_OUTPUT%'] = "alsa_pcm:capture_"
818 # posix_memalign available
819 if not conf.CheckFunc('posix_memalign'):
820 print 'Did not find posix_memalign(), using malloc'
821 env.Append(CCFLAGS='-DNO_POSIX_MEMALIGN')
826 rcbuild = env.SubstInFile ('ardour.rc','ardour.rc.in', SUBST_DICT = subst_dict)
828 env.Alias('install', env.Install(os.path.join(config_prefix, 'ardour2'), 'ardour_system.rc'))
829 env.Alias('install', env.Install(os.path.join(config_prefix, 'ardour2'), 'ardour.rc'))
835 Precious (env['DISTTREE'])
838 # note the special "cleanfirst" source name. this triggers removal
839 # of the existing disttree
842 env.Distribute (env['DISTTREE'],
844 'COPYING', 'PACKAGER_README', 'README',
849 glob.glob ('DOCUMENTATION/AUTHORS*') +
850 glob.glob ('DOCUMENTATION/CONTRIBUTORS*') +
851 glob.glob ('DOCUMENTATION/TRANSLATORS*') +
852 glob.glob ('DOCUMENTATION/BUILD*') +
853 glob.glob ('DOCUMENTATION/FAQ*') +
854 glob.glob ('DOCUMENTATION/README*')
857 srcdist = env.Tarball(env['TARBALL'], env['DISTTREE'])
858 env.Alias ('srctar', srcdist)
860 # don't leave the distree around
862 env.AddPreAction (env['DISTTREE'], Action ('rm -rf ' + str (File (env['DISTTREE']))))
863 env.AddPostAction (srcdist, Action ('rm -rf ' + str (File (env['DISTTREE']))))
869 for subdir in coredirs:
870 SConscript (subdir + '/SConscript')
872 for sublistdir in [ subdirs, gtk_subdirs, surface_subdirs ]:
873 for subdir in sublistdir:
874 SConscript (subdir + '/SConscript')
876 #pickle.dump(env, open('.scons_env', 'w'), pickle.HIGHEST_PROTOCOL)
879 env.Clean ('scrub', [ 'scache.conf', '.sconf_temp', '.sconsign.dblite', 'config.log'])