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')
509 # libraries['libglademm'] = LibraryInfo()
510 # libraries['libglademm'].ParseConfig ('pkg-config --cflags --libs libglademm-2.4')
512 # libraries['flowcanvas'] = LibraryInfo(LIBS='flowcanvas', LIBPATH='#/libs/flowcanvas', CPPPATH='#libs/flowcanvas')
513 libraries['soundtouch'] = LibraryInfo()
514 libraries['soundtouch'].ParseConfig ('pkg-config --cflags --libs soundtouch-1.0')
533 libraries['sigc2'] = LibraryInfo(LIBS='sigc++2',
534 LIBPATH='#libs/sigc++2',
535 CPPPATH='#libs/sigc++2')
536 libraries['glibmm2'] = LibraryInfo(LIBS='glibmm2',
537 LIBPATH='#libs/glibmm2',
538 CPPPATH='#libs/glibmm2')
539 libraries['pangomm'] = LibraryInfo(LIBS='pangomm',
540 LIBPATH='#libs/gtkmm2/pango',
541 CPPPATH='#libs/gtkmm2/pango')
542 libraries['atkmm'] = LibraryInfo(LIBS='atkmm',
543 LIBPATH='#libs/gtkmm2/atk',
544 CPPPATH='#libs/gtkmm2/atk')
545 libraries['gdkmm2'] = LibraryInfo(LIBS='gdkmm2',
546 LIBPATH='#libs/gtkmm2/gdk',
547 CPPPATH='#libs/gtkmm2/gdk')
548 libraries['gtkmm2'] = LibraryInfo(LIBS='gtkmm2',
549 LIBPATH="#libs/gtkmm2/gtk",
550 CPPPATH='#libs/gtkmm2/gtk/')
551 libraries['libgnomecanvasmm'] = LibraryInfo(LIBS='libgnomecanvasmm',
552 LIBPATH='#libs/libgnomecanvasmm',
553 CPPPATH='#libs/libgnomecanvasmm')
555 libraries['soundtouch'] = LibraryInfo(LIBS='soundtouch',
556 LIBPATH='#libs/soundtouch',
557 CPPPATH=['#libs', '#libs/soundtouch'])
558 libraries['sndfile'] = LibraryInfo(LIBS='libsndfile',
559 LIBPATH='#libs/libsndfile',
560 CPPPATH=['#libs/libsndfile', '#libs/libsndfile/src'])
561 # libraries['libglademm'] = LibraryInfo(LIBS='libglademm',
562 # LIBPATH='#libs/libglademm',
563 # CPPPATH='#libs/libglademm')
585 'libs/libgnomecanvasmm',
592 # always build the LGPL control protocol lib, since we link against it ourselves
593 # ditto for generic MIDI
596 surface_subdirs = [ 'libs/surfaces/control_protocol', 'libs/surfaces/generic_midi' ]
600 surface_subdirs += [ 'libs/surfaces/tranzport' ]
601 if os.access ('libs/surfaces/sony9pin', os.F_OK):
602 surface_subdirs += [ 'libs/surfaces/sony9pin' ]
604 opts.Save('scache.conf', env)
605 Help(opts.GenerateHelpText(env))
607 if os.environ.has_key('PATH'):
608 env.Append(PATH = os.environ['PATH'])
610 if os.environ.has_key('PKG_CONFIG_PATH'):
611 env.Append(PKG_CONFIG_PATH = os.environ['PKG_CONFIG_PATH'])
613 if os.environ.has_key('CC'):
614 env['CC'] = os.environ['CC']
616 if os.environ.has_key('CXX'):
617 env['CXX'] = os.environ['CXX']
619 if os.environ.has_key('DISTCC_HOSTS'):
620 env['ENV']['DISTCC_HOSTS'] = os.environ['DISTCC_HOSTS']
621 env['ENV']['HOME'] = os.environ['HOME']
623 final_prefix = '$PREFIX'
624 install_prefix = '$DESTDIR/$PREFIX'
626 subst_dict['INSTALL_PREFIX'] = install_prefix;
628 if env['PREFIX'] == '/usr':
629 final_config_prefix = '/etc'
631 final_config_prefix = env['PREFIX'] + '/etc'
633 config_prefix = '$DESTDIR' + final_config_prefix
636 # SCons should really do this for us
638 conf = Configure (env)
640 have_cxx = conf.TryAction (Action (env['CXX'] + ' --version'))
642 print "This system has no functional C++ compiler. You cannot build Ardour from source without one."
645 print "Congratulations, you have a functioning C++ compiler."
650 # Compiler flags and other system-dependent stuff
654 debug_flags = [ '-g' ]
656 # guess at the platform, used to define compiler flags
658 config_guess = os.popen("tools/config.guess").read()[:-1]
664 config = config_guess.split ("-")
666 print "system triple: " + config_guess
669 if env['DIST_TARGET'] == 'auto':
670 if config[config_arch] == 'apple':
671 # The [.] matches to the dot after the major version, "." would match any character
672 if re.search ("darwin[0-7][.]", config[config_kernel]) != None:
673 env['DIST_TARGET'] = 'panther'
675 env['DIST_TARGET'] = 'tiger'
677 if re.search ("x86_64", config[config_cpu]) != None:
678 env['DIST_TARGET'] = 'x86_64'
679 elif re.search("i[0-5]86", config[config_cpu]) != None:
680 env['DIST_TARGET'] = 'i386'
681 elif re.search("powerpc", config[config_cpu]) != None:
682 env['DIST_TARGET'] = 'powerpc'
684 env['DIST_TARGET'] = 'i686'
685 print "\n*******************************"
686 print "detected DIST_TARGET = " + env['DIST_TARGET']
687 print "*******************************\n"
690 if config[config_cpu] == 'powerpc' and env['DIST_TARGET'] != 'none':
692 # Apple/PowerPC optimization options
694 # -mcpu=7450 does not reliably work with gcc 3.*
696 if env['DIST_TARGET'] == 'panther' or env['DIST_TARGET'] == 'tiger':
697 if config[config_arch] == 'apple':
698 opt_flags.extend ([ "-mcpu=7450", "-faltivec"])
700 opt_flags.extend ([ "-mcpu=7400", "-maltivec", "-mabi=altivec"])
702 opt_flags.extend([ "-mcpu=750", "-mmultiple" ])
703 opt_flags.extend (["-mhard-float", "-mpowerpc-gfxopt"])
705 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':
707 build_host_supports_sse = 0
709 debug_flags.append ("-DARCH_X86")
710 opt_flags.append ("-DARCH_X86")
712 if config[config_kernel] == 'linux' :
714 if env['DIST_TARGET'] != 'i386':
716 flag_line = os.popen ("cat /proc/cpuinfo | grep '^flags'").read()[:-1]
717 x86_flags = flag_line.split (": ")[1:][0].split (' ')
719 if "mmx" in x86_flags:
720 opt_flags.append ("-mmmx")
721 if "sse" in x86_flags:
722 build_host_supports_sse = 1
723 if "3dnow" in x86_flags:
724 opt_flags.append ("-m3dnow")
726 if config[config_cpu] == "i586":
727 opt_flags.append ("-march=i586")
728 elif config[config_cpu] == "i686":
729 opt_flags.append ("-march=i686")
731 if ((env['DIST_TARGET'] == 'i686') or (env['DIST_TARGET'] == 'x86_64')) and build_host_supports_sse:
732 opt_flags.extend (["-msse", "-mfpmath=sse"])
733 debug_flags.extend (["-msse", "-mfpmath=sse"])
734 # end of processor-specific section
736 # optimization section
737 if env['FPU_OPTIMIZATION']:
738 if env['DIST_TARGET'] == 'tiger':
739 opt_flags.append ("-DBUILD_VECLIB_OPTIMIZATIONS")
740 debug_flags.append ("-DBUILD_VECLIB_OPTIMIZATIONS")
741 libraries['core'].Append(LINKFLAGS= '-framework Accelerate')
742 elif env['DIST_TARGET'] == 'i686' or env['DIST_TARGET'] == 'x86_64':
743 opt_flags.append ("-DBUILD_SSE_OPTIMIZATIONS")
744 debug_flags.append ("-DBUILD_SSE_OPTIMIZATIONS")
745 if env['DIST_TARGET'] == 'x86_64':
746 opt_flags.append ("-DUSE_X86_64_ASM")
747 debug_flags.append ("-DUSE_X86_64_ASM")
748 if build_host_supports_sse != 1:
749 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)"
750 # end optimization section
753 # save off guessed arch element in an env
755 env.Append(CONFIG_ARCH=config[config_arch])
759 # ARCH="..." overrides all
762 if env['ARCH'] != '':
763 opt_flags = env['ARCH'].split()
766 # prepend boiler plate optimization flags
771 "-fomit-frame-pointer",
776 if env['DEBUG'] == 1:
777 env.Append(CCFLAGS=" ".join (debug_flags))
779 env.Append(CCFLAGS=" ".join (opt_flags))
781 env.Append(CCFLAGS="-Wall")
784 env.Append(CCFLAGS="-DVST_SUPPORT")
787 env.Append(CCFLAGS="-DHAVE_LIBLO")
790 # everybody needs this
793 env.Merge ([ libraries['core'] ])
799 conf = Configure (env)
802 print 'Checking for internationalization support ...'
803 have_gettext = conf.TryAction(Action('xgettext --version'))
804 if have_gettext[0] != 1:
805 print 'This system is not configured for internationalized applications (no xgettext command). An english-only version will be built\n'
808 if conf.CheckCHeader('libintl.h') == None:
809 print 'This system is not configured for internationalized applications (no libintl.h). An english-only version will be built\n'
816 env.Append(CCFLAGS="-DENABLE_NLS")
819 Export('env install_prefix final_prefix config_prefix final_config_prefix libraries i18n version subst_dict')
822 # the configuration file may be system dependent
825 conf = env.Configure ()
827 if conf.CheckCHeader('/System/Library/Frameworks/CoreAudio.framework/Versions/A/Headers/CoreAudio.h'):
828 subst_dict['%JACK_INPUT%'] = "coreaudio:Built-in Audio:in"
829 subst_dict['%JACK_OUTPUT%'] = "coreaudio:Built-in Audio:out"
831 subst_dict['%JACK_INPUT%'] = "alsa_pcm:playback_"
832 subst_dict['%JACK_OUTPUT%'] = "alsa_pcm:capture_"
834 # posix_memalign available
835 if not conf.CheckFunc('posix_memalign'):
836 print 'Did not find posix_memalign(), using malloc'
837 env.Append(CCFLAGS='-DNO_POSIX_MEMALIGN')
842 rcbuild = env.SubstInFile ('ardour.rc','ardour.rc.in', SUBST_DICT = subst_dict)
844 env.Alias('install', env.Install(os.path.join(config_prefix, 'ardour2'), 'ardour_system.rc'))
845 env.Alias('install', env.Install(os.path.join(config_prefix, 'ardour2'), 'ardour.rc'))
851 Precious (env['DISTTREE'])
854 # note the special "cleanfirst" source name. this triggers removal
855 # of the existing disttree
858 env.Distribute (env['DISTTREE'],
860 'COPYING', 'PACKAGER_README', 'README',
865 glob.glob ('DOCUMENTATION/AUTHORS*') +
866 glob.glob ('DOCUMENTATION/CONTRIBUTORS*') +
867 glob.glob ('DOCUMENTATION/TRANSLATORS*') +
868 glob.glob ('DOCUMENTATION/BUILD*') +
869 glob.glob ('DOCUMENTATION/FAQ*') +
870 glob.glob ('DOCUMENTATION/README*')
873 srcdist = env.Tarball(env['TARBALL'], env['DISTTREE'])
874 env.Alias ('srctar', srcdist)
876 # don't leave the distree around
878 env.AddPreAction (env['DISTTREE'], Action ('rm -rf ' + str (File (env['DISTTREE']))))
879 env.AddPostAction (srcdist, Action ('rm -rf ' + str (File (env['DISTTREE']))))
885 for subdir in coredirs:
886 SConscript (subdir + '/SConscript')
888 for sublistdir in [ subdirs, gtk_subdirs, surface_subdirs ]:
889 for subdir in sublistdir:
890 SConscript (subdir + '/SConscript')
893 env.Clean ('scrub', [ 'scache.conf', '.sconf_temp', '.sconsign.dblite', 'config.log'])