small keybinding changes; fixup play-selected-regions
[ardour.git] / SConstruct
index 5f81a1739cc9ba13cb41e28e1662e9ee33c10382..58e498d905a371c2c6e06c3b973b300d27be256b 100644 (file)
@@ -16,7 +16,7 @@ import SCons.Node.FS
 SConsignFile()
 EnsureSConsVersion(0, 96)
 
-ardour_version = '2.0.4'
+ardour_version = '2.2'
 
 subst_dict = { }
 
@@ -29,6 +29,8 @@ opts.AddOptions(
     ('ARCH', 'Set architecture-specific compilation flags by hand (all flags as 1 argument)',''),
     BoolOption('AUDIOUNITS', 'Compile with Apple\'s AudioUnit library. (experimental)', 0),
     BoolOption('COREAUDIO', 'Compile with Apple\'s CoreAudio library', 0),
+    BoolOption('GTKOSX', 'Compile for use with GTK-OSX, not GTK-X11', 0),
+    BoolOption('NATIVE_OSX_KEYS', 'Build key bindings file that matches OS X conventions', 0),
     BoolOption('DEBUG', 'Set to build with debugging information and no optimizations', 0),
     PathOption('DESTDIR', 'Set the intermediate install "prefix"', '/'),
     EnumOption('DIST_TARGET', 'Build target for cross compiling packagers', 'auto', allowed_values=('auto', 'i386', 'i686', 'x86_64', 'powerpc', 'tiger', 'panther', 'none' ), ignorecase=2),
@@ -63,6 +65,7 @@ class LibraryInfo(Environment):
             self.Append (LIBPATH = other.get ('LIBPATH', []))
             self.Append (CPPPATH = other.get('CPPPATH', []))
             self.Append (LINKFLAGS = other.get('LINKFLAGS', []))
+            self.Append (CCFLAGS = other.get('CCFLAGS', []))
        self.Replace(LIBPATH = list(Set(self.get('LIBPATH', []))))
        self.Replace(CPPPATH = list(Set(self.get('CPPPATH',[]))))
         #doing LINKFLAGS breaks -framework
@@ -228,6 +231,7 @@ def i18n (buildenv, sources, installenv):
         buildenv.PoBuild(po_file, ['po/'+po_file, potfile])
         mo_file = po_file.replace (".po", ".mo")
         installenv.Alias ('install', buildenv.MoBuild (mo_file, po_file))
+        installenv.Alias ('msgupdate', buildenv.MoBuild (mo_file, po_file))
     
     for lang in languages:
         modir = (os.path.join (install_prefix, 'share/locale/' + lang + '/LC_MESSAGES/'))
@@ -400,6 +404,29 @@ else:
         os.remove('.personal_use_only')
 
 
+####################
+# push environment
+####################
+
+def pushEnvironment(context):
+    if os.environ.has_key('PATH'):
+       context.Append(PATH = os.environ['PATH'])
+       
+    if os.environ.has_key('PKG_CONFIG_PATH'):
+       context.Append(PKG_CONFIG_PATH = os.environ['PKG_CONFIG_PATH'])
+           
+    if os.environ.has_key('CC'):
+       context['CC'] = os.environ['CC']
+               
+    if os.environ.has_key('CXX'):
+       context['CXX'] = os.environ['CXX']
+
+    if os.environ.has_key('DISTCC_HOSTS'):
+       context['ENV']['DISTCC_HOSTS'] = os.environ['DISTCC_HOSTS']
+       context['ENV']['HOME'] = os.environ['HOME']
+
+pushEnvironment (env)
+
 #######################
 # Dependency Checking #
 #######################
@@ -422,16 +449,22 @@ def DependenciesRequiredMessage():
        print 'Please consult http://ardour.org/building for more information'
 
 def CheckPKGConfig(context, version):
-     context.Message( 'Checking for pkg-config version >= %s... ' %version )
-     ret = context.TryAction('pkg-config --atleast-pkgconfig-version=%s' % version)[0]
-     context.Result( ret )
-     return ret
+    context.Message( 'Checking for pkg-config version >= %s... ' %version )
+    ret = context.TryAction('pkg-config --atleast-pkgconfig-version=%s' % version)[0]
+    context.Result( ret )
+    return ret
 
 def CheckPKGVersion(context, name, version):
-     context.Message( 'Checking for %s... ' % name )
-     ret = context.TryAction('pkg-config --atleast-version=%s %s' %(version,name) )[0]
-     context.Result( ret )
-     return ret
+    context.Message( 'Checking for %s... ' % name )
+    ret = context.TryAction('pkg-config --atleast-version=%s %s' %(version,name) )[0]
+    context.Result( ret )
+    return ret
+
+def CheckPKGExists(context, name):
+    context.Message ('Checking for %s...' % name)
+    ret = context.TryAction('pkg-config --exists %s' % name)[0]
+    context.Result (ret)
+    return ret
 
 conf = Configure(env, custom_tests = { 'CheckPKGConfig' : CheckPKGConfig,
                                        'CheckPKGVersion' : CheckPKGVersion })
@@ -471,17 +504,30 @@ libraries['raptor'].ParseConfig('pkg-config --cflags --libs raptor')
 libraries['samplerate'] = LibraryInfo()
 libraries['samplerate'].ParseConfig('pkg-config --cflags --libs samplerate')
 
+conf = env.Configure (custom_tests = { 'CheckPKGExists' : CheckPKGExists } )
+
+if conf.CheckPKGExists ('fftw3f'):
+    libraries['fftw3f'] = LibraryInfo()
+    libraries['fftw3f'].ParseConfig('pkg-config --cflags --libs fftw3f')
+
+if conf.CheckPKGExists ('fftw3'):
+    libraries['fftw3'] = LibraryInfo()
+    libraries['fftw3'].ParseConfig('pkg-config --cflags --libs fftw3')
+
+env = conf.Finish ()
+
 if env['FFT_ANALYSIS']:
-       libraries['fftw3f'] = LibraryInfo()
-       libraries['fftw3f'].ParseConfig('pkg-config --cflags --libs fftw3f')
         #
         # Check for fftw3 header as well as the library
-        conf = Configure (libraries['fftw3f'])
-        if conf.CheckHeader ('fftw3.h') == False:
-                print "FFT Analysis cannot be compiled without the FFTW3 headers, which don't seem to be installed"
-                sys.exit (1)
-        libraries['fftw3f'] = conf.Finish();
+        #
+
+        conf = Configure(libraries['fftw3'])
 
+        if conf.CheckHeader ('fftw3.h') == False:
+            print ('FFT Analysis cannot be compiled without the FFTW3 headers, which do not seem to be installed')
+            sys.exit (1)            
+        conf.Finish()
+        
 libraries['jack'] = LibraryInfo()
 libraries['jack'].ParseConfig('pkg-config --cflags --libs jack')
 
@@ -523,7 +569,7 @@ libraries['gtkmm2ext'] = LibraryInfo (LIBS='gtkmm2ext', LIBPATH='#libs/gtkmm2ext
 
 # SCons should really do this for us
 
-conf = Configure (env)
+conf = env.Configure ()
 
 have_cxx = conf.TryAction (Action (str(env['CXX']) + ' --version'))
 if have_cxx[0] != 1:
@@ -710,10 +756,26 @@ if env['LIBLO']:
 
 def prep_libcheck(topenv, libinfo):
     if topenv['DIST_TARGET'] == 'panther' or topenv['DIST_TARGET'] == 'tiger':
-        libinfo.Append(CCFLAGS="-I/opt/local/include", LINKFLAGS="-L/opt/local/lib")
+       #
+       # rationale: GTK-Quartz uses jhbuild and installs to /opt/gtk by default.
+       #            All libraries needed should be built against this location
+       if topenv['GTKOSX']:
+               libinfo.Append(CPPPATH="/opt/gtk/include", LIBPATH="/opt/gtk/lib")
+               libinfo.Append(CXXFLAGS="-I/opt/gtk/include", LINKFLAGS="-L/opt/gtk/lib")
+       libinfo.Append(CPPPATH="/opt/local/include", LIBPATH="/opt/local/lib")
+       libinfo.Append(CXXFLAGS="-I/opt/local/include", LINKFLAGS="-L/opt/local/lib")
 
 prep_libcheck(env, env)
 
+env['RUBBERBAND'] = True
+libraries['rubberband'] = LibraryInfo (LIBS='rubberband',
+                                       LIBPATH='#libs/rubberband',
+                                       CPPPATH='#libs/rubberband',
+                                       CCFLAGS='-DUSE_RUBBERBAND')
+libraries['vamp'] = LibraryInfo (LIBS='vampsdk',
+                                       LIBPATH='#libs/vamp-sdk',
+                                       CPPPATH='#libs/vamp-sdk/vamp')
+
 #
 # Check for libusb
 
@@ -739,7 +801,7 @@ libraries['usb'] = conf.Finish ()
 
 libraries['flac'] = LibraryInfo ()
 prep_libcheck(env, libraries['flac'])
-libraries['flac'].Append(CCFLAGS="-I/usr/local/include", LINKFLAGS="-L/usr/local/lib")
+libraries['flac'].Append(CPPPATH="/usr/local/include", LIBPATH="/usr/local/lib")
 
 #
 # june 1st 2007: look for a function that is in FLAC 1.1.2 and not in later versions
@@ -763,7 +825,7 @@ libraries['flac'] = conf.Finish ()
 
 libraries['boost'] = LibraryInfo ()
 prep_libcheck(env, libraries['boost'])
-libraries['boost'].Append(CCFLAGS="-I/usr/local/include", LINKFLAGS="-L/usr/local/lib")
+libraries['boost'].Append(CPPPATH="/usr/local/include", LIBPATH="/usr/local/lib")
 conf = Configure (libraries['boost'])
 if conf.CheckHeader ('boost/shared_ptr.hpp', language='CXX') == False:
         print "Boost header files do not appear to be installed."
@@ -816,7 +878,13 @@ if conf.CheckCHeader('alsa/asoundlib.h'):
     subst_dict['%MIDITYPE%'] = "alsa/sequencer"
 elif conf.CheckCHeader('/System/Library/Frameworks/CoreMIDI.framework/Headers/CoreMIDI.h'):
     # this line is needed because scons can't handle -framework in ParseConfig() yet.
-    libraries['sysmidi'] = LibraryInfo (LINKFLAGS= '-framework CoreMIDI -framework CoreFoundation -framework CoreAudio -framework CoreServices -framework AudioUnit -framework AudioToolbox -bind_at_load')
+    if env['GTKOSX']:
+        # We need Carbon as well as the rest
+        libraries['sysmidi'] = LibraryInfo (
+               LINKFLAGS = ' -framework CoreMIDI -framework CoreFoundation -framework CoreAudio -framework CoreServices -framework AudioUnit -framework AudioToolbox -framework Carbon -bind_at_load' )
+    else:
+        libraries['sysmidi'] = LibraryInfo (
+               LINKFLAGS = ' -framework CoreMIDI -framework CoreFoundation -framework CoreAudio -framework CoreServices -framework AudioUnit -framework AudioToolbox -bind_at_load' )
     env['SYSMIDI'] = 'CoreMIDI'
     subst_dict['%MIDITAG%'] = "ardour"
     subst_dict['%MIDITYPE%'] = "coremidi"
@@ -893,6 +961,7 @@ if env['SYSLIBS']:
         'libs/pbd',
         'libs/midi++2',
         'libs/ardour',
+        'libs/vamp-sdk',
     # these are unconditionally included but have
     # tests internally to avoid compilation etc
     # if VST is not set
@@ -948,7 +1017,6 @@ else:
                                             CPPPATH='#libs/appleutility')
 
     coredirs = [
-        'libs/soundtouch',
         'templates'
     ]
     
@@ -958,6 +1026,7 @@ else:
         'libs/pbd',
         'libs/midi++2',
         'libs/ardour',
+        'libs/vamp-sdk',
     # these are unconditionally included but have
     # tests internally to avoid compilation etc
     # if VST is not set
@@ -1014,25 +1083,16 @@ if env['SURFACES']:
 else:
     env['POWERMATE'] = 0
     env['TRANZPORT'] = 0
-    
-opts.Save('scache.conf', env)
-Help(opts.GenerateHelpText(env))
-
-if os.environ.has_key('PATH'):
-    env.Append(PATH = os.environ['PATH'])
 
-if os.environ.has_key('PKG_CONFIG_PATH'):
-    env.Append(PKG_CONFIG_PATH = os.environ['PKG_CONFIG_PATH'])
-
-if os.environ.has_key('CC'):
-    env['CC'] = os.environ['CC']
+#
+# timestretch libraries
+#
 
-if os.environ.has_key('CXX'):
-    env['CXX'] = os.environ['CXX']
+timefx_subdirs = ['libs/soundtouch']
+timefx_subdirs += ['libs/rubberband']
 
-if os.environ.has_key('DISTCC_HOSTS'):
-    env['ENV']['DISTCC_HOSTS'] = os.environ['DISTCC_HOSTS']
-    env['ENV']['HOME'] = os.environ['HOME']
+opts.Save('scache.conf', env)
+Help(opts.GenerateHelpText(env))
 
 final_prefix = '$PREFIX'
 
@@ -1132,9 +1192,14 @@ if os.path.exists('.svn'):
 # specbuild = env.SubstInFile ('ardour.spec','ardour.spec.in', SUBST_DICT = subst_dict)
 
 the_revision = env.Command ('frobnicatory_decoy', [], create_stored_revision)
+remove_ardour = env.Command ('frobnicatory_decoy2', [],
+                             [ Delete ('$PREFIX/etc/ardour2'),
+                               Delete ('$PREFIX/lib/ardour2'),
+                               Delete ('$PREFIX/bin/ardour2')])
 
 env.Alias('revision', the_revision)
 env.Alias('install', env.Install(os.path.join(config_prefix, 'ardour2'), 'ardour_system.rc'))
+env.Alias('uninstall', remove_ardour)
 
 Default (sysrcbuild)
 
@@ -1183,7 +1248,7 @@ env.AddPostAction (srcdist, Action ('rm -rf ' + str (File (env['DISTTREE']))))
 for subdir in coredirs:
     SConscript (subdir + '/SConscript')
 
-for sublistdir in [ subdirs, gtk_subdirs, surface_subdirs ]:
+for sublistdir in [ subdirs, timefx_subdirs, gtk_subdirs, surface_subdirs ]:
     for subdir in sublistdir:
         SConscript (subdir + '/SConscript')