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('DEVBUILD', 'Use shared libardour (developers only)', 0),
32 BoolOption('NLS', 'Set to turn on i18n support', 1),
33 PathOption('PREFIX', 'Set the install "prefix"', '/usr/local'),
34 BoolOption('VST', 'Compile with support for VST', 0),
35 BoolOption('VERSIONED', 'Add version information to ardour/gtk executable name inside the build directory', 0),
36 EnumOption('DIST_TARGET', 'Build target for cross compiling packagers', 'auto', allowed_values=('auto', 'i386', 'i686', 'x86_64', 'powerpc', 'tiger', 'panther', 'none' ), ignorecase=2),
37 BoolOption('FPU_OPTIMIZATION', 'Build runtime checked assembler code', 1),
38 BoolOption('FFT_ANALYSIS', 'Include FFT analysis window', 0)
41 #----------------------------------------------------------------------
42 # a handy helper that provides a way to merge compile/link information
43 # from multiple different "environments"
44 #----------------------------------------------------------------------
46 class LibraryInfo(Environment):
47 def __init__(self,*args,**kw):
48 Environment.__init__ (self,*args,**kw)
50 def Merge (self,others):
52 self.Append (LIBS = other.get ('LIBS',[]))
53 self.Append (LIBPATH = other.get ('LIBPATH', []))
54 self.Append (CPPPATH = other.get('CPPPATH', []))
55 self.Append (LINKFLAGS = other.get('LINKFLAGS', []))
56 self.Replace(LIBPATH = list(Set(self.get('LIBPATH', []))))
57 self.Replace(CPPPATH = list(Set(self.get('CPPPATH',[]))))
58 #doing LINKFLAGS breaks -framework
59 #doing LIBS break link order dependency
62 env = LibraryInfo (options = opts,
65 TARBALL='ardour-' + version + '.tar.bz2',
67 DISTTREE = '#ardour-' + version,
68 DISTCHECKDIR = '#ardour-' + version + '/check'
72 #----------------------------------------------------------------------
74 #----------------------------------------------------------------------
76 # Handy subst-in-file builder
79 def do_subst_in_file(targetfile, sourcefile, dict):
80 """Replace all instances of the keys of dict with their values.
81 For example, if dict is {'%VERSION%': '1.2345', '%BASE%': 'MyProg'},
82 then all instances of %VERSION% in the file will be replaced with 1.2345 etc.
85 f = open(sourcefile, 'rb')
89 raise SCons.Errors.UserError, "Can't read source file %s"%sourcefile
90 for (k,v) in dict.items():
91 contents = re.sub(k, v, contents)
93 f = open(targetfile, 'wb')
97 raise SCons.Errors.UserError, "Can't write target file %s"%targetfile
100 def subst_in_file(target, source, env):
101 if not env.has_key('SUBST_DICT'):
102 raise SCons.Errors.UserError, "SubstInFile requires SUBST_DICT to be set."
103 d = dict(env['SUBST_DICT']) # copy it
104 for (k,v) in d.items():
106 d[k] = env.subst(v())
107 elif SCons.Util.is_String(v):
110 raise SCons.Errors.UserError, "SubstInFile: key %s: %s must be a string or callable"%(k, repr(v))
111 for (t,s) in zip(target, source):
112 return do_subst_in_file(str(t), str(s), d)
114 def subst_in_file_string(target, source, env):
115 """This is what gets printed on the console."""
116 return '\n'.join(['Substituting vars from %s into %s'%(str(s), str(t))
117 for (t,s) in zip(target, source)])
119 def subst_emitter(target, source, env):
120 """Add dependency from substituted SUBST_DICT to target.
121 Returns original target, source tuple unchanged.
123 d = env['SUBST_DICT'].copy() # copy it
124 for (k,v) in d.items():
126 d[k] = env.subst(v())
127 elif SCons.Util.is_String(v):
129 Depends(target, SCons.Node.Python.Value(d))
130 # Depends(target, source) # this doesn't help the install-sapphire-linux.sh problem
131 return target, source
133 subst_action = Action (subst_in_file, subst_in_file_string)
134 env['BUILDERS']['SubstInFile'] = Builder(action=subst_action, emitter=subst_emitter)
137 # internationalization
142 # this is not a builder. we can't list the .po files as a target,
143 # because then scons -c will remove them (even Precious doesn't alter
144 # this). this function is called whenever a .mo file is being
145 # built, and will conditionally update the .po file if necessary.
148 def po_helper(po,pot):
154 print 'Updating ' + po
155 return os.spawnvp (os.P_WAIT, 'msgmerge', args)
157 # mo_builder: builder function for (binary) message catalogs (.mo)
159 # first source: .po file
160 # second source: .pot file
163 def mo_builder(target,source,env):
164 po_helper (source[0].get_path(), source[1].get_path())
168 target[0].get_path(),
171 return os.spawnvp (os.P_WAIT, 'msgfmt', args)
173 mo_bld = Builder (action = mo_builder)
174 env.Append(BUILDERS = {'MoBuild' : mo_bld})
176 # pot_builder: builder function for message templates (.pot)
178 # source: list of C/C++ etc. files to extract messages from
181 def pot_builder(target,source,env):
186 '-o', target[0].get_path(),
187 "--default-domain=" + env['PACKAGE'],
188 '--copyright-holder="Paul Davis"' ]
189 args += [ src.get_path() for src in source ]
191 return os.spawnvp (os.P_WAIT, 'xgettext', args)
193 pot_bld = Builder (action = pot_builder)
194 env.Append(BUILDERS = {'PotBuild' : pot_bld})
197 # utility function, not a builder
200 def i18n (buildenv, sources, installenv):
201 domain = buildenv['PACKAGE']
202 potfile = buildenv['POTFILE']
204 installenv.Alias ('potupdate', buildenv.PotBuild (potfile, sources))
206 p_oze = [ os.path.basename (po) for po in glob.glob ('po/*.po') ]
207 languages = [ po.replace ('.po', '') for po in p_oze ]
208 m_oze = [ po.replace (".po", ".mo") for po in p_oze ]
211 po = 'po/' + mo.replace (".mo", ".po")
212 installenv.Alias ('install', buildenv.MoBuild (mo, [ po, potfile ]))
214 for lang in languages[:]:
215 modir = (os.path.join (install_prefix, 'share/locale/' + lang + '/LC_MESSAGES/'))
216 moname = domain + '.mo'
217 installenv.Alias('install', installenv.InstallAs (os.path.join (modir, moname), lang + '.mo'))
220 # A generic builder for version.cc files
222 # note: requires that DOMAIN, MAJOR, MINOR, MICRO are set in the construction environment
223 # note: assumes one source files, the header that declares the version variables
225 def version_builder (target, source, env):
226 text = "int " + env['DOMAIN'] + "_major_version = " + str (env['MAJOR']) + ";\n"
227 text += "int " + env['DOMAIN'] + "_minor_version = " + str (env['MINOR']) + ";\n"
228 text += "int " + env['DOMAIN'] + "_micro_version = " + str (env['MICRO']) + ";\n"
231 o = file (target[0].get_path(), 'w')
235 print "Could not open", target[0].get_path(), " for writing\n"
238 text = "#ifndef __" + env['DOMAIN'] + "_version_h__\n"
239 text += "#define __" + env['DOMAIN'] + "_version_h__\n"
240 text += "extern int " + env['DOMAIN'] + "_major_version;\n"
241 text += "extern int " + env['DOMAIN'] + "_minor_version;\n"
242 text += "extern int " + env['DOMAIN'] + "_micro_version;\n"
243 text += "#endif /* __" + env['DOMAIN'] + "_version_h__ */\n"
246 o = file (target[1].get_path(), 'w')
250 print "Could not open", target[1].get_path(), " for writing\n"
255 version_bld = Builder (action = version_builder)
256 env.Append (BUILDERS = {'VersionBuild' : version_bld})
259 # a builder that makes a hard link from the 'source' executable to a name with
260 # a "build ID" based on the most recent CVS activity that might be reasonably
261 # related to version activity. this relies on the idea that the SConscript
262 # file that builds the executable is updated with new version info and committed
263 # to the source code repository whenever things change.
266 def versioned_builder(target,source,env):
267 # build ID is composed of a representation of the date of the last CVS transaction
268 # for this (SConscript) file
271 o = file (source[0].get_dir().get_path() + '/CVS/Entries', "r")
273 print "Could not CVS/Entries for reading"
277 lines = o.readlines()
279 if line[0:12] == '/SConscript/':
280 parts = line.split ("/")
286 print "No SConscript CVS update info found - versioned executable cannot be built"
289 tag = time.strftime ('%Y%M%d%H%m', time.strptime (last_date))
290 print "The current build ID is " + tag
292 tagged_executable = source[0].get_path() + '-' + tag
294 if os.path.exists (tagged_executable):
295 print "Replacing existing executable with the same build tag."
296 os.unlink (tagged_executable)
298 return os.link (source[0].get_path(), tagged_executable)
300 verbuild = Builder (action = versioned_builder)
301 env.Append (BUILDERS = {'VersionedExecutable' : verbuild})
304 # source tar file builder
307 def distcopy (target, source, env):
308 treedir = str (target[0])
312 except OSError, (errnum, strerror):
313 if errnum != errno.EEXIST:
314 print 'mkdir ', treedir, ':', strerror
318 # we don't know what characters might be in the file names
319 # so quote them all before passing them to the shell
321 all_files = ([ str(s) for s in source ])
322 cmd += " ".join ([ "'%s'" % quoted for quoted in all_files])
323 cmd += ' | (cd ' + treedir + ' && tar xf -)'
327 def tarballer (target, source, env):
328 cmd = 'tar -jcf ' + str (target[0]) + ' ' + str(source[0]) + " --exclude '*~'"
329 print 'running ', cmd, ' ... '
333 dist_bld = Builder (action = distcopy,
334 target_factory = SCons.Node.FS.default_fs.Entry,
335 source_factory = SCons.Node.FS.default_fs.Entry,
338 tarball_bld = Builder (action = tarballer,
339 target_factory = SCons.Node.FS.default_fs.Entry,
340 source_factory = SCons.Node.FS.default_fs.Entry)
342 env.Append (BUILDERS = {'Distribute' : dist_bld})
343 env.Append (BUILDERS = {'Tarball' : tarball_bld})
345 # ----------------------------------------------------------------------
346 # Construction environment setup
347 # ----------------------------------------------------------------------
351 libraries['core'] = LibraryInfo (CCFLAGS = '-Ilibs')
353 libraries['sndfile'] = LibraryInfo()
354 libraries['sndfile'].ParseConfig('pkg-config --cflags --libs sndfile')
356 libraries['lrdf'] = LibraryInfo()
357 libraries['lrdf'].ParseConfig('pkg-config --cflags --libs lrdf')
359 libraries['raptor'] = LibraryInfo()
360 libraries['raptor'].ParseConfig('pkg-config --cflags --libs raptor')
362 libraries['samplerate'] = LibraryInfo()
363 libraries['samplerate'].ParseConfig('pkg-config --cflags --libs samplerate')
365 if env['FFT_ANALYSIS']:
366 libraries['fftw3f'] = LibraryInfo()
367 libraries['fftw3f'].ParseConfig('pkg-config --cflags --libs fftw3f')
369 libraries['jack'] = LibraryInfo()
370 libraries['jack'].ParseConfig('pkg-config --cflags --libs jack')
372 libraries['xml'] = LibraryInfo()
373 libraries['xml'].ParseConfig('pkg-config --cflags --libs libxml-2.0')
375 libraries['glib2'] = LibraryInfo()
376 libraries['glib2'].ParseConfig ('pkg-config --cflags --libs glib-2.0')
377 libraries['glib2'].ParseConfig ('pkg-config --cflags --libs gobject-2.0')
378 libraries['glib2'].ParseConfig ('pkg-config --cflags --libs gmodule-2.0')
380 libraries['gtk2'] = LibraryInfo()
381 libraries['gtk2'].ParseConfig ('pkg-config --cflags --libs gtk+-2.0')
383 libraries['pango'] = LibraryInfo()
384 libraries['pango'].ParseConfig ('pkg-config --cflags --libs pango')
386 libraries['libgnomecanvas2'] = LibraryInfo()
387 libraries['libgnomecanvas2'].ParseConfig ('pkg-config --cflags --libs libgnomecanvas-2.0')
389 libraries['glade2'] = LibraryInfo()
390 libraries['glade2'].ParseConfig ('pkg-config --cflags --libs libglade-2.0')
392 libraries['usb'] = LibraryInfo (LIBS='usb')
394 #libraries['flowcanvas'] = LibraryInfo(LIBS='flowcanvas', LIBPATH='#/libs/flowcanvas', CPPPATH='#libs/flowcanvas')
396 libraries['ardour'] = LibraryInfo (LIBS='ardour', LIBPATH='#libs/ardour', CPPPATH='#libs/ardour')
397 libraries['midi++2'] = LibraryInfo (LIBS='midi++', LIBPATH='#libs/midi++2', CPPPATH='#libs/midi++2')
398 libraries['pbd3'] = LibraryInfo (LIBS='pbd', LIBPATH='#libs/pbd3', CPPPATH='#libs/pbd3')
399 libraries['gtkmm2ext'] = LibraryInfo (LIBS='gtkmm2ext', LIBPATH='#libs/gtkmm2ext', CPPPATH='#libs/gtkmm2ext')
400 #libraries['cassowary'] = LibraryInfo(LIBS='cassowary', LIBPATH='#libs/cassowary', CPPPATH='#libs/cassowary')
402 libraries['fst'] = LibraryInfo()
404 libraries['fst'].ParseConfig('pkg-config --cflags --libs libfst')
407 # Audio/MIDI library (needed for MIDI, since audio is all handled via JACK)
410 conf = Configure(env)
412 if conf.CheckCHeader('alsa/asoundlib.h'):
413 libraries['sysmidi'] = LibraryInfo (LIBS='asound')
414 env['SYSMIDI'] = 'ALSA Sequencer'
415 subst_dict['%MIDITAG%'] = "seq"
416 subst_dict['%MIDITYPE%'] = "alsa/sequencer"
417 elif conf.CheckCHeader('/System/Library/Frameworks/CoreMIDI.framework/Headers/CoreMIDI.h'):
418 # this line is needed because scons can't handle -framework in ParseConfig() yet.
419 libraries['sysmidi'] = LibraryInfo (LINKFLAGS= '-framework CoreMIDI -framework CoreFoundation -framework CoreAudio -framework CoreServices -framework AudioUnit -framework AudioToolbox -bind_at_load')
420 env['SYSMIDI'] = 'CoreMIDI'
421 subst_dict['%MIDITAG%'] = "ardour"
422 subst_dict['%MIDITYPE%'] = "coremidi"
428 libraries['sigc2'] = LibraryInfo()
429 libraries['sigc2'].ParseConfig('pkg-config --cflags --libs sigc++-2.0')
430 libraries['glibmm2'] = LibraryInfo()
431 libraries['glibmm2'].ParseConfig('pkg-config --cflags --libs glibmm-2.4')
432 libraries['gdkmm2'] = LibraryInfo()
433 libraries['gdkmm2'].ParseConfig ('pkg-config --cflags --libs gdkmm-2.4')
434 libraries['gtkmm2'] = LibraryInfo()
435 libraries['gtkmm2'].ParseConfig ('pkg-config --cflags --libs gtkmm-2.4')
436 libraries['atkmm'] = LibraryInfo()
437 libraries['atkmm'].ParseConfig ('pkg-config --cflags --libs atkmm-1.6')
438 libraries['pangomm'] = LibraryInfo()
439 libraries['pangomm'].ParseConfig ('pkg-config --cflags --libs pangomm-1.4')
440 libraries['libgnomecanvasmm'] = LibraryInfo()
441 libraries['libgnomecanvasmm'].ParseConfig ('pkg-config --cflags --libs libgnomecanvasmm-2.6')
442 libraries['libglademm'] = LibraryInfo()
443 libraries['libglademm'].ParseConfig ('pkg-config --cflags --libs libglademm-2.4')
445 # libraries['flowcanvas'] = LibraryInfo(LIBS='flowcanvas', LIBPATH='#/libs/flowcanvas', CPPPATH='#libs/flowcanvas')
446 libraries['soundtouch'] = LibraryInfo()
447 libraries['soundtouch'].ParseConfig ('pkg-config --cflags --libs soundtouch-1.0')
466 libraries['sigc2'] = LibraryInfo(LIBS='sigc++2',
467 LIBPATH='#libs/sigc++2',
468 CPPPATH='#libs/sigc++2')
469 libraries['glibmm2'] = LibraryInfo(LIBS='glibmm2',
470 LIBPATH='#libs/glibmm2',
471 CPPPATH='#libs/glibmm2')
472 libraries['pangomm'] = LibraryInfo(LIBS='pangomm',
473 LIBPATH='#libs/gtkmm2/pango',
474 CPPPATH='#libs/gtkmm2/pango')
475 libraries['atkmm'] = LibraryInfo(LIBS='atkmm',
476 LIBPATH='#libs/gtkmm2/atk',
477 CPPPATH='#libs/gtkmm2/atk')
478 libraries['gdkmm2'] = LibraryInfo(LIBS='gdkmm2',
479 LIBPATH='#libs/gtkmm2/gdk',
480 CPPPATH='#libs/gtkmm2/gdk')
481 libraries['gtkmm2'] = LibraryInfo(LIBS='gtkmm2',
482 LIBPATH="#libs/gtkmm2/gtk",
483 CPPPATH='#libs/gtkmm2/gtk/')
484 libraries['libgnomecanvasmm'] = LibraryInfo(LIBS='libgnomecanvasmm',
485 LIBPATH='#libs/libgnomecanvasmm',
486 CPPPATH='#libs/libgnomecanvasmm')
488 libraries['soundtouch'] = LibraryInfo(LIBS='soundtouch',
489 LIBPATH='#libs/soundtouch',
490 CPPPATH=['#libs', '#libs/soundtouch'])
491 libraries['libglademm'] = LibraryInfo(LIBS='libglademm',
492 LIBPATH='#libs/libglademm',
493 CPPPATH='#libs/libglademm')
515 'libs/libgnomecanvasmm',
522 'libs/surfaces/tranzport',
523 'libs/surfaces/generic_midi'
526 opts.Save('scache.conf', env)
527 Help(opts.GenerateHelpText(env))
529 if os.environ.has_key('PATH'):
530 env.Append(PATH = os.environ['PATH'])
532 if os.environ.has_key('PKG_CONFIG_PATH'):
533 env.Append(PKG_CONFIG_PATH = os.environ['PKG_CONFIG_PATH'])
535 if os.environ.has_key('CC'):
536 env['CC'] = os.environ['CC']
538 if os.environ.has_key('CXX'):
539 env['CXX'] = os.environ['CXX']
541 if os.environ.has_key('DISTCC_HOSTS'):
542 env['ENV']['DISTCC_HOSTS'] = os.environ['DISTCC_HOSTS']
543 env['ENV']['HOME'] = os.environ['HOME']
545 final_prefix = '$PREFIX'
546 install_prefix = '$DESTDIR/$PREFIX'
548 if env['PREFIX'] == '/usr':
549 final_config_prefix = '/etc'
551 final_config_prefix = env['PREFIX'] + '/etc'
553 config_prefix = '$DESTDIR' + final_config_prefix
556 # SCons should really do this for us
558 conf = Configure (env)
560 have_cxx = conf.TryAction (Action (env['CXX'] + ' --version'))
562 print "This system has no functional C++ compiler. You cannot build Ardour from source without one."
565 print "Congratulations, you have a functioning C++ compiler."
570 # Compiler flags and other system-dependent stuff
574 debug_flags = [ '-g' ]
576 # guess at the platform, used to define compiler flags
578 config_guess = os.popen("tools/config.guess").read()[:-1]
584 config = config_guess.split ("-")
586 print "system triple: " + config_guess
589 if env['DIST_TARGET'] == 'auto':
590 if config[config_arch] == 'apple':
591 # The [.] matches to the dot after the major version, "." would match any character
592 if re.search ("darwin[0-7][.]", config[config_kernel]) != None:
593 env['DIST_TARGET'] = 'panther'
595 env['DIST_TARGET'] = 'tiger'
597 if re.search ("x86_64", config[config_cpu]) != None:
598 env['DIST_TARGET'] = 'x86_64'
599 elif re.search("i[0-5]86", config[config_cpu]) != None:
600 env['DIST_TARGET'] = 'i386'
601 elif re.search("powerpc", config[config_cpu]) != None:
602 env['DIST_TARGET'] = 'powerpc'
604 env['DIST_TARGET'] = 'i686'
605 print "\n*******************************"
606 print "detected DIST_TARGET = " + env['DIST_TARGET']
607 print "*******************************\n"
610 if config[config_cpu] == 'powerpc' and env['DIST_TARGET'] != 'none':
612 # Apple/PowerPC optimization options
614 # -mcpu=7450 does not reliably work with gcc 3.*
616 if env['DIST_TARGET'] == 'panther' or env['DIST_TARGET'] == 'tiger':
617 if config[config_arch] == 'apple':
618 opt_flags.extend ([ "-mcpu=7450", "-faltivec"])
620 opt_flags.extend ([ "-mcpu=7400", "-maltivec", "-mabi=altivec"])
622 opt_flags.extend([ "-mcpu=750", "-mmultiple" ])
623 opt_flags.extend (["-mhard-float", "-mpowerpc-gfxopt"])
625 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':
627 build_host_supports_sse = 0
629 debug_flags.append ("-DARCH_X86")
630 opt_flags.append ("-DARCH_X86")
632 if config[config_kernel] == 'linux' :
634 if env['DIST_TARGET'] != 'i386':
636 flag_line = os.popen ("cat /proc/cpuinfo | grep '^flags'").read()[:-1]
637 x86_flags = flag_line.split (": ")[1:][0].split (' ')
639 if "mmx" in x86_flags:
640 opt_flags.append ("-mmmx")
641 if "sse" in x86_flags:
642 build_host_supports_sse = 1
643 if "3dnow" in x86_flags:
644 opt_flags.append ("-m3dnow")
646 if config[config_cpu] == "i586":
647 opt_flags.append ("-march=i586")
648 elif config[config_cpu] == "i686":
649 opt_flags.append ("-march=i686")
651 if ((env['DIST_TARGET'] == 'i686') or (env['DIST_TARGET'] == 'x86_64')) and build_host_supports_sse:
652 opt_flags.extend (["-msse", "-mfpmath=sse"])
653 debug_flags.extend (["-msse", "-mfpmath=sse"])
654 # end of processor-specific section
656 # optimization section
657 if env['FPU_OPTIMIZATION']:
658 if env['DIST_TARGET'] == 'tiger':
659 opt_flags.append ("-DBUILD_VECLIB_OPTIMIZATIONS")
660 debug_flags.append ("-DBUILD_VECLIB_OPTIMIZATIONS")
661 libraries['core'].Append(LINKFLAGS= '-framework Accelerate')
662 elif env['DIST_TARGET'] == 'i686' or env['DIST_TARGET'] == 'x86_64':
663 opt_flags.append ("-DBUILD_SSE_OPTIMIZATIONS")
664 debug_flags.append ("-DBUILD_SSE_OPTIMIZATIONS")
665 if env['DIST_TARGET'] == 'x86_64':
666 opt_flags.append ("-DUSE_X86_64_ASM")
667 debug_flags.append ("-DUSE_X86_64_ASM")
668 if build_host_supports_sse != 1:
669 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)"
670 # end optimization section
673 # ARCH="..." overrides all
676 if env['ARCH'] != '':
677 opt_flags = env['ARCH'].split()
680 # prepend boiler plate optimization flags
685 "-fomit-frame-pointer",
690 if env['DEBUG'] == 1:
691 env.Append(CCFLAGS=" ".join (debug_flags))
693 env.Append(CCFLAGS=" ".join (opt_flags))
695 env.Append(CCFLAGS="-Wall")
698 env.Append(CCFLAGS="-DVST_SUPPORT")
701 # everybody needs this
704 env.Merge ([ libraries['core'] ])
710 conf = Configure (env)
713 print 'Checking for internationalization support ...'
714 have_gettext = conf.TryAction(Action('xgettext --version'))
715 if have_gettext[0] != 1:
716 print 'This system is not configured for internationalized applications (no xgettext command). An english-only version will be built\n'
719 if conf.CheckCHeader('libintl.h') == None:
720 print 'This system is not configured for internationalized applications (no libintl.h). An english-only version will be built\n'
727 env.Append(CCFLAGS="-DENABLE_NLS")
730 Export('env install_prefix final_prefix config_prefix final_config_prefix libraries i18n version subst_dict')
733 # the configuration file may be system dependent
736 conf = env.Configure ()
738 if conf.CheckCHeader('/System/Library/Frameworks/CoreAudio.framework/Versions/A/Headers/CoreAudio.h'):
739 subst_dict['%JACK_INPUT%'] = "coreaudio:Built-in Audio:in"
740 subst_dict['%JACK_OUTPUT%'] = "coreaudio:Built-in Audio:out"
742 subst_dict['%JACK_INPUT%'] = "alsa_pcm:playback_"
743 subst_dict['%JACK_OUTPUT%'] = "alsa_pcm:capture_"
745 # posix_memalign available
746 if not conf.CheckFunc('posix_memalign'):
747 print 'Did not find posix_memalign(), using malloc'
748 env.Append(CCFLAGS='-DNO_POSIX_MEMALIGN')
753 rcbuild = env.SubstInFile ('ardour.rc','ardour.rc.in', SUBST_DICT = subst_dict)
755 env.Alias('install', env.Install(os.path.join(config_prefix, 'ardour2'), 'ardour_system.rc'))
756 env.Alias('install', env.Install(os.path.join(config_prefix, 'ardour2'), 'ardour.rc'))
762 Precious (env['DISTTREE'])
765 # note the special "cleanfirst" source name. this triggers removal
766 # of the existing disttree
769 env.Distribute (env['DISTTREE'],
771 'COPYING', 'PACKAGER_README', 'README',
776 glob.glob ('DOCUMENTATION/AUTHORS*') +
777 glob.glob ('DOCUMENTATION/CONTRIBUTORS*') +
778 glob.glob ('DOCUMENTATION/TRANSLATORS*') +
779 glob.glob ('DOCUMENTATION/BUILD*') +
780 glob.glob ('DOCUMENTATION/FAQ*') +
781 glob.glob ('DOCUMENTATION/README*')
784 srcdist = env.Tarball(env['TARBALL'], env['DISTTREE'])
785 env.Alias ('srctar', srcdist)
787 # don't leave the distree around
789 env.AddPreAction (env['DISTTREE'], Action ('rm -rf ' + str (File (env['DISTTREE']))))
790 env.AddPostAction (srcdist, Action ('rm -rf ' + str (File (env['DISTTREE']))))
796 for subdir in coredirs:
797 SConscript (subdir + '/SConscript')
799 for sublistdir in [subdirs, gtk_subdirs, surface_subdirs]:
800 for subdir in sublistdir:
801 SConscript (subdir + '/SConscript')
804 env.Clean ('scrub', [ 'scache.conf', '.sconf_temp', '.sconsign.dblite', 'config.log'])