17 EnsureSConsVersion(0, 96)
19 ardour_version = '2.0beta11.1'
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('AUDIOUNITS', 'Compile with Apple\'s AudioUnit library. (experimental)', 0),
31 BoolOption('COREAUDIO', 'Compile with Apple\'s CoreAudio library', 0),
32 BoolOption('DEBUG', 'Set to build with debugging information and no optimizations', 0),
33 PathOption('DESTDIR', 'Set the intermediate install "prefix"', '/'),
34 EnumOption('DIST_TARGET', 'Build target for cross compiling packagers', 'auto', allowed_values=('auto', 'i386', 'i686', 'x86_64', 'powerpc', 'tiger', 'panther', 'none' ), ignorecase=2),
35 BoolOption('DMALLOC', 'Compile and link using the dmalloc library', 0),
36 BoolOption('EXTRA_WARN', 'Compile with -Wextra, -ansi, and -pedantic. Might break compilation. For pedants', 0),
37 BoolOption('FFT_ANALYSIS', 'Include FFT analysis window', 0),
38 BoolOption('FPU_OPTIMIZATION', 'Build runtime checked assembler code', 1),
39 BoolOption('LIBLO', 'Compile with support for liblo library', 1),
40 BoolOption('NLS', 'Set to turn on i18n support', 1),
41 PathOption('PREFIX', 'Set the install "prefix"', '/usr/local'),
42 BoolOption('SURFACES', 'Build support for control surfaces', 1),
43 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),
44 BoolOption('VERSIONED', 'Add revision information to ardour/gtk executable name inside the build directory', 0),
45 BoolOption('VST', 'Compile with support for VST', 0),
46 BoolOption('TRANZPORT', 'Compile with support for Frontier Designs (if libusb is available)', 0)
49 #----------------------------------------------------------------------
50 # a handy helper that provides a way to merge compile/link information
51 # from multiple different "environments"
52 #----------------------------------------------------------------------
54 class LibraryInfo(Environment):
55 def __init__(self,*args,**kw):
56 Environment.__init__ (self,*args,**kw)
58 def Merge (self,others):
60 self.Append (LIBS = other.get ('LIBS',[]))
61 self.Append (LIBPATH = other.get ('LIBPATH', []))
62 self.Append (CPPPATH = other.get('CPPPATH', []))
63 self.Append (LINKFLAGS = other.get('LINKFLAGS', []))
64 self.Replace(LIBPATH = list(Set(self.get('LIBPATH', []))))
65 self.Replace(CPPPATH = list(Set(self.get('CPPPATH',[]))))
66 #doing LINKFLAGS breaks -framework
67 #doing LIBS break link order dependency
69 def ENV_update(self, src_ENV):
70 for k in src_ENV.keys():
71 if k in self['ENV'].keys() and k in [ 'PATH', 'LD_LIBRARY_PATH',
73 self['ENV'][k]=SCons.Util.AppendPath(self['ENV'][k], src_ENV[k])
75 self['ENV'][k]=src_ENV[k]
77 env = LibraryInfo (options = opts,
79 VERSION = ardour_version,
80 TARBALL='ardour-' + ardour_version + '.tar.bz2',
82 DISTTREE = '#ardour-' + ardour_version,
83 DISTCHECKDIR = '#ardour-' + ardour_version + '/check'
86 env.ENV_update(os.environ)
88 #----------------------------------------------------------------------
90 #----------------------------------------------------------------------
92 # Handy subst-in-file builder
95 def do_subst_in_file(targetfile, sourcefile, dict):
96 """Replace all instances of the keys of dict with their values.
97 For example, if dict is {'%VERSION%': '1.2345', '%BASE%': 'MyProg'},
98 then all instances of %VERSION% in the file will be replaced with 1.2345 etc.
101 f = open(sourcefile, 'rb')
105 raise SCons.Errors.UserError, "Can't read source file %s"%sourcefile
106 for (k,v) in dict.items():
107 contents = re.sub(k, v, contents)
109 f = open(targetfile, 'wb')
113 raise SCons.Errors.UserError, "Can't write target file %s"%targetfile
116 def subst_in_file(target, source, env):
117 if not env.has_key('SUBST_DICT'):
118 raise SCons.Errors.UserError, "SubstInFile requires SUBST_DICT to be set."
119 d = dict(env['SUBST_DICT']) # copy it
120 for (k,v) in d.items():
122 d[k] = env.subst(v())
123 elif SCons.Util.is_String(v):
126 raise SCons.Errors.UserError, "SubstInFile: key %s: %s must be a string or callable"%(k, repr(v))
127 for (t,s) in zip(target, source):
128 return do_subst_in_file(str(t), str(s), d)
130 def subst_in_file_string(target, source, env):
131 """This is what gets printed on the console."""
132 return '\n'.join(['Substituting vars from %s into %s'%(str(s), str(t))
133 for (t,s) in zip(target, source)])
135 def subst_emitter(target, source, env):
136 """Add dependency from substituted SUBST_DICT to target.
137 Returns original target, source tuple unchanged.
139 d = env['SUBST_DICT'].copy() # copy it
140 for (k,v) in d.items():
142 d[k] = env.subst(v())
143 elif SCons.Util.is_String(v):
145 Depends(target, SCons.Node.Python.Value(d))
146 # Depends(target, source) # this doesn't help the install-sapphire-linux.sh problem
147 return target, source
149 subst_action = Action (subst_in_file, subst_in_file_string)
150 env['BUILDERS']['SubstInFile'] = Builder(action=subst_action, emitter=subst_emitter)
153 # internationalization
156 # po_builder: builder function to copy po files to the parent directory while updating them
158 # first source: .po file
159 # second source: .pot file
162 def po_builder(target,source,env):
163 os.spawnvp (os.P_WAIT, 'cp', ['cp', str(source[0]), str(target[0])])
169 print 'Updating ' + str(target[0])
170 return os.spawnvp (os.P_WAIT, 'msgmerge', args)
172 po_bld = Builder (action = po_builder)
173 env.Append(BUILDERS = {'PoBuild' : po_bld})
175 # mo_builder: builder function for (binary) message catalogs (.mo)
177 # first source: .po file
180 def mo_builder(target,source,env):
184 target[0].get_path(),
187 return os.spawnvp (os.P_WAIT, 'msgfmt', args)
189 mo_bld = Builder (action = mo_builder)
190 env.Append(BUILDERS = {'MoBuild' : mo_bld})
192 # pot_builder: builder function for message templates (.pot)
194 # source: list of C/C++ etc. files to extract messages from
197 def pot_builder(target,source,env):
202 '-o', target[0].get_path(),
203 "--default-domain=" + env['PACKAGE'],
204 '--copyright-holder="Paul Davis"' ]
205 args += [ src.get_path() for src in source ]
207 return os.spawnvp (os.P_WAIT, 'xgettext', args)
209 pot_bld = Builder (action = pot_builder)
210 env.Append(BUILDERS = {'PotBuild' : pot_bld})
213 # utility function, not a builder
216 def i18n (buildenv, sources, installenv):
217 domain = buildenv['PACKAGE']
218 potfile = buildenv['POTFILE']
220 installenv.Alias ('potupdate', buildenv.PotBuild (potfile, sources))
222 p_oze = [ os.path.basename (po) for po in glob.glob ('po/*.po') ]
223 languages = [ po.replace ('.po', '') for po in p_oze ]
225 for po_file in p_oze:
226 buildenv.PoBuild(po_file, ['po/'+po_file, potfile])
227 mo_file = po_file.replace (".po", ".mo")
228 installenv.Alias ('install', buildenv.MoBuild (mo_file, po_file))
230 for lang in languages:
231 modir = (os.path.join (install_prefix, 'share/locale/' + lang + '/LC_MESSAGES/'))
232 moname = domain + '.mo'
233 installenv.Alias('install', installenv.InstallAs (os.path.join (modir, moname), lang + '.mo'))
236 def fetch_svn_revision (path):
240 cmd += " | awk '/^Revision:/ { print $2}'"
241 return commands.getoutput (cmd)
243 def create_stored_revision (target = None, source = None, env = None):
244 if os.path.exists('.svn'):
245 rev = fetch_svn_revision ('.');
247 text = "#ifndef __ardour_svn_revision_h__\n"
248 text += "#define __ardour_svn_revision_h__\n"
249 text += "static const char* ardour_svn_revision = \"" + rev + "\";\n";
251 print '============> writing svn revision info to svn_revision.h\n'
252 o = file ('svn_revision.h', 'w')
256 print "Could not open svn_revision.h for writing\n"
259 print "You cannot use \"scons revision\" on without using a checked out"
260 print "copy of the Ardour source code repository"
264 # A generic builder for version.cc files
266 # note: requires that DOMAIN, MAJOR, MINOR, MICRO are set in the construction environment
267 # note: assumes one source files, the header that declares the version variables
270 def version_builder (target, source, env):
272 text = "int " + env['DOMAIN'] + "_major_version = " + str (env['MAJOR']) + ";\n"
273 text += "int " + env['DOMAIN'] + "_minor_version = " + str (env['MINOR']) + ";\n"
274 text += "int " + env['DOMAIN'] + "_micro_version = " + str (env['MICRO']) + ";\n"
277 o = file (target[0].get_path(), 'w')
281 print "Could not open", target[0].get_path(), " for writing\n"
284 text = "#ifndef __" + env['DOMAIN'] + "_version_h__\n"
285 text += "#define __" + env['DOMAIN'] + "_version_h__\n"
286 text += "extern const char* " + env['DOMAIN'] + "_revision;\n"
287 text += "extern int " + env['DOMAIN'] + "_major_version;\n"
288 text += "extern int " + env['DOMAIN'] + "_minor_version;\n"
289 text += "extern int " + env['DOMAIN'] + "_micro_version;\n"
290 text += "#endif /* __" + env['DOMAIN'] + "_version_h__ */\n"
293 o = file (target[1].get_path(), 'w')
297 print "Could not open", target[1].get_path(), " for writing\n"
302 version_bld = Builder (action = version_builder)
303 env.Append (BUILDERS = {'VersionBuild' : version_bld})
306 # a builder that makes a hard link from the 'source' executable to a name with
307 # a "build ID" based on the most recent CVS activity that might be reasonably
308 # related to version activity. this relies on the idea that the SConscript
309 # file that builds the executable is updated with new version info and committed
310 # to the source code repository whenever things change.
313 def versioned_builder(target,source,env):
314 w, r = os.popen2( "LANG= svn info | awk '/^Revision:/ { print $2}'")
316 last_revision = r.readline().strip()
319 if last_revision == "":
320 print "No SVN info found - versioned executable cannot be built"
323 print "The current build ID is " + last_revision
325 tagged_executable = source[0].get_path() + '-' + last_revision
327 if os.path.exists (tagged_executable):
328 print "Replacing existing executable with the same build tag."
329 os.unlink (tagged_executable)
331 return os.link (source[0].get_path(), tagged_executable)
333 verbuild = Builder (action = versioned_builder)
334 env.Append (BUILDERS = {'VersionedExecutable' : verbuild})
337 # source tar file builder
340 def distcopy (target, source, env):
341 treedir = str (target[0])
345 except OSError, (errnum, strerror):
346 if errnum != errno.EEXIST:
347 print 'mkdir ', treedir, ':', strerror
351 # we don't know what characters might be in the file names
352 # so quote them all before passing them to the shell
354 all_files = ([ str(s) for s in source ])
355 cmd += " ".join ([ "'%s'" % quoted for quoted in all_files])
356 cmd += ' | (cd ' + treedir + ' && tar xf -)'
360 def tarballer (target, source, env):
361 cmd = 'tar -jcf ' + str (target[0]) + ' ' + str(source[0]) + " --exclude '*~'"
362 print 'running ', cmd, ' ... '
366 dist_bld = Builder (action = distcopy,
367 target_factory = SCons.Node.FS.default_fs.Entry,
368 source_factory = SCons.Node.FS.default_fs.Entry,
371 tarball_bld = Builder (action = tarballer,
372 target_factory = SCons.Node.FS.default_fs.Entry,
373 source_factory = SCons.Node.FS.default_fs.Entry)
375 env.Append (BUILDERS = {'Distribute' : dist_bld})
376 env.Append (BUILDERS = {'Tarball' : tarball_bld})
379 # Make sure they know what they are doing
383 sys.stdout.write ("Are you building Ardour for personal use (rather than distribution to others)? [no]: ")
384 answer = sys.stdin.readline ()
385 answer = answer.rstrip().strip()
386 if answer != "yes" and answer != "y":
387 print 'You cannot build Ardour with VST support for distribution to others.\nIt is a violation of several different licenses. Build with VST=false.'
390 print "OK, VST support will be enabled"
393 #######################
394 # Dependency Checking #
395 #######################
399 'glib-2.0' : '2.10.1',
400 'gthread-2.0' : '2.10.1',
401 'gtk+-2.0' : '2.8.1',
402 'libxml-2.0' : '2.6.0',
403 'samplerate' : '0.1.0',
407 'libgnomecanvas-2.0' : '2.0'
410 def DependenciesRequiredMessage():
411 print 'You do not have the necessary dependencies required to build ardour'
412 print 'Please consult http://ardour.org/building for more information'
414 def CheckPKGConfig(context, version):
415 context.Message( 'Checking for pkg-config version >= %s... ' %version )
416 ret = context.TryAction('pkg-config --atleast-pkgconfig-version=%s' % version)[0]
417 context.Result( ret )
420 def CheckPKGVersion(context, name, version):
421 context.Message( 'Checking for %s... ' % name )
422 ret = context.TryAction('pkg-config --atleast-version=%s %s' %(version,name) )[0]
423 context.Result( ret )
426 conf = Configure(env, custom_tests = { 'CheckPKGConfig' : CheckPKGConfig,
427 'CheckPKGVersion' : CheckPKGVersion })
429 # I think a more recent version is needed on win32
430 min_pkg_config_version = '0.8.0'
432 if not conf.CheckPKGConfig(min_pkg_config_version):
433 print 'pkg-config >= %s not found.' % min_pkg_config_version
436 for pkg, version in deps.iteritems():
437 if not conf.CheckPKGVersion( pkg, version ):
438 print '%s >= %s not found.' %(pkg, version)
439 DependenciesRequiredMessage()
444 # ----------------------------------------------------------------------
445 # Construction environment setup
446 # ----------------------------------------------------------------------
450 libraries['core'] = LibraryInfo (CCFLAGS = '-Ilibs')
452 #libraries['sndfile'] = LibraryInfo()
453 #libraries['sndfile'].ParseConfig('pkg-config --cflags --libs sndfile')
455 libraries['lrdf'] = LibraryInfo()
456 libraries['lrdf'].ParseConfig('pkg-config --cflags --libs lrdf')
458 libraries['raptor'] = LibraryInfo()
459 libraries['raptor'].ParseConfig('pkg-config --cflags --libs raptor')
461 libraries['samplerate'] = LibraryInfo()
462 libraries['samplerate'].ParseConfig('pkg-config --cflags --libs samplerate')
464 if env['FFT_ANALYSIS']:
465 libraries['fftw3f'] = LibraryInfo()
466 libraries['fftw3f'].ParseConfig('pkg-config --cflags --libs fftw3f')
468 # Check for fftw3 header as well as the library
469 conf = Configure (libraries['fftw3f'])
470 if conf.CheckHeader ('fftw3.h') == False:
471 print "FFT Analysis cannot be compiled without the FFTW3 headers, which don't seem to be installed"
473 libraries['fftw3f'] = conf.Finish();
475 libraries['jack'] = LibraryInfo()
476 libraries['jack'].ParseConfig('pkg-config --cflags --libs jack')
478 libraries['xml'] = LibraryInfo()
479 libraries['xml'].ParseConfig('pkg-config --cflags --libs libxml-2.0')
481 libraries['xslt'] = LibraryInfo()
482 libraries['xslt'].ParseConfig('pkg-config --cflags --libs libxslt')
484 libraries['glib2'] = LibraryInfo()
485 libraries['glib2'].ParseConfig ('pkg-config --cflags --libs glib-2.0')
486 libraries['glib2'].ParseConfig ('pkg-config --cflags --libs gobject-2.0')
487 libraries['glib2'].ParseConfig ('pkg-config --cflags --libs gmodule-2.0')
488 libraries['glib2'].ParseConfig ('pkg-config --cflags --libs gthread-2.0')
490 libraries['gtk2'] = LibraryInfo()
491 libraries['gtk2'].ParseConfig ('pkg-config --cflags --libs gtk+-2.0')
493 libraries['pango'] = LibraryInfo()
494 libraries['pango'].ParseConfig ('pkg-config --cflags --libs pango')
496 libraries['libgnomecanvas2'] = LibraryInfo()
497 libraries['libgnomecanvas2'].ParseConfig ('pkg-config --cflags --libs libgnomecanvas-2.0')
499 #libraries['flowcanvas'] = LibraryInfo(LIBS='flowcanvas', LIBPATH='#/libs/flowcanvas', CPPPATH='#libs/flowcanvas')
501 # The Ardour Control Protocol Library
503 libraries['ardour_cp'] = LibraryInfo (LIBS='ardour_cp', LIBPATH='#libs/surfaces/control_protocol',
504 CPPPATH='#libs/surfaces/control_protocol')
506 # The Ardour backend/engine
508 libraries['ardour'] = LibraryInfo (LIBS='ardour', LIBPATH='#libs/ardour', CPPPATH='#libs/ardour')
509 libraries['midi++2'] = LibraryInfo (LIBS='midi++', LIBPATH='#libs/midi++2', CPPPATH='#libs/midi++2')
510 libraries['pbd'] = LibraryInfo (LIBS='pbd', LIBPATH='#libs/pbd', CPPPATH='#libs/pbd')
511 libraries['gtkmm2ext'] = LibraryInfo (LIBS='gtkmm2ext', LIBPATH='#libs/gtkmm2ext', CPPPATH='#libs/gtkmm2ext')
514 # SCons should really do this for us
516 conf = Configure (env)
518 have_cxx = conf.TryAction (Action (str(env['CXX']) + ' --version'))
520 print "This system has no functional C++ compiler. You cannot build Ardour from source without one."
523 print "Congratulations, you have a functioning C++ compiler."
529 # Compiler flags and other system-dependent stuff
533 debug_flags = [ '-g' ]
535 # guess at the platform, used to define compiler flags
537 config_guess = os.popen("tools/config.guess").read()[:-1]
543 config = config_guess.split ("-")
545 print "system triple: " + config_guess
548 if env['DIST_TARGET'] == 'auto':
549 if config[config_arch] == 'apple':
550 # The [.] matches to the dot after the major version, "." would match any character
551 if re.search ("darwin[0-7][.]", config[config_kernel]) != None:
552 env['DIST_TARGET'] = 'panther'
554 env['DIST_TARGET'] = 'tiger'
556 if re.search ("x86_64", config[config_cpu]) != None:
557 env['DIST_TARGET'] = 'x86_64'
558 elif re.search("i[0-5]86", config[config_cpu]) != None:
559 env['DIST_TARGET'] = 'i386'
560 elif re.search("powerpc", config[config_cpu]) != None:
561 env['DIST_TARGET'] = 'powerpc'
563 env['DIST_TARGET'] = 'i686'
564 print "\n*******************************"
565 print "detected DIST_TARGET = " + env['DIST_TARGET']
566 print "*******************************\n"
569 if config[config_cpu] == 'powerpc' and env['DIST_TARGET'] != 'none':
571 # Apple/PowerPC optimization options
573 # -mcpu=7450 does not reliably work with gcc 3.*
575 if env['DIST_TARGET'] == 'panther' or env['DIST_TARGET'] == 'tiger':
576 if config[config_arch] == 'apple':
577 ## opt_flags.extend ([ "-mcpu=7450", "-faltivec"])
578 # to support g3s but still have some optimization for above
579 opt_flags.extend ([ "-mcpu=G3", "-mtune=7450"])
581 opt_flags.extend ([ "-mcpu=7400", "-maltivec", "-mabi=altivec"])
583 opt_flags.extend([ "-mcpu=750", "-mmultiple" ])
584 opt_flags.extend (["-mhard-float", "-mpowerpc-gfxopt"])
585 opt_flags.extend (["-Os"])
587 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':
589 build_host_supports_sse = 0
591 debug_flags.append ("-DARCH_X86")
592 opt_flags.append ("-DARCH_X86")
594 if config[config_kernel] == 'linux' :
596 if env['DIST_TARGET'] != 'i386':
598 flag_line = os.popen ("cat /proc/cpuinfo | grep '^flags'").read()[:-1]
599 x86_flags = flag_line.split (": ")[1:][0].split (' ')
601 if "mmx" in x86_flags:
602 opt_flags.append ("-mmmx")
603 if "sse" in x86_flags:
604 build_host_supports_sse = 1
605 if "3dnow" in x86_flags:
606 opt_flags.append ("-m3dnow")
608 if config[config_cpu] == "i586":
609 opt_flags.append ("-march=i586")
610 elif config[config_cpu] == "i686":
611 opt_flags.append ("-march=i686")
613 if ((env['DIST_TARGET'] == 'i686') or (env['DIST_TARGET'] == 'x86_64')) and build_host_supports_sse:
614 opt_flags.extend (["-msse", "-mfpmath=sse"])
615 debug_flags.extend (["-msse", "-mfpmath=sse"])
616 # end of processor-specific section
618 # optimization section
619 if env['FPU_OPTIMIZATION']:
620 if env['DIST_TARGET'] == 'tiger':
621 opt_flags.append ("-DBUILD_VECLIB_OPTIMIZATIONS")
622 debug_flags.append ("-DBUILD_VECLIB_OPTIMIZATIONS")
623 libraries['core'].Append(LINKFLAGS= '-framework Accelerate')
624 elif env['DIST_TARGET'] == 'i686' or env['DIST_TARGET'] == 'x86_64':
625 opt_flags.append ("-DBUILD_SSE_OPTIMIZATIONS")
626 debug_flags.append ("-DBUILD_SSE_OPTIMIZATIONS")
627 if env['DIST_TARGET'] == 'x86_64':
628 opt_flags.append ("-DUSE_X86_64_ASM")
629 debug_flags.append ("-DUSE_X86_64_ASM")
630 if build_host_supports_sse != 1:
631 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)"
632 # end optimization section
634 # handle x86/x86_64 libdir properly
636 if env['DIST_TARGET'] == 'x86_64':
637 env['LIBDIR']='lib64'
642 # save off guessed arch element in an env
644 env.Append(CONFIG_ARCH=config[config_arch])
648 # ARCH="..." overrides all
651 if env['ARCH'] != '':
652 opt_flags = env['ARCH'].split()
655 # prepend boiler plate optimization flags
660 "-fomit-frame-pointer",
663 "-fno-strict-aliasing",
667 if env['DEBUG'] == 1:
668 env.Append(CCFLAGS=" ".join (debug_flags))
670 env.Append(CCFLAGS=" ".join (opt_flags))
676 env.Append(CCFLAGS="-Wall")
677 env.Append(CXXFLAGS="-Woverloaded-virtual")
679 if env['EXTRA_WARN']:
680 env.Append(CCFLAGS="-Wextra -pedantic")
681 env.Append(CXXFLAGS="-ansi")
684 env.Append(CCFLAGS="-DHAVE_LIBLO")
688 # fix scons nitpickiness on APPLE
692 def prep_libcheck(topenv, libinfo):
693 if topenv['DIST_TARGET'] == 'panther' or topenv['DIST_TARGET'] == 'tiger':
694 libinfo.Append(CCFLAGS="-I/opt/local/include", LINKFLAGS="-L/opt/local/lib")
696 prep_libcheck(env, env)
701 libraries['usb'] = LibraryInfo ()
702 prep_libcheck(env, libraries['usb'])
704 conf = Configure (libraries['usb'])
705 if conf.CheckLib ('usb', 'usb_interrupt_write'):
710 libraries['usb'] = conf.Finish ()
715 libraries['flac'] = LibraryInfo ()
716 prep_libcheck(env, libraries['flac'])
717 libraries['flac'].Append(CCFLAGS="-I/usr/local/include", LINKFLAGS="-L/usr/local/lib")
719 conf = Configure (libraries['flac'])
720 conf.CheckLib ('FLAC', 'FLAC__stream_decoder_new', language='CXX')
721 libraries['flac'] = conf.Finish ()
723 # or if that fails...
724 #libraries['flac'] = LibraryInfo (LIBS='FLAC')
726 # boost (we don't link against boost, just use some header files)
728 libraries['boost'] = LibraryInfo ()
729 prep_libcheck(env, libraries['boost'])
730 libraries['boost'].Append(CCFLAGS="-I/usr/local/include", LINKFLAGS="-L/usr/local/lib")
731 conf = Configure (libraries['boost'])
732 if conf.CheckHeader ('boost/shared_ptr.hpp', language='CXX') == False:
733 print "Boost header files do not appear to be installed."
736 libraries['boost'] = conf.Finish ()
742 libraries['lo'] = LibraryInfo ()
743 prep_libcheck(env, libraries['lo'])
745 conf = Configure (libraries['lo'])
746 if conf.CheckLib ('lo', 'lo_server_new') == False:
747 print "liblo does not appear to be installed."
750 libraries['lo'] = conf.Finish ()
755 libraries['dmalloc'] = LibraryInfo ()
756 prep_libcheck(env, libraries['dmalloc'])
759 # look for the threaded version
762 conf = Configure (libraries['dmalloc'])
763 if conf.CheckLib ('dmallocth', 'dmalloc_shutdown'):
764 have_libdmalloc = True
766 have_libdmalloc = False
768 libraries['dmalloc'] = conf.Finish ()
771 # Audio/MIDI library (needed for MIDI, since audio is all handled via JACK)
774 conf = Configure(env)
776 if conf.CheckCHeader('alsa/asoundlib.h'):
777 libraries['sysmidi'] = LibraryInfo (LIBS='asound')
778 env['SYSMIDI'] = 'ALSA Sequencer'
779 subst_dict['%MIDITAG%'] = "seq"
780 subst_dict['%MIDITYPE%'] = "alsa/sequencer"
781 elif conf.CheckCHeader('/System/Library/Frameworks/CoreMIDI.framework/Headers/CoreMIDI.h'):
782 # this line is needed because scons can't handle -framework in ParseConfig() yet.
783 libraries['sysmidi'] = LibraryInfo (LINKFLAGS= '-framework CoreMIDI -framework CoreFoundation -framework CoreAudio -framework CoreServices -framework AudioUnit -framework AudioToolbox -bind_at_load')
784 env['SYSMIDI'] = 'CoreMIDI'
785 subst_dict['%MIDITAG%'] = "ardour"
786 subst_dict['%MIDITYPE%'] = "coremidi"
788 print "It appears you don't have the required MIDI libraries installed. For Linux this means you are missing the development package for ALSA libraries."
797 'sigc++-2.0' : '2.0',
799 'libgnomecanvasmm-2.6' : '2.12.0'
802 conf = Configure(env, custom_tests = { 'CheckPKGConfig' : CheckPKGConfig,
803 'CheckPKGVersion' : CheckPKGVersion })
805 for pkg, version in syslibdeps.iteritems():
806 if not conf.CheckPKGVersion( pkg, version ):
807 print '%s >= %s not found.' %(pkg, version)
808 DependenciesRequiredMessage()
813 libraries['sigc2'] = LibraryInfo()
814 libraries['sigc2'].ParseConfig('pkg-config --cflags --libs sigc++-2.0')
815 libraries['glibmm2'] = LibraryInfo()
816 libraries['glibmm2'].ParseConfig('pkg-config --cflags --libs glibmm-2.4')
817 libraries['gdkmm2'] = LibraryInfo()
818 libraries['gdkmm2'].ParseConfig ('pkg-config --cflags --libs gdkmm-2.4')
819 libraries['gtkmm2'] = LibraryInfo()
820 libraries['gtkmm2'].ParseConfig ('pkg-config --cflags --libs gtkmm-2.4')
821 libraries['atkmm'] = LibraryInfo()
822 libraries['atkmm'].ParseConfig ('pkg-config --cflags --libs atkmm-1.6')
823 libraries['pangomm'] = LibraryInfo()
824 libraries['pangomm'].ParseConfig ('pkg-config --cflags --libs pangomm-1.4')
825 libraries['libgnomecanvasmm'] = LibraryInfo()
826 libraries['libgnomecanvasmm'].ParseConfig ('pkg-config --cflags --libs libgnomecanvasmm-2.6')
829 # cannot use system one for the time being
832 libraries['sndfile-ardour'] = LibraryInfo(LIBS='libsndfile-ardour',
833 LIBPATH='#libs/libsndfile',
834 CPPPATH=['#libs/libsndfile', '#libs/libsndfile/src'])
836 # libraries['libglademm'] = LibraryInfo()
837 # libraries['libglademm'].ParseConfig ('pkg-config --cflags --libs libglademm-2.4')
839 # libraries['flowcanvas'] = LibraryInfo(LIBS='flowcanvas', LIBPATH='#/libs/flowcanvas', CPPPATH='#libs/flowcanvas')
840 libraries['soundtouch'] = LibraryInfo()
841 libraries['soundtouch'].ParseConfig ('pkg-config --cflags --libs soundtouch-1.0')
842 # Comment the previous line and uncomment this for Debian:
843 #libraries['soundtouch'].ParseConfig ('pkg-config --cflags --libs libSoundTouch')
845 libraries['appleutility'] = LibraryInfo(LIBS='libappleutility',
846 LIBPATH='#libs/appleutility',
847 CPPPATH='#libs/appleutility')
858 # these are unconditionally included but have
859 # tests internally to avoid compilation etc
863 # this is unconditionally included but has
864 # tests internally to avoid compilation etc
865 # if COREAUDIO is not set
877 libraries['sigc2'] = LibraryInfo(LIBS='sigc++2',
878 LIBPATH='#libs/sigc++2',
879 CPPPATH='#libs/sigc++2')
880 libraries['glibmm2'] = LibraryInfo(LIBS='glibmm2',
881 LIBPATH='#libs/glibmm2',
882 CPPPATH='#libs/glibmm2')
883 libraries['pangomm'] = LibraryInfo(LIBS='pangomm',
884 LIBPATH='#libs/gtkmm2/pango',
885 CPPPATH='#libs/gtkmm2/pango')
886 libraries['atkmm'] = LibraryInfo(LIBS='atkmm',
887 LIBPATH='#libs/gtkmm2/atk',
888 CPPPATH='#libs/gtkmm2/atk')
889 libraries['gdkmm2'] = LibraryInfo(LIBS='gdkmm2',
890 LIBPATH='#libs/gtkmm2/gdk',
891 CPPPATH='#libs/gtkmm2/gdk')
892 libraries['gtkmm2'] = LibraryInfo(LIBS='gtkmm2',
893 LIBPATH="#libs/gtkmm2/gtk",
894 CPPPATH='#libs/gtkmm2/gtk/')
895 libraries['libgnomecanvasmm'] = LibraryInfo(LIBS='libgnomecanvasmm',
896 LIBPATH='#libs/libgnomecanvasmm',
897 CPPPATH='#libs/libgnomecanvasmm')
899 libraries['soundtouch'] = LibraryInfo(LIBS='soundtouch',
900 LIBPATH='#libs/soundtouch',
901 CPPPATH=['#libs', '#libs/soundtouch'])
902 libraries['sndfile-ardour'] = LibraryInfo(LIBS='libsndfile-ardour',
903 LIBPATH='#libs/libsndfile',
904 CPPPATH=['#libs/libsndfile', '#libs/libsndfile/src'])
905 # libraries['libglademm'] = LibraryInfo(LIBS='libglademm',
906 # LIBPATH='#libs/libglademm',
907 # CPPPATH='#libs/libglademm')
908 libraries['appleutility'] = LibraryInfo(LIBS='libappleutility',
909 LIBPATH='#libs/appleutility',
910 CPPPATH='#libs/appleutility')
923 # these are unconditionally included but have
924 # tests internally to avoid compilation etc
928 # this is unconditionally included but has
929 # tests internally to avoid compilation etc
930 # if COREAUDIO is not set
940 'libs/libgnomecanvasmm',
948 # * always build the LGPL control protocol lib, since we link against it from libardour
949 # * ditto for generic MIDI
950 # * tranzport checks whether it should build internally, but we need here so that
951 # its included in the tarball
954 surface_subdirs = [ 'libs/surfaces/control_protocol', 'libs/surfaces/generic_midi', 'libs/surfaces/tranzport', 'libs/surfaces/mackie' ]
958 env['TRANZPORT'] = 'yes'
959 if os.access ('libs/surfaces/sony9pin', os.F_OK):
960 surface_subdirs += [ 'libs/surfaces/sony9pin' ]
962 opts.Save('scache.conf', env)
963 Help(opts.GenerateHelpText(env))
965 if os.environ.has_key('PATH'):
966 env.Append(PATH = os.environ['PATH'])
968 if os.environ.has_key('PKG_CONFIG_PATH'):
969 env.Append(PKG_CONFIG_PATH = os.environ['PKG_CONFIG_PATH'])
971 if os.environ.has_key('CC'):
972 env['CC'] = os.environ['CC']
974 if os.environ.has_key('CXX'):
975 env['CXX'] = os.environ['CXX']
977 if os.environ.has_key('DISTCC_HOSTS'):
978 env['ENV']['DISTCC_HOSTS'] = os.environ['DISTCC_HOSTS']
979 env['ENV']['HOME'] = os.environ['HOME']
981 final_prefix = '$PREFIX'
984 install_prefix = '$DESTDIR/$PREFIX'
986 install_prefix = env['PREFIX']
988 subst_dict['%INSTALL_PREFIX%'] = install_prefix;
989 subst_dict['%FINAL_PREFIX%'] = final_prefix;
990 subst_dict['%PREFIX%'] = final_prefix;
992 if env['PREFIX'] == '/usr':
993 final_config_prefix = '/etc'
995 final_config_prefix = env['PREFIX'] + '/etc'
997 config_prefix = '$DESTDIR' + final_config_prefix
1000 # everybody needs this
1003 env.Merge ([ libraries['core'] ])
1010 conf = Configure (env)
1012 nls_error = 'This system is not configured for internationalized applications. An english-only version will be built:'
1013 print 'Checking for internationalization support ...'
1014 have_gettext = conf.TryAction(Action('xgettext --version'))
1015 if have_gettext[0] != 1:
1016 nls_error += ' No xgettext command.'
1019 print "Found xgettext"
1021 have_msgmerge = conf.TryAction(Action('msgmerge --version'))
1022 if have_msgmerge[0] != 1:
1023 nls_error += ' No msgmerge command.'
1026 print "Found msgmerge"
1028 if not conf.CheckCHeader('libintl.h'):
1029 nls_error += ' No libintl.h.'
1035 print "International version will be built."
1039 env.Append(CCFLAGS="-DENABLE_NLS")
1041 Export('env install_prefix final_prefix config_prefix final_config_prefix libraries i18n ardour_version subst_dict')
1044 # the configuration file may be system dependent
1047 conf = env.Configure ()
1049 if conf.CheckCHeader('/System/Library/Frameworks/CoreAudio.framework/Versions/A/Headers/CoreAudio.h'):
1050 subst_dict['%JACK_INPUT%'] = "coreaudio:Built-in Audio:in"
1051 subst_dict['%JACK_OUTPUT%'] = "coreaudio:Built-in Audio:out"
1053 subst_dict['%JACK_INPUT%'] = "alsa_pcm:playback_"
1054 subst_dict['%JACK_OUTPUT%'] = "alsa_pcm:capture_"
1056 # posix_memalign available
1057 if not conf.CheckFunc('posix_memalign'):
1058 print 'Did not find posix_memalign(), using malloc'
1059 env.Append(CCFLAGS='-DNO_POSIX_MEMALIGN')
1064 rcbuild = env.SubstInFile ('ardour.rc','ardour.rc.in', SUBST_DICT = subst_dict)
1065 subst_dict['%VERSION%'] = ardour_version[0:3]
1066 subst_dict['%EXTRA_VERSION%'] = ardour_version[3:]
1067 subst_dict['%REVISION_STRING%'] = ''
1068 if os.path.exists('.svn'):
1069 subst_dict['%REVISION_STRING%'] = '.' + fetch_svn_revision ('.') + 'svn'
1071 specbuild = env.SubstInFile ('ardour.spec','ardour.spec.in', SUBST_DICT = subst_dict)
1073 the_revision = env.Command ('frobnicatory_decoy', [], create_stored_revision)
1075 env.Alias('revision', the_revision)
1076 env.Alias('install', env.Install(os.path.join(config_prefix, 'ardour2'), 'ardour_system.rc'))
1077 env.Alias('install', env.Install(os.path.join(config_prefix, 'ardour2'), 'ardour.rc'))
1083 Precious (env['DISTTREE'])
1085 env.Distribute (env['DISTTREE'],
1086 [ 'SConstruct', 'svn_revision.h',
1087 'COPYING', 'PACKAGER_README', 'README',
1091 'tools/config.guess',
1092 'icons/icon/ardour_icon_mac_mask.png',
1093 'icons/icon/ardour_icon_mac.png',
1094 'icons/icon/ardour_icon_tango_16px_blue.png',
1095 'icons/icon/ardour_icon_tango_16px_red.png',
1096 'icons/icon/ardour_icon_tango_22px_blue.png',
1097 'icons/icon/ardour_icon_tango_22px_red.png',
1098 'icons/icon/ardour_icon_tango_32px_blue.png',
1099 'icons/icon/ardour_icon_tango_32px_red.png',
1100 'icons/icon/ardour_icon_tango_48px_blue.png',
1101 'icons/icon/ardour_icon_tango_48px_red.png'
1103 glob.glob ('DOCUMENTATION/AUTHORS*') +
1104 glob.glob ('DOCUMENTATION/CONTRIBUTORS*') +
1105 glob.glob ('DOCUMENTATION/TRANSLATORS*') +
1106 glob.glob ('DOCUMENTATION/BUILD*') +
1107 glob.glob ('DOCUMENTATION/FAQ*') +
1108 glob.glob ('DOCUMENTATION/README*')
1111 srcdist = env.Tarball(env['TARBALL'], [ env['DISTTREE'], the_revision ])
1112 env.Alias ('srctar', srcdist)
1115 # don't leave the distree around
1118 env.AddPreAction (env['DISTTREE'], Action ('rm -rf ' + str (File (env['DISTTREE']))))
1119 env.AddPostAction (srcdist, Action ('rm -rf ' + str (File (env['DISTTREE']))))
1125 for subdir in coredirs:
1126 SConscript (subdir + '/SConscript')
1128 for sublistdir in [ subdirs, gtk_subdirs, surface_subdirs ]:
1129 for subdir in sublistdir:
1130 SConscript (subdir + '/SConscript')
1133 env.Clean ('scrub', [ 'scache.conf', '.sconf_temp', '.sconsign.dblite', 'config.log'])