bump version to 2.3
[ardour.git] / SConstruct
index 8ea69bf902d2415ff0f5c6515e2b69634cf42e09..766b4d8376ccba03e3ed78f6e8ad1e383bba6e03 100644 (file)
@@ -16,7 +16,7 @@ import SCons.Node.FS
 SConsignFile()
 EnsureSConsVersion(0, 96)
 
-ardour_version = '2.0.2'
+ardour_version = '2.3'
 
 subst_dict = { }
 
@@ -29,9 +29,12 @@ 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('OLDFONTS', 'Old school font sizes', 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),
+    EnumOption('DIST_TARGET', 'Build target for cross compiling packagers', 'auto', allowed_values=('auto', 'i386', 'i686', 'x86_64', 'powerpc', 'tiger', 'panther', 'leopard', 'none' ), ignorecase=2),
     BoolOption('DMALLOC', 'Compile and link using the dmalloc library', 0),
     BoolOption('EXTRA_WARN', 'Compile with -Wextra, -ansi, and -pedantic.  Might break compilation.  For pedants', 0),
     BoolOption('FFT_ANALYSIS', 'Include FFT analysis window', 0),
@@ -44,6 +47,7 @@ opts.AddOptions(
     BoolOption('UNIVERSAL', 'Compile as universal binary.  Requires that external libraries are already universal.', 0),
     BoolOption('VERSIONED', 'Add revision information to ardour/gtk executable name inside the build directory', 0),
     BoolOption('VST', 'Compile with support for VST', 0),
+    BoolOption('LV2', 'Compile with support for LV2 (if slv2 is available)', 1),
     BoolOption('GPROFILE', 'Compile with support for gprofile (Developers only)', 0),
     BoolOption('TRANZPORT', 'Compile with support for Frontier Designs (if libusb is available)', 1)
 )
@@ -63,6 +67,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 +233,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/'))
@@ -360,7 +366,7 @@ def distcopy (target, source, env):
     return p.close ()
 
 def tarballer (target, source, env):
-    cmd = 'tar -jcf ' + str (target[0]) +  ' ' + str(source[0]) + "  --exclude '*~'"
+    cmd = 'tar -jcf ' + str (target[0]) +  ' ' + str(source[0]) + "  --exclude '*~'" + " --exclude .svn --exclude '.svn/*'"
     print 'running ', cmd, ' ... '
     p = os.popen (cmd)
     return p.close ()
@@ -399,6 +405,28 @@ else:
     if os.path.isfile('.personal_use_only'):
         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 +450,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,16 +505,46 @@ 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'])
+        #
+
+        conf = Configure(libraries['fftw3'])
+
         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();
+            print ('FFT Analysis cannot be compiled without the FFTW3 headers, which do not seem to be installed')
+            sys.exit (1)            
+        conf.Finish()
+
+if env['LV2']:
+       conf = env.Configure(custom_tests = { 'CheckPKGExists' : CheckPKGExists })
+       
+       if conf.CheckPKGExists ('\"slv2 >= 0.6.0\"'):
+               libraries['slv2'] = LibraryInfo()
+               libraries['slv2'].ParseConfig('pkg-config --cflags --libs slv2')
+                env.Append (CCFLAGS="-DHAVE_LV2")
+       else:
+               print 'Building Ardour with LV2 support requires SLV2 >= 0.6.0'
+               print 'WARNING: SLV2 not found, or too old.  Ardour will be built without LV2 support.'
+               print 'Until the 2.3 release, Ardour requires SLV2 out of SVN.'
+               print 'Testing would be very much appreciated!  svn co http://svn.drobilla.net/lad/slv2'
+               env['LV2'] = 0
+       conf.Finish()
+else:
+       print 'LV2 support is not enabled.  Build with \'scons LV2=1\' to enable.'
 
 libraries['jack'] = LibraryInfo()
 libraries['jack'].ParseConfig('pkg-config --cflags --libs jack')
@@ -523,7 +587,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:
@@ -563,8 +627,10 @@ if env['DIST_TARGET'] == 'auto':
         # The [.] matches to the dot after the major version, "." would match any character
         if re.search ("darwin[0-7][.]", config[config_kernel]) != None:
             env['DIST_TARGET'] = 'panther'
-        else:
+        if re.search ("darwin8[.]", config[config_kernel]) != None:
             env['DIST_TARGET'] = 'tiger'
+        else:
+            env['DIST_TARGET'] = 'leopard'
     else:
         if re.search ("x86_64", config[config_cpu]) != None:
             env['DIST_TARGET'] = 'x86_64'
@@ -630,9 +696,9 @@ elif ((re.search ("i[0-9]86", config[config_cpu]) != None) or (re.search ("x86_6
 
 # optimization section
 if env['FPU_OPTIMIZATION']:
-    if env['DIST_TARGET'] == 'tiger':
-        opt_flags.append ("-DBUILD_VECLIB_OPTIMIZATIONS")
-        debug_flags.append ("-DBUILD_VECLIB_OPTIMIZATIONS")
+    if env['DIST_TARGET'] == 'tiger' or env['DIST_TARGET'] == 'leopard':
+        opt_flags.append ("-DBUILD_VECLIB_OPTIMIZATIONS");
+        debug_flags.append ("-DBUILD_VECLIB_OPTIMIZATIONS");
         libraries['core'].Append(LINKFLAGS= '-framework Accelerate')
     elif env['DIST_TARGET'] == 'i686' or env['DIST_TARGET'] == 'x86_64':
         opt_flags.append ("-DBUILD_SSE_OPTIMIZATIONS")
@@ -651,6 +717,18 @@ if env['DIST_TARGET'] == 'x86_64':
 else:
     env['LIBDIR']='lib'
 
+#
+# a single way to test if we're on OS X
+#
+
+if env['DIST_TARGET'] in ['panther', 'tiger', 'leopard' ]:
+    env['IS_OSX'] = 1
+    # force tiger or later, to avoid issues on PPC which defaults
+    # back to 10.1 if we don't tell it otherwise.
+    env.Append (CCFLAGS="-DMAC_OS_X_VERSION_MIN_REQUIRED=1040")
+else:
+    env['IS_OSX'] = 0
+
 #
 # save off guessed arch element in an env
 #
@@ -709,11 +787,52 @@ 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")
+    if topenv['IS_OSX']:
+       #
+       # 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)
 
+
+#
+# these are part of the Ardour source tree because they are C++
+# 
+
+libraries['vamp'] = LibraryInfo (LIBS='vampsdk',
+                                 LIBPATH='#libs/vamp-sdk',
+                                 CPPPATH='#libs/vamp-sdk')
+libraries['vamphost'] = LibraryInfo (LIBS='vamphostsdk',
+                                 LIBPATH='#libs/vamp-sdk',
+                                 CPPPATH='#libs/vamp-sdk')
+
+env['RUBBERBAND'] = False
+
+conf = Configure (env)
+
+if conf.CheckHeader ('fftw3.h'):
+    env['RUBBERBAND'] = True
+    libraries['rubberband'] = LibraryInfo (LIBS='rubberband',
+                                           LIBPATH='#libs/rubberband',
+                                           CPPPATH='#libs/rubberband',
+                                           CCFLAGS='-DUSE_RUBBERBAND')
+else:
+    print ""
+    print "-------------------------------------------------------------------------"
+    print "You do not have the FFTW single-precision development package installed."
+    print "This prevents Ardour from using the Rubberband library for timestretching"
+    print "and pitchshifting. It will fall back on SoundTouch for timestretch, and "
+    print "pitchshifting will not be available."
+    print "-------------------------------------------------------------------------"
+    print ""
+
+conf.Finish()
+
 #
 # Check for libusb
 
@@ -726,6 +845,12 @@ if conf.CheckLib ('usb', 'usb_interrupt_write'):
 else:
     have_libusb = False
 
+# check for linux/input.h while we're at it for powermate
+if conf.CheckHeader('linux/input.h'):
+    have_linux_input = True
+else:
+    have_linux_input = False
+
 libraries['usb'] = conf.Finish ()
 
 #
@@ -733,7 +858,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
@@ -742,8 +867,12 @@ libraries['flac'].Append(CCFLAGS="-I/usr/local/include", LINKFLAGS="-L/usr/local
 #
 
 conf = Configure (libraries['flac'])
-if conf.CheckLib ('FLAC', 'FLAC__seekable_stream_decoder_set_read_callback', language='CXX'):
+if conf.CheckLib ('FLAC', 'FLAC__seekable_stream_decoder_init', language='CXX'):
     conf.env.Append(CCFLAGS='-DHAVE_FLAC')
+    use_flac = True
+else:
+    use_flac = False
+    
 libraries['flac'] = conf.Finish ()
 
 # or if that fails...
@@ -753,7 +882,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."
@@ -806,7 +935,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"
@@ -833,7 +968,7 @@ if env['SYSLIBS']:
             print '%s >= %s not found.' %(pkg, version)
             DependenciesRequiredMessage()
             Exit(1)
-       
+    
     env = conf.Finish()
     
     libraries['sigc2'] = LibraryInfo()
@@ -866,9 +1001,9 @@ if env['SYSLIBS']:
 
 #    libraries['flowcanvas'] = LibraryInfo(LIBS='flowcanvas', LIBPATH='#/libs/flowcanvas', CPPPATH='#libs/flowcanvas')
     libraries['soundtouch'] = LibraryInfo()
-    libraries['soundtouch'].ParseConfig ('pkg-config --cflags --libs soundtouch-1.0')
+    #libraries['soundtouch'].ParseConfig ('pkg-config --cflags --libs soundtouch-1.0')
     # Comment the previous line and uncomment this for Debian:
-    #libraries['soundtouch'].ParseConfig ('pkg-config --cflags --libs libSoundTouch')
+    libraries['soundtouch'].ParseConfig ('pkg-config --cflags --libs libSoundTouch')
 
     libraries['appleutility'] = LibraryInfo(LIBS='libappleutility',
                                             LIBPATH='#libs/appleutility',
@@ -883,6 +1018,8 @@ if env['SYSLIBS']:
         'libs/pbd',
         'libs/midi++2',
         'libs/ardour',
+        'libs/vamp-sdk',
+        'libs/vamp-plugins/',
     # these are unconditionally included but have
     # tests internally to avoid compilation etc
     # if VST is not set
@@ -938,7 +1075,6 @@ else:
                                             CPPPATH='#libs/appleutility')
 
     coredirs = [
-        'libs/soundtouch',
         'templates'
     ]
     
@@ -948,6 +1084,8 @@ else:
         'libs/pbd',
         'libs/midi++2',
         'libs/ardour',
+        'libs/vamp-sdk',
+        'libs/vamp-plugins/',
     # these are unconditionally included but have
     # tests internally to avoid compilation etc
     # if VST is not set
@@ -960,13 +1098,12 @@ else:
         ]
     
     gtk_subdirs = [
-       'libs/glibmm2',
-       'libs/gtkmm2/pango',
-       'libs/gtkmm2/atk',
-       'libs/gtkmm2/gdk',
-       'libs/gtkmm2/gtk',
-       'libs/libgnomecanvasmm',
-#      'libs/flowcanvas',
+        'libs/glibmm2',
+        'libs/gtkmm2/pango',
+        'libs/gtkmm2/atk',
+        'libs/gtkmm2/gdk',
+        'libs/gtkmm2/gtk',
+        'libs/libgnomecanvasmm',
         'libs/gtkmm2ext',
         'gtk2_ardour',
         'libs/clearlooks'
@@ -992,27 +1129,29 @@ if env['SURFACES']:
     else:
         env['TRANZPORT'] = 0
         print 'Disabled building Tranzport code because libusb could not be found'
-    if os.access ('libs/surfaces/sony9pin', os.F_OK):
-        surface_subdirs += [ 'libs/surfaces/sony9pin' ]
 
-opts.Save('scache.conf', env)
-Help(opts.GenerateHelpText(env))
-
-if os.environ.has_key('PATH'):
-    env.Append(PATH = os.environ['PATH'])
+    if have_linux_input:
+        env['POWERMATE'] = 1
+    else:
+        env['POWERMATE'] = 0
+        print 'Disabled building Powermate code because linux/input.h could not be found'
 
-if os.environ.has_key('PKG_CONFIG_PATH'):
-    env.Append(PKG_CONFIG_PATH = os.environ['PKG_CONFIG_PATH'])
+    if os.access ('libs/surfaces/sony9pin', os.F_OK):
+        surface_subdirs += [ 'libs/surfaces/sony9pin' ]
+else:
+    env['POWERMATE'] = 0
+    env['TRANZPORT'] = 0
 
-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']
+if env['RUBBERBAND']:
+    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'
 
@@ -1074,7 +1213,7 @@ env = conf.Finish()
 if env['NLS'] == 1:
     env.Append(CCFLAGS="-DENABLE_NLS")
 
-Export('env install_prefix final_prefix config_prefix final_config_prefix libraries i18n ardour_version subst_dict')
+Export('env install_prefix final_prefix config_prefix final_config_prefix libraries i18n ardour_version subst_dict use_flac')
 
 #
 # the configuration file may be system dependent
@@ -1099,7 +1238,6 @@ env = conf.Finish()
 
 # generate the per-user and system rc files from the same source
 
-rcbuild = env.SubstInFile ('ardour.rc','ardour.rc.in', SUBST_DICT = subst_dict)
 sysrcbuild = env.SubstInFile ('ardour_system.rc','ardour.rc.in', SUBST_DICT = subst_dict)
 
 # add to the substitution dictionary
@@ -1113,12 +1251,15 @@ 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('install', env.Install(os.path.join(config_prefix, 'ardour2'), 'ardour.rc'))
+env.Alias('uninstall', remove_ardour)
 
-Default (rcbuild)
 Default (sysrcbuild)
 
 # source tarball
@@ -1166,7 +1307,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')