4 # and there we have it, or do we?
22 EnsureSConsVersion(0, 96)
24 ardour_version = '3.0'
29 # Command-line options
32 opts = Options('scache.conf')
34 ('ARCH', 'Set architecture-specific compilation flags by hand (all flags as 1 argument)',''),
35 ('WINDOWS_KEY', 'Set X Modifier (Mod1,Mod2,Mod3,Mod4,Mod5) for "Windows" key', 'Mod4><Super'),
36 BoolOption('AUDIOUNITS', 'Compile with Apple\'s AudioUnit library. (experimental)', 0),
37 BoolOption('COREAUDIO', 'Compile with Apple\'s CoreAudio library', 0),
38 BoolOption('GTKOSX', 'Compile for use with GTK-OSX, not GTK-X11', 0),
39 BoolOption('OLDFONTS', 'Old school font sizes', 0),
40 BoolOption('DEBUG', 'Set to build with debugging information and no optimizations', 0),
41 BoolOption('STL_DEBUG', 'Set to build with Standard Template Library Debugging', 0),
42 PathOption('DESTDIR', 'Set the intermediate install "prefix"', '/'),
43 EnumOption('DIST_TARGET', 'Build target for cross compiling packagers', 'auto', allowed_values=('auto', 'i386', 'i686', 'x86_64', 'powerpc', 'tiger', 'panther', 'leopard', 'none' ), ignorecase=2),
44 BoolOption('DMALLOC', 'Compile and link using the dmalloc library', 0),
45 BoolOption('EXTRA_WARN', 'Compile with -Wextra, -ansi, and -pedantic. Might break compilation. For pedants', 0),
46 BoolOption('FREESOUND', 'Include Freesound database lookup', 0),
47 BoolOption('FPU_OPTIMIZATION', 'Build runtime checked assembler code', 1),
48 BoolOption('NLS', 'Set to turn on i18n support', 1),
49 PathOption('PREFIX', 'Set the install "prefix"', '/usr/local'),
50 BoolOption('SURFACES', 'Build support for control surfaces', 1),
51 BoolOption('WIIMOTE', 'Build the wiimote control surface', 0),
52 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),
53 BoolOption('UNIVERSAL', 'Compile as universal binary. Requires that external libraries are already universal.', 0),
54 BoolOption('VERSIONED', 'Add revision information to ardour/gtk executable name inside the build directory', 0),
55 BoolOption('VST', 'Compile with support for VST', 0),
56 BoolOption('LV2', 'Compile with support for LV2 (if slv2 is available)', 1),
57 BoolOption('GPROFILE', 'Compile with support for gprofile (Developers only)', 0),
58 BoolOption('FREEDESKTOP', 'Install MIME type, icons and .desktop file as per the freedesktop.org spec (requires xdg-utils and shared-mime-info). "scons uninstall" removes associations in desktop database', 0),
59 BoolOption('TRANZPORT', 'Compile with support for Frontier Designs (if libusb is available)', 1),
60 BoolOption('AUBIO', "Use Paul Brossier's aubio library for feature detection (if available)", 1)
63 #----------------------------------------------------------------------
64 # a handy helper that provides a way to merge compile/link information
65 # from multiple different "environments"
66 #----------------------------------------------------------------------
68 class LibraryInfo(Environment):
69 def __init__(self,*args,**kw):
70 Environment.__init__ (self,*args,**kw)
72 def Merge (self,others):
74 self.Append (LIBS = other.get ('LIBS',[]))
75 self.Append (LIBPATH = other.get ('LIBPATH', []))
76 self.Append (CPPPATH = other.get('CPPPATH', []))
77 self.Append (LINKFLAGS = other.get('LINKFLAGS', []))
78 self.Append (CCFLAGS = other.get('CCFLAGS', []))
79 self.Replace(LIBPATH = list(Set(self.get('LIBPATH', []))))
80 self.Replace(CPPPATH = list(Set(self.get('CPPPATH',[]))))
81 #doing LINKFLAGS breaks -framework
82 #doing LIBS break link order dependency
84 def ENV_update(self, src_ENV):
85 for k in src_ENV.keys():
86 if k in self['ENV'].keys() and k in [ 'PATH', 'LD_LIBRARY_PATH',
88 self['ENV'][k]=SCons.Util.AppendPath(self['ENV'][k], src_ENV[k])
90 self['ENV'][k]=src_ENV[k]
92 env = LibraryInfo (options = opts,
94 VERSION = ardour_version,
95 TARBALL='ardour-' + ardour_version + '.tar.bz2',
97 DISTTREE = '#ardour-' + ardour_version,
98 DISTCHECKDIR = '#ardour-' + ardour_version + '/check'
101 env.ENV_update(os.environ)
103 #----------------------------------------------------------------------
105 #----------------------------------------------------------------------
107 # Handy subst-in-file builder
110 def do_subst_in_file(targetfile, sourcefile, dict):
111 """Replace all instances of the keys of dict with their values.
112 For example, if dict is {'%VERSION%': '1.2345', '%BASE%': 'MyProg'},
113 then all instances of %VERSION% in the file will be replaced with 1.2345 etc.
116 f = open(sourcefile, 'rb')
120 raise SCons.Errors.UserError, "Can't read source file %s"%sourcefile
121 for (k,v) in dict.items():
122 contents = re.sub(k, v, contents)
124 f = open(targetfile, 'wb')
128 raise SCons.Errors.UserError, "Can't write target file %s"%targetfile
131 def subst_in_file(target, source, env):
132 if not env.has_key('SUBST_DICT'):
133 raise SCons.Errors.UserError, "SubstInFile requires SUBST_DICT to be set."
134 d = dict(env['SUBST_DICT']) # copy it
135 for (k,v) in d.items():
137 d[k] = env.subst(v())
138 elif SCons.Util.is_String(v):
141 raise SCons.Errors.UserError, "SubstInFile: key %s: %s must be a string or callable"%(k, repr(v))
142 for (t,s) in zip(target, source):
143 return do_subst_in_file(str(t), str(s), d)
145 def subst_in_file_string(target, source, env):
146 """This is what gets printed on the console."""
147 return '\n'.join(['Substituting vars from %s into %s'%(str(s), str(t))
148 for (t,s) in zip(target, source)])
150 def subst_emitter(target, source, env):
151 """Add dependency from substituted SUBST_DICT to target.
152 Returns original target, source tuple unchanged.
154 d = env['SUBST_DICT'].copy() # copy it
155 for (k,v) in d.items():
157 d[k] = env.subst(v())
158 elif SCons.Util.is_String(v):
160 Depends(target, SCons.Node.Python.Value(d))
161 # Depends(target, source) # this doesn't help the install-sapphire-linux.sh problem
162 return target, source
164 subst_action = Action (subst_in_file, subst_in_file_string)
165 env['BUILDERS']['SubstInFile'] = Builder(action=subst_action, emitter=subst_emitter)
168 # internationalization
171 # po_builder: builder function to copy po files to the parent directory while updating them
173 # first source: .po file
174 # second source: .pot file
177 def po_builder(target,source,env):
178 os.spawnvp (os.P_WAIT, 'cp', ['cp', str(source[0]), str(target[0])])
184 print 'Updating ' + str(target[0])
185 return os.spawnvp (os.P_WAIT, 'msgmerge', args)
187 po_bld = Builder (action = po_builder)
188 env.Append(BUILDERS = {'PoBuild' : po_bld})
190 # mo_builder: builder function for (binary) message catalogs (.mo)
192 # first source: .po file
195 def mo_builder(target,source,env):
199 target[0].get_path(),
202 return os.spawnvp (os.P_WAIT, 'msgfmt', args)
204 mo_bld = Builder (action = mo_builder)
205 env.Append(BUILDERS = {'MoBuild' : mo_bld})
207 # pot_builder: builder function for message templates (.pot)
209 # source: list of C/C++ etc. files to extract messages from
212 def pot_builder(target,source,env):
217 '-o', target[0].get_path(),
218 "--default-domain=" + env['PACKAGE'],
219 '--copyright-holder="Paul Davis"' ]
220 args += [ src.get_path() for src in source ]
222 return os.spawnvp (os.P_WAIT, 'xgettext', args)
224 pot_bld = Builder (action = pot_builder)
225 env.Append(BUILDERS = {'PotBuild' : pot_bld})
228 # utility function, not a builder
231 def i18n (buildenv, sources, installenv):
232 domain = buildenv['PACKAGE']
233 potfile = buildenv['POTFILE']
235 installenv.Alias ('potupdate', buildenv.PotBuild (potfile, sources))
237 p_oze = [ os.path.basename (po) for po in glob.glob ('po/*.po') ]
238 languages = [ po.replace ('.po', '') for po in p_oze ]
240 for po_file in p_oze:
241 buildenv.PoBuild(po_file, ['po/'+po_file, potfile])
242 mo_file = po_file.replace (".po", ".mo")
243 installenv.Alias ('install', buildenv.MoBuild (mo_file, po_file))
244 installenv.Alias ('msgupdate', buildenv.MoBuild (mo_file, po_file))
246 for lang in languages:
247 modir = (os.path.join (install_prefix, 'share/locale/' + lang + '/LC_MESSAGES/'))
248 moname = domain + '.mo'
249 installenv.Alias('install', installenv.InstallAs (os.path.join (modir, moname), lang + '.mo'))
252 def fetch_svn_revision (path):
256 cmd += " | awk '/^Revision:/ { print $2}'"
257 return commands.getoutput (cmd)
259 def fetch_git_revision (path):
261 cmd += "git log --abbrev HEAD^..HEAD "
263 output = commands.getoutput (cmd)
264 output = output.splitlines ()
266 rev = output[0].replace ("commit", "git")[0:10]
269 if "git-svn-id" in line:
270 line = line.split('@')
271 line = line[1].split(' ')
278 def create_stored_revision (target = None, source = None, env = None):
280 if os.path.exists('.svn'):
281 rev = fetch_svn_revision ('.');
282 elif os.path.exists('.git'):
283 rev = fetch_git_revision ('.');
284 elif os.path.exists('libs/ardour/svn_revision.cc'):
285 print "Using packaged svn revision"
288 if not os.path.exists('libs/ardour/ardour/svn_revision.h'):
289 print "This release of ardour is missing libs/ardour/ardour/svn_revision.h. Blame the packager."
293 text = "#include <ardour/svn_revision.h>\n"
294 text += "namespace ARDOUR {\n";
295 text += "extern const char* svn_revision = \"" + rev + "\";\n";
297 print '============> writing svn revision info to libs/ardour/svn_revision.cc\n'
298 o = file ('libs/ardour/svn_revision.cc', 'w')
302 print "Could not open libs/ardour/svn_revision.cc for writing\n"
306 # A generic builder for version.cc files
308 # note: requires that DOMAIN, MAJOR, MINOR, MICRO are set in the construction environment
309 # note: assumes one source files, the header that declares the version variables
312 def version_builder (target, source, env):
314 text = "int " + env['DOMAIN'] + "_major_version = " + str (env['MAJOR']) + ";\n"
315 text += "int " + env['DOMAIN'] + "_minor_version = " + str (env['MINOR']) + ";\n"
316 text += "int " + env['DOMAIN'] + "_micro_version = " + str (env['MICRO']) + ";\n"
319 o = file (target[0].get_path(), 'w')
323 print "Could not open", target[0].get_path(), " for writing\n"
326 text = "#ifndef __" + env['DOMAIN'] + "_version_h__\n"
327 text += "#define __" + env['DOMAIN'] + "_version_h__\n"
328 text += "extern const char* " + env['DOMAIN'] + "_revision;\n"
329 text += "extern int " + env['DOMAIN'] + "_major_version;\n"
330 text += "extern int " + env['DOMAIN'] + "_minor_version;\n"
331 text += "extern int " + env['DOMAIN'] + "_micro_version;\n"
332 text += "#endif /* __" + env['DOMAIN'] + "_version_h__ */\n"
335 o = file (target[1].get_path(), 'w')
339 print "Could not open", target[1].get_path(), " for writing\n"
344 version_bld = Builder (action = version_builder)
345 env.Append (BUILDERS = {'VersionBuild' : version_bld})
348 # a builder that makes a hard link from the 'source' executable to a name with
349 # a "build ID" based on the most recent CVS activity that might be reasonably
350 # related to version activity. this relies on the idea that the SConscript
351 # file that builds the executable is updated with new version info and committed
352 # to the source code repository whenever things change.
355 def versioned_builder(target,source,env):
356 w, r = os.popen2( "LANG= svn info | awk '/^Revision:/ { print $2}'")
358 last_revision = r.readline().strip()
361 if last_revision == "":
362 print "No SVN info found - versioned executable cannot be built"
365 print "The current build ID is " + last_revision
367 tagged_executable = source[0].get_path() + '-' + last_revision
369 if os.path.exists (tagged_executable):
370 print "Replacing existing executable with the same build tag."
371 os.unlink (tagged_executable)
373 return os.link (source[0].get_path(), tagged_executable)
375 verbuild = Builder (action = versioned_builder)
376 env.Append (BUILDERS = {'VersionedExecutable' : verbuild})
379 # source tar file builder
382 def distcopy (target, source, env):
383 treedir = str (target[0])
387 except OSError, (errnum, strerror):
388 if errnum != errno.EEXIST:
389 print 'mkdir ', treedir, ':', strerror
393 # we don't know what characters might be in the file names
394 # so quote them all before passing them to the shell
396 all_files = ([ str(s) for s in source ])
397 cmd += " ".join ([ "'%s'" % quoted for quoted in all_files])
398 cmd += ' | (cd ' + treedir + ' && tar xf -)'
402 def tarballer (target, source, env):
403 cmd = 'tar -jcf ' + str (target[0]) + ' ' + str(source[0]) + " --exclude '*~'" + " --exclude .svn --exclude '.svn/*'"
404 print 'running ', cmd, ' ... '
408 dist_bld = Builder (action = distcopy,
409 target_factory = SCons.Node.FS.default_fs.Entry,
410 source_factory = SCons.Node.FS.default_fs.Entry,
413 tarball_bld = Builder (action = tarballer,
414 target_factory = SCons.Node.FS.default_fs.Entry,
415 source_factory = SCons.Node.FS.default_fs.Entry)
417 env.Append (BUILDERS = {'Distribute' : dist_bld})
418 env.Append (BUILDERS = {'Tarball' : tarball_bld})
424 def pushEnvironment(context):
425 if os.environ.has_key('PATH'):
426 context.Append(PATH = os.environ['PATH'])
427 context['ENV']['PATH'] = os.environ['PATH']
429 if os.environ.has_key('PKG_CONFIG_PATH'):
430 context.Append(PKG_CONFIG_PATH = os.environ['PKG_CONFIG_PATH'])
431 context['ENV']['PKG_CONFIG_PATH'] = os.environ['PKG_CONFIG_PATH']
433 if os.environ.has_key('CC'):
434 context['CC'] = os.environ['CC']
436 if os.environ.has_key('CXX'):
437 context['CXX'] = os.environ['CXX']
439 if os.environ.has_key('DISTCC_HOSTS'):
440 context['ENV']['DISTCC_HOSTS'] = os.environ['DISTCC_HOSTS']
441 context['ENV']['HOME'] = os.environ['HOME']
443 pushEnvironment (env)
445 #######################
446 # Dependency Checking #
447 #######################
451 'glib-2.0' : '2.10.1',
452 'gthread-2.0' : '2.10.1',
453 'gtk+-2.0' : '2.12.1',
454 'libxml-2.0' : '2.6.0',
455 'samplerate' : '0.1.0',
459 'libgnomecanvas-2.0' : '2.0',
466 def DependenciesRequiredMessage():
467 print 'You do not have the necessary dependencies required to build ardour'
468 print 'Please consult http://ardour.org/building for more information'
470 def CheckPKGConfig(context, version):
471 context.Message( 'Checking for pkg-config version >= %s... ' %version )
472 ret = context.TryAction('pkg-config --atleast-pkgconfig-version=%s' % version)[0]
473 context.Result( ret )
476 def CheckPKGVersion(context, name, version):
477 context.Message( 'Checking for %s... ' % name )
478 ret = context.TryAction('pkg-config --atleast-version=%s %s' %(version,name) )[0]
479 context.Result( ret )
482 def CheckPKGExists(context, name):
483 context.Message ('Checking for %s...' % name)
484 ret = context.TryAction('pkg-config --exists %s' % name)[0]
488 conf = Configure(env, custom_tests = { 'CheckPKGConfig' : CheckPKGConfig,
489 'CheckPKGVersion' : CheckPKGVersion })
491 # I think a more recent version is needed on win32
492 min_pkg_config_version = '0.8.0'
494 if not conf.CheckPKGConfig(min_pkg_config_version):
495 print 'pkg-config >= %s not found.' % min_pkg_config_version
498 for pkg, version in deps.iteritems():
499 if not conf.CheckPKGVersion( pkg, version ):
500 print '%s >= %s not found.' %(pkg, version)
501 DependenciesRequiredMessage()
506 # ----------------------------------------------------------------------
507 # Construction environment setup
508 # ----------------------------------------------------------------------
512 libraries['core'] = LibraryInfo (CCFLAGS = '-Ilibs')
514 libraries['sndfile'] = LibraryInfo()
515 libraries['sndfile'].ParseConfig('pkg-config --cflags --libs sndfile')
517 libraries['lrdf'] = LibraryInfo()
518 libraries['lrdf'].ParseConfig('pkg-config --cflags --libs lrdf')
520 libraries['raptor'] = LibraryInfo()
521 libraries['raptor'].ParseConfig('pkg-config --cflags --libs raptor')
523 libraries['samplerate'] = LibraryInfo()
524 libraries['samplerate'].ParseConfig('pkg-config --cflags --libs samplerate')
526 conf = env.Configure (custom_tests = { 'CheckPKGExists' : CheckPKGExists } )
528 if conf.CheckPKGExists ('fftw3f'):
529 libraries['fftw3f'] = LibraryInfo()
530 libraries['fftw3f'].ParseConfig('pkg-config --cflags --libs fftw3f')
532 if conf.CheckPKGExists ('fftw3'):
533 libraries['fftw3'] = LibraryInfo()
534 libraries['fftw3'].ParseConfig('pkg-config --cflags --libs fftw3')
536 if conf.CheckPKGExists ('aubio'):
537 libraries['aubio'] = LibraryInfo()
538 libraries['aubio'].ParseConfig('pkg-config --cflags --libs aubio')
546 # Check for fftw3 header as well as the library
549 conf = Configure(libraries['fftw3'])
551 if conf.CheckHeader ('fftw3.h') == False:
552 print ('Ardour cannot be compiled without the FFTW3 headers, which do not seem to be installed')
558 # Check for curl header as well as the library
561 libraries['curl'] = LibraryInfo()
563 conf = Configure(libraries['curl'])
565 if conf.CheckHeader ('curl/curl.h') == False:
566 print ('Ardour cannot be compiled without the curl headers, which do not seem to be installed')
569 libraries['curl'].ParseConfig('pkg-config --cflags --libs libcurl')
572 print 'FREESOUND support is not enabled. Build with \'scons FREESOUND=1\' to enable.'
575 conf = env.Configure(custom_tests = { 'CheckPKGVersion' : CheckPKGVersion})
577 if conf.CheckPKGVersion('slv2', '0.6.4'):
578 libraries['slv2'] = LibraryInfo()
579 libraries['slv2'].ParseConfig('pkg-config --cflags --libs slv2')
580 env.Append (CCFLAGS="-DHAVE_SLV2")
582 print 'LV2 support is not enabled (SLV2 not found or older than 0.6.4 (svn))'
586 print 'LV2 support is not enabled. Build with \'scons LV2=1\' to enable.'
588 if not env['WIIMOTE']:
589 print 'WIIMOTE not enabled. Build with \'scons WIIMOTE=1\' to enable support.'
591 libraries['jack'] = LibraryInfo()
592 libraries['jack'].ParseConfig('pkg-config --cflags --libs jack')
594 libraries['xml'] = LibraryInfo()
595 libraries['xml'].ParseConfig('pkg-config --cflags --libs libxml-2.0')
597 libraries['xslt'] = LibraryInfo()
598 libraries['xslt'].ParseConfig('pkg-config --cflags --libs libxslt')
600 libraries['uuid'] = LibraryInfo()
601 libraries['uuid'].ParseConfig('pkg-config --cflags --libs uuid')
603 libraries['glib2'] = LibraryInfo()
604 libraries['glib2'].ParseConfig ('pkg-config --cflags --libs glib-2.0')
605 libraries['glib2'].ParseConfig ('pkg-config --cflags --libs gobject-2.0')
606 libraries['glib2'].ParseConfig ('pkg-config --cflags --libs gmodule-2.0')
607 libraries['glib2'].ParseConfig ('pkg-config --cflags --libs gthread-2.0')
609 libraries['freetype2'] = LibraryInfo()
610 libraries['freetype2'].ParseConfig ('pkg-config --cflags --libs freetype2')
612 libraries['gtk2'] = LibraryInfo()
613 libraries['gtk2'].ParseConfig ('pkg-config --cflags --libs gtk+-2.0')
615 libraries['pango'] = LibraryInfo()
616 libraries['pango'].ParseConfig ('pkg-config --cflags --libs pango')
618 libraries['pangocairo'] = LibraryInfo()
619 libraries['pangocairo'].ParseConfig ('pkg-config --cflags --libs pangocairo')
621 libraries['libgnomecanvas2'] = LibraryInfo()
622 libraries['libgnomecanvas2'].ParseConfig ('pkg-config --cflags --libs libgnomecanvas-2.0')
624 #libraries['flowcanvas'] = LibraryInfo(LIBS='flowcanvas', LIBPATH='#/libs/flowcanvas', CPPPATH='#libs/flowcanvas')
626 # The Ardour Control Protocol Library
628 libraries['ardour_cp'] = LibraryInfo (LIBS='ardour_cp', LIBPATH='#libs/surfaces/control_protocol',
629 CPPPATH='#libs/surfaces/control_protocol')
631 # The Ardour backend/engine
633 libraries['ardour'] = LibraryInfo (LIBS='ardour', LIBPATH='#libs/ardour', CPPPATH='#libs/ardour')
634 libraries['midi++2'] = LibraryInfo (LIBS='midi++', LIBPATH='#libs/midi++2', CPPPATH='#libs/midi++2')
635 libraries['smf'] = LibraryInfo (LIBS='smf', LIBPATH='#libs/evoral/src/libsmf', CPPPATH='#libs/evoral/src/libsmf/')
636 libraries['evoral'] = LibraryInfo (LIBS='evoral', LIBPATH='#libs/evoral', CPPPATH='#libs/evoral')
637 libraries['pbd'] = LibraryInfo (LIBS='pbd', LIBPATH='#libs/pbd', CPPPATH='#libs/pbd')
638 libraries['gtkmm2ext'] = LibraryInfo (LIBS='gtkmm2ext', LIBPATH='#libs/gtkmm2ext', CPPPATH='#libs/gtkmm2ext')
641 # SCons should really do this for us
643 conf = env.Configure ()
645 have_cxx = conf.TryAction (Action (str(env['CXX']) + ' --version'))
647 print "This system has no functional C++ compiler. You cannot build Ardour from source without one."
650 print "Congratulations, you have a functioning C++ compiler."
656 # Compiler flags and other system-dependent stuff
660 if env['GPROFILE'] == 1:
661 debug_flags = [ '-O0', '-g', '-pg' ]
663 debug_flags = [ '-O0', '-g' ]
665 # guess at the platform, used to define compiler flags
667 config_guess = os.popen("tools/config.guess").read()[:-1]
673 config = config_guess.split ("-")
675 print "system triple: " + config_guess
678 if env['DIST_TARGET'] == 'auto':
679 if config[config_arch] == 'apple':
680 # The [.] matches to the dot after the major version, "." would match any character
681 if re.search ("darwin[0-7][.]", config[config_kernel]) != None:
682 env['DIST_TARGET'] = 'panther'
683 if re.search ("darwin8[.]", config[config_kernel]) != None:
684 env['DIST_TARGET'] = 'tiger'
686 env['DIST_TARGET'] = 'leopard'
688 if re.search ("x86_64", config[config_cpu]) != None:
689 env['DIST_TARGET'] = 'x86_64'
690 elif re.search("i[0-5]86", config[config_cpu]) != None:
691 env['DIST_TARGET'] = 'i386'
692 elif re.search("powerpc", config[config_cpu]) != None:
693 env['DIST_TARGET'] = 'powerpc'
695 env['DIST_TARGET'] = 'i686'
696 print "\n*******************************"
697 print "detected DIST_TARGET = " + env['DIST_TARGET']
698 print "*******************************\n"
701 if config[config_cpu] == 'powerpc' and env['DIST_TARGET'] != 'none':
703 # Apple/PowerPC optimization options
705 # -mcpu=7450 does not reliably work with gcc 3.*
707 if env['DIST_TARGET'] == 'panther' or env['DIST_TARGET'] == 'tiger':
708 if config[config_arch] == 'apple':
709 ## opt_flags.extend ([ "-mcpu=7450", "-faltivec"])
710 # to support g3s but still have some optimization for above
711 opt_flags.extend ([ "-mcpu=G3", "-mtune=7450"])
713 opt_flags.extend ([ "-mcpu=7400", "-maltivec", "-mabi=altivec"])
715 opt_flags.extend([ "-mcpu=750", "-mmultiple" ])
716 opt_flags.extend (["-mhard-float", "-mpowerpc-gfxopt"])
717 opt_flags.extend (["-Os"])
719 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':
721 build_host_supports_sse = 0
724 # ARCH_X86 means anything in the x86 family from i386 to x86_64
725 # USE_X86_64_ASM is used to distingush 32 and 64 bit assembler
728 if (re.search ("(i[0-9]86|x86_64)", config[config_cpu]) != None):
729 debug_flags.append ("-DARCH_X86")
730 opt_flags.append ("-DARCH_X86")
732 if config[config_kernel] == 'linux' :
734 if env['DIST_TARGET'] != 'i386':
736 flag_line = os.popen ("cat /proc/cpuinfo | grep '^flags'").read()[:-1]
737 x86_flags = flag_line.split (": ")[1:][0].split ()
739 if "mmx" in x86_flags:
740 opt_flags.append ("-mmmx")
741 if "sse" in x86_flags:
742 build_host_supports_sse = 1
743 if "3dnow" in x86_flags:
744 opt_flags.append ("-m3dnow")
746 if config[config_cpu] == "i586":
747 opt_flags.append ("-march=i586")
748 elif config[config_cpu] == "i686":
749 opt_flags.append ("-march=i686")
751 if ((env['DIST_TARGET'] == 'i686') or (env['DIST_TARGET'] == 'x86_64')) and build_host_supports_sse:
752 opt_flags.extend (["-msse", "-mfpmath=sse", "-DUSE_XMMINTRIN"])
753 debug_flags.extend (["-msse", "-mfpmath=sse", "-DUSE_XMMINTRIN"])
754 # end of processor-specific section
756 # optimization section
757 if env['FPU_OPTIMIZATION']:
758 if env['DIST_TARGET'] == 'tiger' or env['DIST_TARGET'] == 'leopard':
759 opt_flags.append ("-DBUILD_VECLIB_OPTIMIZATIONS");
760 debug_flags.append ("-DBUILD_VECLIB_OPTIMIZATIONS");
761 libraries['core'].Append(LINKFLAGS= '-framework Accelerate')
762 elif env['DIST_TARGET'] == 'i686' or env['DIST_TARGET'] == 'x86_64':
763 opt_flags.append ("-DBUILD_SSE_OPTIMIZATIONS")
764 debug_flags.append ("-DBUILD_SSE_OPTIMIZATIONS")
765 if env['DIST_TARGET'] == 'x86_64':
766 opt_flags.append ("-DUSE_X86_64_ASM")
767 debug_flags.append ("-DUSE_X86_64_ASM")
768 if build_host_supports_sse != 1:
769 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)"
770 # end optimization section
772 # handle x86/x86_64 libdir properly
774 if env['DIST_TARGET'] == 'x86_64':
775 env['LIBDIR']='lib64'
783 if env['DIST_TARGET'] == 'x86_64' and env['VST']:
784 print "\n\n=================================================="
785 print "You cannot use VST plugins with a 64 bit host. Please run scons with VST=0"
786 print "\nIt is theoretically possible to build a 32 bit host on a 64 bit system."
787 print "However, this is tricky and not recommended for beginners."
791 # a single way to test if we're on OS X
794 if env['DIST_TARGET'] in ['panther', 'tiger', 'leopard' ]:
796 # force tiger or later, to avoid issues on PPC which defaults
797 # back to 10.1 if we don't tell it otherwise.
798 env.Append (CCFLAGS="-DMAC_OS_X_VERSION_MIN_REQUIRED=1040")
800 if env['DIST_TARGET'] == 'leopard':
801 # need this to really build against the 10.4 SDK when building on leopard
802 # ideally this would be configurable, but lets just do that later when we need it
803 env.Append(CCFLAGS="-mmacosx-version-min=10.4 -isysroot /Developer/SDKs/MacOSX10.4u.sdk")
804 env.Append(LINKFLAGS="-mmacosx-version-min=10.4 -isysroot /Developer/SDKs/MacOSX10.4u.sdk")
810 # save off guessed arch element in an env
812 env.Append(CONFIG_ARCH=config[config_arch])
816 # ARCH="..." overrides all
819 if env['ARCH'] != '':
820 opt_flags = env['ARCH'].split()
823 # prepend boiler plate optimization flags
828 "-fomit-frame-pointer",
834 if env['DEBUG'] == 1:
835 env.Append(CCFLAGS=" ".join (debug_flags))
836 env.Append(LINKFLAGS=" ".join (debug_flags))
838 env.Append(CCFLAGS=" ".join (opt_flags))
839 env.Append(LINKFLAGS=" ".join (opt_flags))
841 if env['STL_DEBUG'] == 1:
842 env.Append(CXXFLAGS="-D_GLIBCXX_DEBUG")
844 if env['UNIVERSAL'] == 1:
845 env.Append(CCFLAGS="-arch i386 -arch ppc")
846 env.Append(LINKFLAGS="-arch i386 -arch ppc")
853 env.Append(CCFLAGS="-Wall")
854 env.Append(CXXFLAGS="-Woverloaded-virtual")
856 if env['EXTRA_WARN']:
857 env.Append(CCFLAGS="-Wextra -pedantic -ansi")
858 env.Append(CXXFLAGS="-ansi")
859 # env.Append(CFLAGS="-iso")
862 # fix scons nitpickiness on APPLE
866 def prep_libcheck(topenv, libinfo):
869 # rationale: GTK-Quartz uses jhbuild and installs to ~/gtk/inst by default.
870 # All libraries needed should be built against this location
873 GTKROOT = os.path.expanduser ('~/gtk/inst')
874 libinfo.Append(CPPPATH= GTKROOT + "/include", LIBPATH= GTKROOT + "/lib")
875 libinfo.Append(CXXFLAGS="-I" + GTKROOT + "/include", LINKFLAGS="-L" + GTKROOT + "/lib")
879 prep_libcheck(env, env)
882 # these are part of the Ardour source tree because they are C++
885 libraries['vamp'] = LibraryInfo (LIBS='vampsdk',
886 LIBPATH='#libs/vamp-sdk',
887 CPPPATH='#libs/vamp-sdk')
888 libraries['vamphost'] = LibraryInfo (LIBS='vamphostsdk',
889 LIBPATH='#libs/vamp-sdk',
890 CPPPATH='#libs/vamp-sdk')
892 env['RUBBERBAND'] = False
894 conf = Configure (env)
896 if conf.CheckHeader ('fftw3.h'):
897 env['RUBBERBAND'] = True
898 libraries['rubberband'] = LibraryInfo (LIBS='rubberband',
899 LIBPATH='#libs/rubberband',
900 CPPPATH='#libs/rubberband',
901 CCFLAGS='-DUSE_RUBBERBAND')
904 print "-------------------------------------------------------------------------"
905 print "You do not have the FFTW single-precision development package installed."
906 print "This prevents Ardour from using the Rubberband library for timestretching"
907 print "and pitchshifting. It will fall back on SoundTouch for timestretch, and "
908 print "pitchshifting will not be available."
909 print "-------------------------------------------------------------------------"
917 libraries['usb'] = LibraryInfo ()
918 prep_libcheck(env, libraries['usb'])
920 conf = Configure (libraries['usb'])
921 if conf.CheckLib ('usb', 'usb_interrupt_write'):
926 # check for linux/input.h while we're at it for powermate
927 if conf.CheckHeader('linux/input.h'):
928 have_linux_input = True
930 have_linux_input = False
932 libraries['usb'] = conf.Finish ()
935 # Check for wiimote dependencies
938 wiimoteConf = env.Configure ( )
939 if not wiimoteConf.CheckHeader('cwiid.h'):
940 print 'WIIMOTE configured but you are missing libcwiid!'
942 if not wiimoteConf.CheckHeader('bluetooth/bluetooth.h'):
943 print 'WIIMOTE configured but you are missing the libbluetooth headers which you need to compile wiimote support!'
951 libraries['flac'] = LibraryInfo ()
952 prep_libcheck(env, libraries['flac'])
953 libraries['flac'].Append(CPPPATH="/usr/local/include", LIBPATH="/usr/local/lib")
956 # june 1st 2007: look for a function that is in FLAC 1.1.2 and not in later versions
957 # since the version of libsndfile we have internally does not support
958 # the new API that libFLAC has adopted
961 conf = Configure (libraries['flac'])
962 if conf.CheckLib ('FLAC', 'FLAC__seekable_stream_decoder_init', language='CXX'):
963 conf.env.Append(CCFLAGS='-DHAVE_FLAC')
968 libraries['flac'] = conf.Finish ()
970 # or if that fails...
971 #libraries['flac'] = LibraryInfo (LIBS='FLAC')
973 # boost (we don't link against boost, just use some header files)
975 libraries['boost'] = LibraryInfo ()
976 prep_libcheck(env, libraries['boost'])
977 libraries['boost'].Append(CPPPATH="/usr/local/include", LIBPATH="/usr/local/lib")
978 conf = Configure (libraries['boost'])
979 if conf.CheckHeader ('boost/shared_ptr.hpp', language='CXX') == False:
980 print "Boost header files do not appear to be installed. You also might be running a buggy version of scons. Try scons 0.97 if you can."
983 libraries['boost'] = conf.Finish ()
988 libraries['lo'] = LibraryInfo ()
989 prep_libcheck(env, libraries['lo'])
991 conf = Configure (libraries['lo'])
992 if conf.CheckLib ('lo', 'lo_server_new') == False:
993 print "liblo does not appear to be installed."
994 env['HAVE_LIBLO'] = False
996 env['HAVE_LIBLO'] = True
998 libraries['lo'] = conf.Finish ()
1003 libraries['dmalloc'] = LibraryInfo ()
1004 prep_libcheck(env, libraries['dmalloc'])
1007 # look for the threaded version
1010 conf = Configure (libraries['dmalloc'])
1011 if conf.CheckLib ('dmallocth', 'dmalloc_shutdown'):
1012 have_libdmalloc = True
1014 have_libdmalloc = False
1016 libraries['dmalloc'] = conf.Finish ()
1019 # ensure FREEDESKTOP target is doable..
1022 conf = env.Configure ()
1023 if env['FREEDESKTOP']:
1024 have_update_mime_database = conf.TryAction (Action ('update-mime-database -v'))
1025 if have_update_mime_database[0] != 1:
1026 print "Warning. You have no update-mime-database command in your PATH. FREEDESKTOP is now disabled."
1027 env['FREEDESKTOP'] = 0
1028 have_gtk_update_icon_cache = conf.TryAction (Action ('gtk-update-icon-cache -?'))
1029 if have_gtk_update_icon_cache[0] != 1:
1030 print "Warning. You have no gtk-update-icon-cache command in your PATH. FREEDESKTOP is now disabled."
1031 env['FREEDESKTOP'] = 0
1032 have_update_desktop_database = conf.TryAction (Action ('update-desktop-database -?'))
1033 if have_update_desktop_database[0] != 1:
1034 print "Warning. You have no update-desktop-database command in your PATH. FREEDESKTOP is now disabled."
1035 env['FREEDESKTOP'] = 0
1039 # Audio/MIDI library (needed for MIDI, since audio is all handled via JACK)
1042 conf = Configure(env)
1044 # ALSA, for engine dialog
1045 libraries['asound'] = LibraryInfo ()
1047 if conf.CheckCHeader('alsa/asoundlib.h'):
1048 libraries['asound'].ParseConfig('pkg-config --cflags --libs alsa')
1050 if conf.CheckCHeader('jack/midiport.h'):
1051 libraries['sysmidi'] = LibraryInfo (LIBS='jack')
1052 env['SYSMIDI'] = 'JACK MIDI'
1053 subst_dict['%MIDITAG%'] = "control"
1054 subst_dict['%MIDITYPE%'] = "jack"
1055 env.Append(CCFLAGS=" -DWITH_JACK_MIDI")
1056 print "Using JACK MIDI"
1057 elif conf.CheckCHeader('alsa/asoundlib.h'):
1058 libraries['sysmidi'] = LibraryInfo ()
1059 libraries['sysmidi'].ParseConfig('pkg-config --cflags --libs alsa')
1060 env['SYSMIDI'] = 'ALSA Sequencer'
1061 subst_dict['%MIDITAG%'] = "seq"
1062 subst_dict['%MIDITYPE%'] = "alsa/sequencer"
1063 print "Using ALSA MIDI"
1064 elif conf.CheckCHeader('/System/Library/Frameworks/CoreMIDI.framework/Headers/CoreMIDI.h'):
1065 # this line is needed because scons can't handle -framework in ParseConfig() yet.
1067 # We need Carbon as well as the rest
1068 libraries['sysmidi'] = LibraryInfo (
1069 LINKFLAGS = ' -framework CoreMIDI -framework CoreFoundation -framework CoreAudio -framework CoreServices -framework AudioUnit -framework AudioToolbox -framework Carbon -bind_at_load' )
1071 libraries['sysmidi'] = LibraryInfo (
1072 LINKFLAGS = ' -framework CoreMIDI -framework CoreFoundation -framework CoreAudio -framework CoreServices -framework AudioUnit -framework AudioToolbox -bind_at_load' )
1073 env['SYSMIDI'] = 'CoreMIDI'
1074 subst_dict['%MIDITAG%'] = "ardour"
1075 subst_dict['%MIDITYPE%'] = "coremidi"
1077 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."
1083 clearlooks_version = 'libs/clearlooks-newer'
1085 clearlooks_version = 'libs/clearlooks-older'
1091 'sigc++-2.0' : '2.0',
1092 'gtkmm-2.4' : '2.8',
1093 'libgnomecanvasmm-2.6' : '2.12.0'
1096 conf = Configure(env, custom_tests = { 'CheckPKGConfig' : CheckPKGConfig,
1097 'CheckPKGVersion' : CheckPKGVersion })
1099 for pkg, version in syslibdeps.iteritems():
1100 if not conf.CheckPKGVersion( pkg, version ):
1101 print '%s >= %s not found.' %(pkg, version)
1102 DependenciesRequiredMessage()
1107 libraries['sigc2'] = LibraryInfo()
1108 libraries['sigc2'].ParseConfig('pkg-config --cflags --libs sigc++-2.0')
1109 libraries['glibmm2'] = LibraryInfo()
1110 libraries['glibmm2'].ParseConfig('pkg-config --cflags --libs glibmm-2.4')
1111 libraries['cairo'] = LibraryInfo()
1112 libraries['cairo'].ParseConfig('pkg-config --cflags --libs cairo')
1113 libraries['cairomm'] = LibraryInfo()
1114 libraries['cairomm'].ParseConfig('pkg-config --cflags --libs cairomm-1.0')
1115 libraries['gdkmm2'] = LibraryInfo()
1116 libraries['gdkmm2'].ParseConfig ('pkg-config --cflags --libs gdkmm-2.4')
1117 libraries['gtkmm2'] = LibraryInfo()
1118 libraries['gtkmm2'].ParseConfig ('pkg-config --cflags --libs gtkmm-2.4')
1119 libraries['atkmm'] = LibraryInfo()
1120 libraries['atkmm'].ParseConfig ('pkg-config --cflags --libs atkmm-1.6')
1121 libraries['pangomm'] = LibraryInfo()
1122 libraries['pangomm'].ParseConfig ('pkg-config --cflags --libs pangomm-1.4')
1123 libraries['libgnomecanvasmm'] = LibraryInfo()
1124 libraries['libgnomecanvasmm'].ParseConfig ('pkg-config --cflags --libs libgnomecanvasmm-2.6')
1125 libraries['taglib'] = LibraryInfo()
1126 libraries['taglib'].ParseConfig ('pkg-config --cflags --libs taglib')
1128 # libraries['libglademm'] = LibraryInfo()
1129 # libraries['libglademm'].ParseConfig ('pkg-config --cflags --libs libglademm-2.4')
1131 # libraries['flowcanvas'] = LibraryInfo(LIBS='flowcanvas', LIBPATH='#/libs/flowcanvas', CPPPATH='#libs/flowcanvas')
1132 libraries['soundtouch'] = LibraryInfo()
1133 libraries['soundtouch'].ParseConfig ('pkg-config --cflags --libs soundtouch-1.0')
1134 # Comment the previous line and uncomment this for some versions of Debian:
1135 #libraries['soundtouch'].ParseConfig ('pkg-config --cflags --libs libSoundTouch')
1137 libraries['appleutility'] = LibraryInfo(LIBS='libappleutility',
1138 LIBPATH='#libs/appleutility',
1139 CPPPATH='#libs/appleutility')
1141 libraries['sndfile'] = LibraryInfo()
1142 libraries['sndfile'].ParseConfig ('pkg-config --cflags --libs sndfile')
1152 'libs/evoral/src/libsmf',
1156 'libs/vamp-plugins/',
1157 # these are unconditionally included but have
1158 # tests internally to avoid compilation etc
1162 # this is unconditionally included but has
1163 # tests internally to avoid compilation etc
1164 # if COREAUDIO is not set
1169 # 'libs/flowcanvas',
1176 libraries['cairo'] = LibraryInfo()
1177 libraries['cairo'].ParseConfig('pkg-config --cflags --libs cairo')
1179 libraries['gtk2-unix-print'] = LibraryInfo()
1180 libraries['gtk2-unix-print'].ParseConfig('pkg-config --cflags --libs gtk+-unix-print-2.0')
1182 libraries['sigc2'] = LibraryInfo(LIBS='sigc++2',
1183 LIBPATH='#libs/sigc++2',
1184 CPPPATH='#libs/sigc++2')
1185 libraries['glibmm2'] = LibraryInfo(LIBS='glibmm2',
1186 LIBPATH='#libs/glibmm2',
1187 CPPPATH='#libs/glibmm2/glib')
1188 libraries['pangomm'] = LibraryInfo(LIBS='pangomm',
1189 LIBPATH='#libs/gtkmm2/pango',
1190 CPPPATH='#libs/gtkmm2/pango')
1191 libraries['cairomm'] = LibraryInfo(LIBS='cairomm',
1192 LIBPATH='#libs/cairomm',
1193 CPPPATH='#libs/cairomm')
1194 libraries['atkmm'] = LibraryInfo(LIBS='atkmm',
1195 LIBPATH='#libs/gtkmm2/atk',
1196 CPPPATH='#libs/gtkmm2/atk')
1197 libraries['cairomm'] = LibraryInfo(LIBS='cairomm',
1198 LIBPATH='#libs/cairomm',
1199 CPPPATH='#libs/cairomm')
1200 libraries['gdkmm2'] = LibraryInfo(LIBS='gdkmm2',
1201 LIBPATH='#libs/gtkmm2/gdk',
1202 CPPPATH='#libs/gtkmm2/gdk')
1203 libraries['gtkmm2'] = LibraryInfo(LIBS='gtkmm2',
1204 LIBPATH="#libs/gtkmm2/gtk",
1205 CPPPATH='#libs/gtkmm2/gtk/')
1206 libraries['libgnomecanvasmm'] = LibraryInfo(LIBS='libgnomecanvasmm',
1207 LIBPATH='#libs/libgnomecanvasmm',
1208 CPPPATH='#libs/libgnomecanvasmm')
1210 libraries['soundtouch'] = LibraryInfo(LIBS='soundtouch',
1211 LIBPATH='#libs/soundtouch',
1212 CPPPATH=['#libs', '#libs/soundtouch'])
1213 libraries['taglib'] = LibraryInfo(LIBS='libtaglib',
1214 LIBPATH='#libs/taglib',
1215 CPPPATH=['#libs/taglib', '#libs/taglib/taglib'])
1216 # libraries['libglademm'] = LibraryInfo(LIBS='libglademm',
1217 # LIBPATH='#libs/libglademm',
1218 # CPPPATH='#libs/libglademm')
1219 libraries['appleutility'] = LibraryInfo(LIBS='libappleutility',
1220 LIBPATH='#libs/appleutility',
1221 CPPPATH='#libs/appleutility')
1233 'libs/evoral/src/libsmf',
1237 'libs/vamp-plugins/',
1238 # these are unconditionally included but have
1239 # tests internally to avoid compilation etc
1243 # this is unconditionally included but has
1244 # tests internally to avoid compilation etc
1245 # if COREAUDIO is not set
1251 'libs/gtkmm2/pango',
1255 'libs/libgnomecanvasmm',
1263 # * always build the LGPL control protocol lib, since we link against it from libardour
1264 # * ditto for generic MIDI and OSC
1265 # * tranzport & wiimote check whether they should build internally, but we need them here
1266 # so that they are included in the tarball
1269 surface_subdirs = [ 'libs/surfaces/control_protocol',
1270 'libs/surfaces/generic_midi',
1271 'libs/surfaces/tranzport',
1272 'libs/surfaces/mackie',
1273 'libs/surfaces/powermate',
1274 'libs/surfaces/wiimote',
1280 env['TRANZPORT'] = 1
1282 env['TRANZPORT'] = 0
1283 print 'Disabled building Tranzport code because libusb could not be found'
1285 if have_linux_input:
1286 env['POWERMATE'] = 1
1288 env['POWERMATE'] = 0
1289 print 'Disabled building Powermate code because linux/input.h could not be found'
1291 if os.access ('libs/surfaces/sony9pin', os.F_OK):
1292 surface_subdirs += [ 'libs/surfaces/sony9pin' ]
1294 env['POWERMATE'] = 0
1295 env['TRANZPORT'] = 0
1298 # timestretch libraries
1301 timefx_subdirs = ['libs/soundtouch']
1302 if env['RUBBERBAND']:
1303 timefx_subdirs += ['libs/rubberband']
1305 opts.Save('scache.conf', env)
1306 Help(opts.GenerateHelpText(env))
1308 final_prefix = '$PREFIX'
1311 install_prefix = '$DESTDIR/$PREFIX'
1313 install_prefix = env['PREFIX']
1315 subst_dict['%INSTALL_PREFIX%'] = install_prefix;
1316 subst_dict['%FINAL_PREFIX%'] = final_prefix;
1317 subst_dict['%PREFIX%'] = final_prefix;
1319 if env['PREFIX'] == '/usr':
1320 final_config_prefix = '/etc'
1322 final_config_prefix = env['PREFIX'] + '/etc'
1324 config_prefix = '$DESTDIR' + final_config_prefix
1327 # everybody needs this
1330 env.Merge ([ libraries['core'] ])
1337 conf = Configure (env)
1339 nls_error = 'This system is not configured for internationalized applications. An english-only version will be built:'
1340 print 'Checking for internationalization support ...'
1341 have_gettext = conf.TryAction(Action('xgettext --version'))
1342 if have_gettext[0] != 1:
1343 nls_error += ' No xgettext command.'
1346 print "Found xgettext"
1348 have_msgmerge = conf.TryAction(Action('msgmerge --version'))
1349 if have_msgmerge[0] != 1:
1350 nls_error += ' No msgmerge command.'
1353 print "Found msgmerge"
1355 if not conf.CheckCHeader('libintl.h'):
1356 nls_error += ' No libintl.h.'
1362 print "International version will be built."
1366 env.Append(CCFLAGS="-DENABLE_NLS")
1368 Export('env install_prefix final_prefix config_prefix final_config_prefix libraries i18n ardour_version subst_dict')
1371 # the configuration file may be system dependent
1374 conf = env.Configure ()
1376 if conf.CheckCHeader('/System/Library/Frameworks/CoreAudio.framework/Versions/A/Headers/CoreAudio.h'):
1377 subst_dict['%JACK_INPUT%'] = "coreaudio:Built-in Audio:in"
1378 subst_dict['%JACK_OUTPUT%'] = "coreaudio:Built-in Audio:out"
1380 subst_dict['%JACK_INPUT%'] = "alsa_pcm:playback_"
1381 subst_dict['%JACK_OUTPUT%'] = "alsa_pcm:capture_"
1383 # posix_memalign available
1384 if not conf.CheckFunc('posix_memalign'):
1385 print 'Did not find posix_memalign(), using malloc'
1386 env.Append(CCFLAGS='-DNO_POSIX_MEMALIGN')
1391 # Which GTK tooltips API
1393 gtktestenv = env.Clone ()
1398 conf = gtktestenv.Configure ()
1400 if conf.CheckFunc('gtk_widget_set_tooltip_text'):
1401 env.Append (CXXFLAGS='-DGTK_NEW_TOOLTIP_API')
1406 # generate the per-user and system rc files from the same source
1408 sysrcbuild = env.SubstInFile ('ardour_system.rc','ardour.rc.in', SUBST_DICT = subst_dict)
1410 # add to the substitution dictionary
1412 subst_dict['%VERSION%'] = ardour_version[0:3]
1413 subst_dict['%EXTRA_VERSION%'] = ardour_version[3:]
1414 subst_dict['%REVISION_STRING%'] = ''
1415 if os.path.exists('.svn'):
1416 subst_dict['%REVISION_STRING%'] = '.' + fetch_svn_revision ('.') + 'svn'
1418 # specbuild = env.SubstInFile ('ardour.spec','ardour.spec.in', SUBST_DICT = subst_dict)
1420 the_revision = env.Command ('frobnicatory_decoy', [], create_stored_revision)
1421 remove_ardour = env.Command ('frobnicatory_decoy2', [],
1422 [ Delete ('$PREFIX/etc/ardour3'),
1423 Delete ('$PREFIX/lib/ardour3'),
1424 Delete ('$PREFIX/bin/ardour3'),
1425 Delete ('$PREFIX/share/ardour3')])
1427 env.Alias('revision', the_revision)
1428 env.Alias('install', env.Install(os.path.join(config_prefix, 'ardour3'), 'ardour_system.rc'))
1429 env.Alias('uninstall', remove_ardour)
1431 Default (sysrcbuild)
1435 Precious (env['DISTTREE'])
1437 env.Distribute (env['DISTTREE'],
1439 'COPYING', 'PACKAGER_README', 'README',
1441 'tools/config.guess',
1442 'icons/icon/ardour_icon_mac_mask.png',
1443 'icons/icon/ardour_icon_mac.png',
1444 'icons/icon/ardour_icon_tango_16px_blue.png',
1445 'icons/icon/ardour_icon_tango_16px_red.png',
1446 'icons/icon/ardour_icon_tango_22px_blue.png',
1447 'icons/icon/ardour_icon_tango_22px_red.png',
1448 'icons/icon/ardour_icon_tango_32px_blue.png',
1449 'icons/icon/ardour_icon_tango_32px_red.png',
1450 'icons/icon/ardour_icon_tango_48px_blue.png',
1451 'icons/icon/ardour_icon_tango_48px_red.png'
1453 glob.glob ('ardour.1*') +
1454 glob.glob ('libs/clearlooks-newer/*.c') +
1455 glob.glob ('libs/clearlooks-newer/*.h') +
1456 glob.glob ('libs/clearlooks-newer/SConscript')
1459 srcdist = env.Tarball(env['TARBALL'], [ env['DISTTREE'], the_revision ])
1460 env.Alias ('srctar', srcdist)
1463 # don't leave the distree around
1466 env.AddPreAction (env['DISTTREE'], Action ('rm -rf ' + str (File (env['DISTTREE']))))
1467 env.AddPostAction (srcdist, Action ('rm -rf ' + str (File (env['DISTTREE']))))
1470 # Update revision info before going into subdirs
1473 create_stored_revision()
1479 for subdir in coredirs:
1480 SConscript (subdir + '/SConscript')
1482 for sublistdir in [ subdirs, timefx_subdirs, gtk_subdirs, surface_subdirs ]:
1483 for subdir in sublistdir:
1484 SConscript (subdir + '/SConscript')
1487 env.Clean ('scrub', [ 'scache.conf', '.sconf_temp', '.sconsign.dblite', 'config.log'])