Waf building of libardour (yay!).
[ardour.git] / SConstruct
index b41b609820c0e081d5fc1b36eeb9241b6895ae5f..3b906a79f4a0ec2fac968981c2b3820ba80b1f4b 100644 (file)
@@ -43,13 +43,12 @@ opts.AddOptions(
     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', 1),
     BoolOption('FREESOUND', 'Include Freesound database lookup', 0),
     BoolOption('FPU_OPTIMIZATION', 'Build runtime checked assembler code', 1),
-    BoolOption('LIBLO', 'Compile with support for liblo library', 1),
     BoolOption('NLS', 'Set to turn on i18n support', 1),
     PathOption('PREFIX', 'Set the install "prefix"', '/usr/local'),
     BoolOption('SURFACES', 'Build support for control surfaces', 1),
+    BoolOption('WIIMOTE', 'Build the wiimote control surface', 0),
     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),
     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),
@@ -257,25 +256,51 @@ def fetch_svn_revision (path):
     cmd += " | awk '/^Revision:/ { print $2}'"
     return commands.getoutput (cmd)
 
+def fetch_git_revision (path):
+    cmd = "LANG= "
+    cmd += "git log --abbrev HEAD^..HEAD "
+    cmd += path
+    output = commands.getoutput (cmd)
+    output = output.splitlines ()
+
+    rev = output[0].replace ("commit", "git")[0:10]
+    for line in output:
+       try:
+           if "git-svn-id" in line:
+               line = line.split('@')
+               line = line[1].split(' ')
+               rev = line[0]
+       except:
+           pass
+
+    return rev
+
 def create_stored_revision (target = None, source = None, env = None):
+    rev = ""
     if os.path.exists('.svn'):    
         rev = fetch_svn_revision ('.');
-        try:
-            text  = "#include <ardour/svn_revision.h>\n"
-            text += "namespace ARDOUR {\n";
-            text += "extern const char* svn_revision = \"" + rev + "\";\n";
-            text += "}\n";
-            print '============> writing svn revision info to libs/ardour/svn_revision.cc\n'
-            o = file ('libs/ardour/svn_revision.cc', 'w')
-            o.write (text)
-            o.close ()
-        except IOError:
-            print "Could not open libs/ardour/svn_revision.cc for writing\n"
-            sys.exit (-1)
+    elif os.path.exists('.git'):
+        rev = fetch_git_revision ('.');
+    elif os.path.exists('libs/ardour/svn_revision.cc'):
+        print "Using packaged svn revision"
+        return
     else:
-        print "You cannot use \"scons revision\" on without using a checked out"
-        print "copy of the Ardour source code repository"
-        sys.exit (-1)
+        if not os.path.exists('libs/ardour/ardour/svn_revision.h'):    
+            print "This release of ardour is missing libs/ardour/ardour/svn_revision.h. Blame the packager."
+            sys.exit (-1)
+
+    try:
+       text  = "#include <ardour/svn_revision.h>\n"
+       text += "namespace ARDOUR {\n";
+       text += "extern const char* svn_revision = \"" + rev + "\";\n";
+       text += "}\n";
+       print '============> writing svn revision info to libs/ardour/svn_revision.cc\n'
+       o = file ('libs/ardour/svn_revision.cc', 'w')
+       o.write (text)
+       o.close ()
+    except IOError:
+       print "Could not open libs/ardour/svn_revision.cc for writing\n"
+       sys.exit (-1)
 
 #
 # A generic builder for version.cc files
@@ -445,7 +470,7 @@ deps = \
 {
        'glib-2.0'             : '2.10.1',
        'gthread-2.0'          : '2.10.1',
-       'gtk+-2.0'             : '2.8.1',
+       'gtk+-2.0'             : '2.12.1',
        'libxml-2.0'           : '2.6.0',
        'samplerate'           : '0.1.0',
        'raptor'               : '1.4.2',
@@ -506,12 +531,6 @@ libraries = { }
 
 libraries['core'] = LibraryInfo (CCFLAGS = '-Ilibs')
 
-libraries['flac'] = LibraryInfo ()
-libraries['flac'].ParseConfig ('pkg-config --cflags --libs flac')
-
-libraries['ogg'] = LibraryInfo ()
-libraries['ogg'].ParseConfig ('pkg-config --cflags --libs ogg')
-
 libraries['sndfile'] = LibraryInfo()
 libraries['sndfile'].ParseConfig('pkg-config --cflags --libs sndfile')
 
@@ -543,17 +562,16 @@ else:
 
 env = conf.Finish ()
 
-if env['FFT_ANALYSIS']:
-        #
-        # Check for fftw3 header as well as the library
-        #
+#
+# Check for fftw3 header as well as the library
+#
 
-        conf = Configure(libraries['fftw3'])
+conf = Configure(libraries['fftw3'])
 
-        if conf.CheckHeader ('fftw3.h') == False:
-            print ('Ardour cannot be compiled without the FFTW3 headers, which do not seem to be installed')
-            sys.exit (1)            
-        conf.Finish()
+if conf.CheckHeader ('fftw3.h') == False:
+    print ('Ardour cannot be compiled without the FFTW3 headers, which do not seem to be installed')
+    sys.exit (1)            
+conf.Finish()
 
 if env['FREESOUND']:
         #
@@ -576,17 +594,20 @@ else:
 if env['LV2']:
        conf = env.Configure(custom_tests = { 'CheckPKGVersion' : CheckPKGVersion})
        
-       if conf.CheckPKGVersion('slv2', '0.6.0'):
+       if conf.CheckPKGVersion('slv2', '0.6.4'):
                libraries['slv2'] = LibraryInfo()
                libraries['slv2'].ParseConfig('pkg-config --cflags --libs slv2')
                 env.Append (CCFLAGS="-DHAVE_LV2")
        else:
-               print 'LV2 support is not enabled (SLV2 not found or older than 0.6.0)'
+               print 'LV2 support is not enabled (SLV2 not found or older than 0.6.4 (svn))'
                env['LV2'] = 0
        conf.Finish()
 else:
        print 'LV2 support is not enabled.  Build with \'scons LV2=1\' to enable.'
 
+if not env['WIIMOTE']:
+       print 'WIIMOTE not enabled. Build with \'scons WIIMOTE=1\' to enable support.'
+
 libraries['jack'] = LibraryInfo()
 libraries['jack'].ParseConfig('pkg-config --cflags --libs jack')
 
@@ -596,6 +617,9 @@ libraries['xml'].ParseConfig('pkg-config --cflags --libs libxml-2.0')
 libraries['xslt'] = LibraryInfo()
 libraries['xslt'].ParseConfig('pkg-config --cflags --libs libxslt')
 
+libraries['uuid'] = LibraryInfo()
+libraries['uuid'].ParseConfig('pkg-config --cflags --libs uuid')
+
 libraries['glib2'] = LibraryInfo()
 libraries['glib2'].ParseConfig ('pkg-config --cflags --libs glib-2.0')
 libraries['glib2'].ParseConfig ('pkg-config --cflags --libs gobject-2.0')
@@ -626,10 +650,11 @@ libraries['ardour_cp'] = LibraryInfo (LIBS='ardour_cp', LIBPATH='#libs/surfaces/
 
 # The Ardour backend/engine
 
-libraries['ardour'] = LibraryInfo (LIBS='ardour', LIBPATH='#libs/ardour', CPPPATH='#libs/ardour')
-libraries['midi++2'] = LibraryInfo (LIBS='midi++', LIBPATH='#libs/midi++2', CPPPATH='#libs/midi++2')
-libraries['evoral'] = LibraryInfo (LIBS='evoral', LIBPATH='#libs/evoral', CPPPATH='#libs/evoral')
-libraries['pbd']    = LibraryInfo (LIBS='pbd', LIBPATH='#libs/pbd', CPPPATH='#libs/pbd')
+libraries['ardour']    = LibraryInfo (LIBS='ardour', LIBPATH='#libs/ardour', CPPPATH='#libs/ardour')
+libraries['midi++2']   = LibraryInfo (LIBS='midi++', LIBPATH='#libs/midi++2', CPPPATH='#libs/midi++2')
+libraries['smf']       = LibraryInfo (LIBS='smf', LIBPATH='#libs/evoral/src/libsmf', CPPPATH='#libs/evoral/src/libsmf/')
+libraries['evoral']    = LibraryInfo (LIBS='evoral', LIBPATH='#libs/evoral', CPPPATH='#libs/evoral')
+libraries['pbd']       = LibraryInfo (LIBS='pbd', LIBPATH='#libs/pbd', CPPPATH='#libs/pbd')
 libraries['gtkmm2ext'] = LibraryInfo (LIBS='gtkmm2ext', LIBPATH='#libs/gtkmm2ext', CPPPATH='#libs/gtkmm2ext')
 
 
@@ -653,9 +678,9 @@ env = conf.Finish()
 
 opt_flags = []
 if env['GPROFILE'] == 1:
-    debug_flags = [ '-g', '-pg' ]
+    debug_flags = [ '-O0', '-g', '-pg' ]
 else:
-    debug_flags = [ '-g' ]
+    debug_flags = [ '-O0', '-g' ]
 
 # guess at the platform, used to define compiler flags
 
@@ -715,8 +740,14 @@ elif ((re.search ("i[0-9]86", config[config_cpu]) != None) or (re.search ("x86_6
     
     build_host_supports_sse = 0
     
-    debug_flags.append ("-DARCH_X86")
-    opt_flags.append ("-DARCH_X86")
+    #
+    # ARCH_X86 means anything in the x86 family from i386 to x86_64
+    # USE_X86_64_ASM is used to distingush 32 and 64 bit assembler
+    #
+
+    if (re.search ("(i[0-9]86|x86_64)", config[config_cpu]) != None):
+        debug_flags.append ("-DARCH_X86")
+        opt_flags.append ("-DARCH_X86")
     
     if config[config_kernel] == 'linux' :
         
@@ -836,10 +867,6 @@ if env['EXTRA_WARN']:
     env.Append(CXXFLAGS="-ansi")
 #    env.Append(CFLAGS="-iso")
 
-if env['LIBLO']:
-    env.Append(CCFLAGS="-DHAVE_LIBLO")
-
-
 #
 # fix scons nitpickiness on APPLE
 #
@@ -848,15 +875,15 @@ if env['LIBLO']:
 def prep_libcheck(topenv, libinfo):
     if topenv['IS_OSX']:
        #
-       # rationale: GTK-Quartz uses jhbuild and installs to $HOME/gtk/inst by default.
-       #            All libraries needed should be built against this location
+       # rationale: GTK-Quartz uses jhbuild and installs to ~/gtk/inst by default.
+       # All libraries needed should be built against this location
 
        if topenv['GTKOSX']:
-               GTKROOT = os.path.expanduser ('~/gtk/inst')
-               libinfo.Append(CPPPATH= GTKROOT + "/include", LIBPATH= GTKROOT + "/lib")
-               libinfo.Append(CXXFLAGS="-I" + GTKROOT + "/include", LINKFLAGS="-L" + GTKROOT + "/lib")
-               #libinfo.Append(CPPPATH="/opt/local/include", LIBPATH="/opt/local/lib")
-               #libinfo.Append(CXXFLAGS="-I/opt/local/include", LINKFLAGS="-L/opt/local/lib")
+            GTKROOT = os.path.expanduser ('~/gtk/inst')
+            libinfo.Append(CPPPATH= GTKROOT + "/include", LIBPATH= GTKROOT + "/lib")
+            libinfo.Append(CXXFLAGS="-I" + GTKROOT + "/include", LINKFLAGS="-L" + GTKROOT + "/lib")
+
+                
 
 prep_libcheck(env, env)
 
@@ -913,6 +940,45 @@ else:
 
 libraries['usb'] = conf.Finish ()
 
+#
+# Check for wiimote dependencies
+
+if env['WIIMOTE']:
+    wiimoteConf = env.Configure ( )
+    if not wiimoteConf.CheckHeader('cwiid.h'):
+       print 'WIIMOTE configured but you are missing libcwiid!'
+        sys.exit(1)
+    if not wiimoteConf.CheckHeader('bluetooth/bluetooth.h'):
+        print 'WIIMOTE configured but you are missing the libbluetooth headers which you need to compile wiimote support!'
+        sys.exit(1)
+    wiimoteConf.Finish()
+
+
+#
+# Check for FLAC
+
+libraries['flac'] = LibraryInfo ()
+prep_libcheck(env, libraries['flac'])
+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
+#                since the version of libsndfile we have internally does not support
+#                the new API that libFLAC has adopted
+#
+
+conf = Configure (libraries['flac'])
+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...
+#libraries['flac']    = LibraryInfo (LIBS='FLAC')
+
 # boost (we don't link against boost, just use some header files)
 
 libraries['boost'] = LibraryInfo ()
@@ -928,16 +994,17 @@ libraries['boost'] = conf.Finish ()
 #
 # Check for liblo
 
-if env['LIBLO']:
-    libraries['lo'] = LibraryInfo ()
-    prep_libcheck(env, libraries['lo'])
+libraries['lo'] = LibraryInfo ()
+prep_libcheck(env, libraries['lo'])
 
-    conf = Configure (libraries['lo'])
-    if conf.CheckLib ('lo', 'lo_server_new') == False:
-        print "liblo does not appear to be installed."
-        sys.exit (1)
-    
-    libraries['lo'] = conf.Finish ()
+conf = Configure (libraries['lo'])
+if conf.CheckLib ('lo', 'lo_server_new') == False:
+    print "liblo does not appear to be installed."
+    env['HAVE_LIBLO'] = False
+else:
+    env['HAVE_LIBLO'] = True
+
+libraries['lo'] = conf.Finish ()
 
 #
 # Check for dmalloc
@@ -987,16 +1054,18 @@ conf = Configure(env)
 libraries['asound'] = LibraryInfo ()
 
 if conf.CheckCHeader('alsa/asoundlib.h'):
-    libraries['asound'] = LibraryInfo (LIBS='asound')
+    libraries['asound'].ParseConfig('pkg-config --cflags --libs alsa')
 
 if conf.CheckCHeader('jack/midiport.h'):
     libraries['sysmidi'] = LibraryInfo (LIBS='jack')
     env['SYSMIDI'] = 'JACK MIDI'
     subst_dict['%MIDITAG%'] = "control"
     subst_dict['%MIDITYPE%'] = "jack"
+    env.Append(CCFLAGS=" -DWITH_JACK_MIDI")
     print "Using JACK MIDI"
 elif conf.CheckCHeader('alsa/asoundlib.h'):
-    libraries['sysmidi'] = LibraryInfo (LIBS='asound')
+    libraries['sysmidi'] = LibraryInfo ()
+    libraries['sysmidi'].ParseConfig('pkg-config --cflags --libs alsa')
     env['SYSMIDI'] = 'ALSA Sequencer'
     subst_dict['%MIDITAG%'] = "seq"
     subst_dict['%MIDITYPE%'] = "alsa/sequencer"
@@ -1019,6 +1088,11 @@ else:
 
 env = conf.Finish()
 
+if env['GTKOSX']:
+    clearlooks_version = 'libs/clearlooks-newer'
+else:
+    clearlooks_version = 'libs/clearlooks-older'
+
 if env['SYSLIBS']:
 
     syslibdeps = \
@@ -1084,6 +1158,7 @@ if env['SYSLIBS']:
     subdirs = [
         'libs/pbd',
         'libs/midi++2',
+        'libs/evoral/src/libsmf',
         'libs/evoral',
         'libs/ardour',
         'libs/vamp-sdk',
@@ -1103,7 +1178,7 @@ if env['SYSLIBS']:
 #        'libs/flowcanvas',
         'libs/gtkmm2ext',
         'gtk2_ardour',
-        'libs/clearlooks'
+        clearlooks_version
         ]
 
 else:
@@ -1122,6 +1197,9 @@ else:
     libraries['pangomm'] = LibraryInfo(LIBS='pangomm',
                                     LIBPATH='#libs/gtkmm2/pango',
                                     CPPPATH='#libs/gtkmm2/pango')
+    libraries['cairomm'] = LibraryInfo(LIBS='cairomm',
+                                    LIBPATH='#libs/cairomm',
+                                    CPPPATH='#libs/cairomm')
     libraries['atkmm'] = LibraryInfo(LIBS='atkmm',
                                      LIBPATH='#libs/gtkmm2/atk',
                                      CPPPATH='#libs/gtkmm2/atk')
@@ -1161,6 +1239,7 @@ else:
         'libs/taglib',
         'libs/pbd',
         'libs/midi++2',
+        'libs/evoral/src/libsmf',
         'libs/evoral',
         'libs/ardour',
         'libs/vamp-sdk',
@@ -1185,22 +1264,24 @@ else:
         'libs/libgnomecanvasmm',
         'libs/gtkmm2ext',
         'gtk2_ardour',
-        'libs/clearlooks',
-        'libs/cairomm'
+        'libs/cairomm',
+        clearlooks_version
         ]
 
 #
 # * always build the LGPL control protocol lib, since we link against it from libardour
-# * ditto for generic MIDI
-# * tranzport checks whether it should build internally, but we need here so that
-#   its included in the tarball
+# * ditto for generic MIDI and OSC
+# * tranzport & wiimote check whether they should build internally, but we need them here
+#   so that they are included in the tarball
 #
 
 surface_subdirs = [ 'libs/surfaces/control_protocol',
                     'libs/surfaces/generic_midi',
                     'libs/surfaces/tranzport',
                     'libs/surfaces/mackie',
-                    'libs/surfaces/powermate'
+                    'libs/surfaces/powermate',
+                   'libs/surfaces/wiimote',
+                   'libs/surfaces/osc'
                     ]
 
 if env['SURFACES']:
@@ -1316,6 +1397,21 @@ if not conf.CheckFunc('posix_memalign'):
 
 env = conf.Finish()
 
+# Which GTK tooltips API
+
+gtktestenv = env.Clone ()
+gtktestenv.Merge ([
+        libraries['gtk2']
+        ])
+
+conf = gtktestenv.Configure ()
+
+if conf.CheckFunc('gtk_widget_set_tooltip_text'):
+    env.Append (CXXFLAGS='-DGTK_NEW_TOOLTIP_API')
+
+conf.Finish ()
+
+
 # generate the per-user and system rc files from the same source
 
 sysrcbuild = env.SubstInFile ('ardour_system.rc','ardour.rc.in', SUBST_DICT = subst_dict)
@@ -1348,7 +1444,7 @@ Default (sysrcbuild)
 Precious (env['DISTTREE'])
 
 env.Distribute (env['DISTTREE'],
-               [ 'SConstruct', 'svn_revision.h',
+               [ 'SConstruct', 
                   'COPYING', 'PACKAGER_README', 'README',
                   'ardour.rc.in',
                   'tools/config.guess',
@@ -1363,12 +1459,10 @@ env.Distribute (env['DISTTREE'],
                   'icons/icon/ardour_icon_tango_48px_blue.png',
                   'icons/icon/ardour_icon_tango_48px_red.png'
                   ] +
-                glob.glob ('DOCUMENTATION/AUTHORS*') +
-                glob.glob ('DOCUMENTATION/CONTRIBUTORS*') +
-                glob.glob ('DOCUMENTATION/TRANSLATORS*') +
-                glob.glob ('DOCUMENTATION/BUILD*') +
-                glob.glob ('DOCUMENTATION/FAQ*') +
-                glob.glob ('DOCUMENTATION/README*')
+                glob.glob ('ardour.1*') +
+                glob.glob ('libs/clearlooks-newer/*.c') +
+                glob.glob ('libs/clearlooks-newer/*.h') +
+                glob.glob ('libs/clearlooks-newer/SConscript')
                 )
 
 srcdist = env.Tarball(env['TARBALL'], [ env['DISTTREE'], the_revision ])