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(CCFLAGS = '-Ilibs/libsndfile/src')
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 ()
432 libraries['lo'] = LibraryInfo ()
434 conf = Configure (libraries['lo'])
435 if conf.CheckLib ('lo', 'lo_server_new') == False:
436 print "liblo does not appear to be installed."
439 libraries['lo'] = conf.Finish ()
444 libraries['dmalloc'] = LibraryInfo ()
447 # look for the threaded version
450 conf = Configure (libraries['dmalloc'])
451 if conf.CheckLib ('dmallocth', 'dmalloc_shutdown'):
452 have_libdmalloc = True
454 have_libdmalloc = False
456 libraries['dmalloc'] = conf.Finish ()
461 # Audio/MIDI library (needed for MIDI, since audio is all handled via JACK)
464 conf = Configure(env)
466 if conf.CheckCHeader('alsa/asoundlib.h'):
467 libraries['sysmidi'] = LibraryInfo (LIBS='asound')
468 env['SYSMIDI'] = 'ALSA Sequencer'
469 subst_dict['%MIDITAG%'] = "seq"
470 subst_dict['%MIDITYPE%'] = "alsa/sequencer"
471 elif conf.CheckCHeader('/System/Library/Frameworks/CoreMIDI.framework/Headers/CoreMIDI.h'):
472 # this line is needed because scons can't handle -framework in ParseConfig() yet.
473 libraries['sysmidi'] = LibraryInfo (LINKFLAGS= '-framework CoreMIDI -framework CoreFoundation -framework CoreAudio -framework CoreServices -framework AudioUnit -framework AudioToolbox -bind_at_load')
474 env['SYSMIDI'] = 'CoreMIDI'
475 subst_dict['%MIDITAG%'] = "ardour"
476 subst_dict['%MIDITYPE%'] = "coremidi"
478 print "It appears you don't have the required MIDI libraries installed."
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 soundtouch-1.0')
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['sndfile'] = LibraryInfo(LIBS='libsndfile',
550 LIBPATH='#libs/libsndfile',
551 CPPPATH='#libs/libsndfile')
552 # libraries['libglademm'] = LibraryInfo(LIBS='libglademm',
553 # LIBPATH='#libs/libglademm',
554 # CPPPATH='#libs/libglademm')
576 'libs/libgnomecanvasmm',
583 # always build the LGPL control protocol lib, since we link against it ourselves
584 # ditto for generic MIDI
587 surface_subdirs = [ 'libs/surfaces/control_protocol', 'libs/surfaces/generic_midi' ]
591 surface_subdirs += [ 'libs/surfaces/tranzport' ]
592 if os.access ('libs/surfaces/sony9pin', os.F_OK):
593 surface_subdirs += [ 'libs/surfaces/sony9pin' ]
595 opts.Save('scache.conf', env)
596 Help(opts.GenerateHelpText(env))
598 if os.environ.has_key('PATH'):
599 env.Append(PATH = os.environ['PATH'])
601 if os.environ.has_key('PKG_CONFIG_PATH'):
602 env.Append(PKG_CONFIG_PATH = os.environ['PKG_CONFIG_PATH'])
604 if os.environ.has_key('CC'):
605 env['CC'] = os.environ['CC']
607 if os.environ.has_key('CXX'):
608 env['CXX'] = os.environ['CXX']
610 if os.environ.has_key('DISTCC_HOSTS'):
611 env['ENV']['DISTCC_HOSTS'] = os.environ['DISTCC_HOSTS']
612 env['ENV']['HOME'] = os.environ['HOME']
614 final_prefix = '$PREFIX'
615 install_prefix = '$DESTDIR/$PREFIX'
617 subst_dict['INSTALL_PREFIX'] = install_prefix;
619 if env['PREFIX'] == '/usr':
620 final_config_prefix = '/etc'
622 final_config_prefix = env['PREFIX'] + '/etc'
624 config_prefix = '$DESTDIR' + final_config_prefix
627 # SCons should really do this for us
629 conf = Configure (env)
631 have_cxx = conf.TryAction (Action (env['CXX'] + ' --version'))
633 print "This system has no functional C++ compiler. You cannot build Ardour from source without one."
636 print "Congratulations, you have a functioning C++ compiler."
641 # Compiler flags and other system-dependent stuff
645 debug_flags = [ '-g' ]
647 # guess at the platform, used to define compiler flags
649 config_guess = os.popen("tools/config.guess").read()[:-1]
655 config = config_guess.split ("-")
657 print "system triple: " + config_guess
660 if env['DIST_TARGET'] == 'auto':
661 if config[config_arch] == 'apple':
662 # The [.] matches to the dot after the major version, "." would match any character
663 if re.search ("darwin[0-7][.]", config[config_kernel]) != None:
664 env['DIST_TARGET'] = 'panther'
666 env['DIST_TARGET'] = 'tiger'
668 if re.search ("x86_64", config[config_cpu]) != None:
669 env['DIST_TARGET'] = 'x86_64'
670 elif re.search("i[0-5]86", config[config_cpu]) != None:
671 env['DIST_TARGET'] = 'i386'
672 elif re.search("powerpc", config[config_cpu]) != None:
673 env['DIST_TARGET'] = 'powerpc'
675 env['DIST_TARGET'] = 'i686'
676 print "\n*******************************"
677 print "detected DIST_TARGET = " + env['DIST_TARGET']
678 print "*******************************\n"
681 if config[config_cpu] == 'powerpc' and env['DIST_TARGET'] != 'none':
683 # Apple/PowerPC optimization options
685 # -mcpu=7450 does not reliably work with gcc 3.*
687 if env['DIST_TARGET'] == 'panther' or env['DIST_TARGET'] == 'tiger':
688 if config[config_arch] == 'apple':
689 opt_flags.extend ([ "-mcpu=7450", "-faltivec"])
691 opt_flags.extend ([ "-mcpu=7400", "-maltivec", "-mabi=altivec"])
693 opt_flags.extend([ "-mcpu=750", "-mmultiple" ])
694 opt_flags.extend (["-mhard-float", "-mpowerpc-gfxopt"])
696 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':
698 build_host_supports_sse = 0
700 debug_flags.append ("-DARCH_X86")
701 opt_flags.append ("-DARCH_X86")
703 if config[config_kernel] == 'linux' :
705 if env['DIST_TARGET'] != 'i386':
707 flag_line = os.popen ("cat /proc/cpuinfo | grep '^flags'").read()[:-1]
708 x86_flags = flag_line.split (": ")[1:][0].split (' ')
710 if "mmx" in x86_flags:
711 opt_flags.append ("-mmmx")
712 if "sse" in x86_flags:
713 build_host_supports_sse = 1
714 if "3dnow" in x86_flags:
715 opt_flags.append ("-m3dnow")
717 if config[config_cpu] == "i586":
718 opt_flags.append ("-march=i586")
719 elif config[config_cpu] == "i686":
720 opt_flags.append ("-march=i686")
722 if ((env['DIST_TARGET'] == 'i686') or (env['DIST_TARGET'] == 'x86_64')) and build_host_supports_sse:
723 opt_flags.extend (["-msse", "-mfpmath=sse"])
724 debug_flags.extend (["-msse", "-mfpmath=sse"])
725 # end of processor-specific section
727 # optimization section
728 if env['FPU_OPTIMIZATION']:
729 if env['DIST_TARGET'] == 'tiger':
730 opt_flags.append ("-DBUILD_VECLIB_OPTIMIZATIONS")
731 debug_flags.append ("-DBUILD_VECLIB_OPTIMIZATIONS")
732 libraries['core'].Append(LINKFLAGS= '-framework Accelerate')
733 elif env['DIST_TARGET'] == 'i686' or env['DIST_TARGET'] == 'x86_64':
734 opt_flags.append ("-DBUILD_SSE_OPTIMIZATIONS")
735 debug_flags.append ("-DBUILD_SSE_OPTIMIZATIONS")
736 if env['DIST_TARGET'] == 'x86_64':
737 opt_flags.append ("-DUSE_X86_64_ASM")
738 debug_flags.append ("-DUSE_X86_64_ASM")
739 if build_host_supports_sse != 1:
740 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)"
741 # end optimization section
744 # save off guessed arch element in an env
746 env.Append(CONFIG_ARCH=config[config_arch])
750 # ARCH="..." overrides all
753 if env['ARCH'] != '':
754 opt_flags = env['ARCH'].split()
757 # prepend boiler plate optimization flags
762 "-fomit-frame-pointer",
767 if env['DEBUG'] == 1:
768 env.Append(CCFLAGS=" ".join (debug_flags))
770 env.Append(CCFLAGS=" ".join (opt_flags))
772 env.Append(CCFLAGS="-Wall")
775 env.Append(CCFLAGS="-DVST_SUPPORT")
778 env.Append(CCFLAGS="-DHAVE_LIBLO")
781 # everybody needs this
784 env.Merge ([ libraries['core'] ])
790 conf = Configure (env)
793 print 'Checking for internationalization support ...'
794 have_gettext = conf.TryAction(Action('xgettext --version'))
795 if have_gettext[0] != 1:
796 print 'This system is not configured for internationalized applications (no xgettext command). An english-only version will be built\n'
799 if conf.CheckCHeader('libintl.h') == None:
800 print 'This system is not configured for internationalized applications (no libintl.h). An english-only version will be built\n'
807 env.Append(CCFLAGS="-DENABLE_NLS")
810 Export('env install_prefix final_prefix config_prefix final_config_prefix libraries i18n version subst_dict')
813 # the configuration file may be system dependent
816 conf = env.Configure ()
818 if conf.CheckCHeader('/System/Library/Frameworks/CoreAudio.framework/Versions/A/Headers/CoreAudio.h'):
819 subst_dict['%JACK_INPUT%'] = "coreaudio:Built-in Audio:in"
820 subst_dict['%JACK_OUTPUT%'] = "coreaudio:Built-in Audio:out"
822 subst_dict['%JACK_INPUT%'] = "alsa_pcm:playback_"
823 subst_dict['%JACK_OUTPUT%'] = "alsa_pcm:capture_"
825 # posix_memalign available
826 if not conf.CheckFunc('posix_memalign'):
827 print 'Did not find posix_memalign(), using malloc'
828 env.Append(CCFLAGS='-DNO_POSIX_MEMALIGN')
833 rcbuild = env.SubstInFile ('ardour.rc','ardour.rc.in', SUBST_DICT = subst_dict)
835 env.Alias('install', env.Install(os.path.join(config_prefix, 'ardour2'), 'ardour_system.rc'))
836 env.Alias('install', env.Install(os.path.join(config_prefix, 'ardour2'), 'ardour.rc'))
842 Precious (env['DISTTREE'])
845 # note the special "cleanfirst" source name. this triggers removal
846 # of the existing disttree
849 env.Distribute (env['DISTTREE'],
851 'COPYING', 'PACKAGER_README', 'README',
856 glob.glob ('DOCUMENTATION/AUTHORS*') +
857 glob.glob ('DOCUMENTATION/CONTRIBUTORS*') +
858 glob.glob ('DOCUMENTATION/TRANSLATORS*') +
859 glob.glob ('DOCUMENTATION/BUILD*') +
860 glob.glob ('DOCUMENTATION/FAQ*') +
861 glob.glob ('DOCUMENTATION/README*')
864 srcdist = env.Tarball(env['TARBALL'], env['DISTTREE'])
865 env.Alias ('srctar', srcdist)
867 # don't leave the distree around
869 env.AddPreAction (env['DISTTREE'], Action ('rm -rf ' + str (File (env['DISTTREE']))))
870 env.AddPostAction (srcdist, Action ('rm -rf ' + str (File (env['DISTTREE']))))
876 for subdir in coredirs:
877 SConscript (subdir + '/SConscript')
879 for sublistdir in [ subdirs, gtk_subdirs, surface_subdirs ]:
880 for subdir in sublistdir:
881 SConscript (subdir + '/SConscript')
884 env.Clean ('scrub', [ 'scache.conf', '.sconf_temp', '.sconsign.dblite', 'config.log'])