merge changes to libmidi++ API from 2.0-ongoing
[ardour.git] / SConstruct
index f1a9a5e707b41f1f580670e15e7a373561dfd415..d462a155cbda6883c5c60e3b31dcf8aa6a41a8c4 100644 (file)
@@ -16,7 +16,7 @@ import SCons.Node.FS
 SConsignFile()
 EnsureSConsVersion(0, 96)
 
 SConsignFile()
 EnsureSConsVersion(0, 96)
 
-ardour_version = '2.0beta10'
+ardour_version = '2.1pre'
 
 subst_dict = { }
 
 
 subst_dict = { }
 
@@ -28,22 +28,25 @@ opts = Options('scache.conf')
 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),
 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('CMT', 'Compile with support for CMT Additions', 1),
     BoolOption('COREAUDIO', 'Compile with Apple\'s CoreAudio library', 0),
     BoolOption('COREAUDIO', 'Compile with Apple\'s CoreAudio library', 0),
-    BoolOption('DEBUG', 'Set to build with debugging information and no optimizations', 0),
+    BoolOption('DEBUG', 'Set to build with debugging information and no optimizations', 1),
     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),
     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),
     BoolOption('FPU_OPTIMIZATION', 'Build runtime checked assembler code', 1),
     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),
     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),
     BoolOption('FPU_OPTIMIZATION', 'Build runtime checked assembler code', 1),
+    BoolOption('GPROFILE', 'Compile with support for gprofile (Developers only)', 0),
     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('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('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('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('TRANZPORT', 'Compile with support for Frontier Designs (if libusb is available)', 1),
+    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('VERSIONED', 'Add revision information to ardour/gtk executable name inside the build directory', 0),
     BoolOption('VST', 'Compile with support for VST', 0),
-    BoolOption('TRANZPORT', 'Compile with support for Frontier Designs (if libusb is available)', 0)
 )
 
 #----------------------------------------------------------------------
 )
 
 #----------------------------------------------------------------------
@@ -311,7 +314,7 @@ env.Append (BUILDERS = {'VersionBuild' : version_bld})
 #
 
 def versioned_builder(target,source,env):
 #
 
 def versioned_builder(target,source,env):
-    w, r = os.popen2( "svn info | awk '/^Revision:/ { print $2}'")
+    w, r = os.popen2( "LANG= svn info | awk '/^Revision:/ { print $2}'")
     
     last_revision = r.readline().strip()
     w.close()
     
     last_revision = r.readline().strip()
     w.close()
@@ -380,14 +383,22 @@ env.Append (BUILDERS = {'Tarball' : tarball_bld})
 #
 
 if env['VST']:
 #
 
 if env['VST']:
-    sys.stdout.write ("Are you building Ardour for personal use (rather than distribution to others)? [no]: ")
-    answer = sys.stdin.readline ()
-    answer = answer.rstrip().strip()
-    if answer != "yes" and answer != "y":
-        print 'You cannot build Ardour with VST support for distribution to others.\nIt is a violation of several different licenses. Build with VST=false.'
-        sys.exit (-1);
+    if os.path.isfile('.personal_use_only'):
+        print "Enabling VST support. Note that distributing a VST-enabled ardour\nis a violation of several different licences.\nBuild with VST=false if you intend to distribute ardour to others."
     else:
     else:
-        print "OK, VST support will be enabled"
+        sys.stdout.write ("Are you building Ardour for personal use (rather than distribution to others)? [no]: ")
+        answer = sys.stdin.readline ()
+        answer = answer.rstrip().strip()
+        if answer == "yes" or answer == "y":
+            fh = open('.personal_use_only', 'w')
+            fh.close()
+            print "OK, VST support will be enabled"
+        else:
+            print 'You cannot build Ardour with VST support for distribution to others.\nIt is a violation of several different licenses. Build with VST=false.'
+            sys.exit (-1);
+else:
+    if os.path.isfile('.personal_use_only'):
+        os.remove('.personal_use_only')
 
 
 #######################
 
 
 #######################
@@ -403,7 +414,7 @@ deps = \
        'samplerate'           : '0.1.0',
        'raptor'               : '1.4.2',
        'lrdf'                 : '0.4.0',
        'samplerate'           : '0.1.0',
        'raptor'               : '1.4.2',
        'lrdf'                 : '0.4.0',
-       'jack'                 : '0.101.1',
+       'jack'                 : '0.105.0',
        'libgnomecanvas-2.0'   : '2.0'
 }
 
        'libgnomecanvas-2.0'   : '2.0'
 }
 
@@ -530,7 +541,10 @@ env = conf.Finish()
 #
 
 opt_flags = []
 #
 
 opt_flags = []
-debug_flags = [ '-g' ]
+if env['GPROFILE'] == 1:
+    debug_flags = [ '-g', '-pg' ]
+else:
+    debug_flags = [ '-g' ]
 
 # guess at the platform, used to define compiler flags
 
 
 # guess at the platform, used to define compiler flags
 
@@ -596,7 +610,7 @@ elif ((re.search ("i[0-9]86", config[config_cpu]) != None) or (re.search ("x86_6
         if env['DIST_TARGET'] != 'i386':
             
             flag_line = os.popen ("cat /proc/cpuinfo | grep '^flags'").read()[:-1]
         if env['DIST_TARGET'] != 'i386':
             
             flag_line = os.popen ("cat /proc/cpuinfo | grep '^flags'").read()[:-1]
-            x86_flags = flag_line.split (": ")[1:][0].split (' ')
+            x86_flags = flag_line.split (": ")[1:][0].split ()
             
             if "mmx" in x86_flags:
                 opt_flags.append ("-mmmx")
             
             if "mmx" in x86_flags:
                 opt_flags.append ("-mmmx")
@@ -611,8 +625,8 @@ elif ((re.search ("i[0-9]86", config[config_cpu]) != None) or (re.search ("x86_6
                 opt_flags.append ("-march=i686")
     
     if ((env['DIST_TARGET'] == 'i686') or (env['DIST_TARGET'] == 'x86_64')) and build_host_supports_sse:
                 opt_flags.append ("-march=i686")
     
     if ((env['DIST_TARGET'] == 'i686') or (env['DIST_TARGET'] == 'x86_64')) and build_host_supports_sse:
-        opt_flags.extend (["-msse", "-mfpmath=sse"])
-        debug_flags.extend (["-msse", "-mfpmath=sse"])
+        opt_flags.extend (["-msse", "-mfpmath=sse", "-DUSE_XMMINTRIN"])
+        debug_flags.extend (["-msse", "-mfpmath=sse", "-DUSE_XMMINTRIN"])
 # end of processor-specific section
 
 # optimization section
 # end of processor-specific section
 
 # optimization section
@@ -659,13 +673,20 @@ opt_flags[:0] = [
     "-O3",
     "-fomit-frame-pointer",
     "-ffast-math",
     "-O3",
     "-fomit-frame-pointer",
     "-ffast-math",
-    "-fstrength-reduce"
+    "-fstrength-reduce",
+    "-pipe"
     ]
 
 if env['DEBUG'] == 1:
     env.Append(CCFLAGS=" ".join (debug_flags))
     ]
 
 if env['DEBUG'] == 1:
     env.Append(CCFLAGS=" ".join (debug_flags))
+    env.Append(LINKFLAGS=" ".join (debug_flags))
 else:
     env.Append(CCFLAGS=" ".join (opt_flags))
 else:
     env.Append(CCFLAGS=" ".join (opt_flags))
+    env.Append(LINKFLAGS=" ".join (opt_flags))
+
+if env['UNIVERSAL'] == 1:
+    env.Append(CCFLAGS="-arch i386 -arch ppc")
+    env.Append(LINKFLAGS="-arch i386 -arch ppc")
 
 #
 # warnings flags
 
 #
 # warnings flags
@@ -675,8 +696,9 @@ env.Append(CCFLAGS="-Wall")
 env.Append(CXXFLAGS="-Woverloaded-virtual")
 
 if env['EXTRA_WARN']:
 env.Append(CXXFLAGS="-Woverloaded-virtual")
 
 if env['EXTRA_WARN']:
-    env.Append(CCFLAGS="-Wextra -pedantic")
+    env.Append(CCFLAGS="-Wextra -pedantic -ansi")
     env.Append(CXXFLAGS="-ansi")
     env.Append(CXXFLAGS="-ansi")
+#    env.Append(CFLAGS="-iso")
 
 if env['LIBLO']:
     env.Append(CCFLAGS="-DHAVE_LIBLO")
 
 if env['LIBLO']:
     env.Append(CCFLAGS="-DHAVE_LIBLO")
@@ -705,6 +727,12 @@ if conf.CheckLib ('usb', 'usb_interrupt_write'):
 else:
     have_libusb = False
 
 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 ()
 
 #
 libraries['usb'] = conf.Finish ()
 
 #
@@ -714,10 +742,19 @@ libraries['flac'] = LibraryInfo ()
 prep_libcheck(env, libraries['flac'])
 libraries['flac'].Append(CCFLAGS="-I/usr/local/include", LINKFLAGS="-L/usr/local/lib")
 
 prep_libcheck(env, libraries['flac'])
 libraries['flac'].Append(CCFLAGS="-I/usr/local/include", LINKFLAGS="-L/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'])
 conf = Configure (libraries['flac'])
-conf.CheckLib ('FLAC', 'FLAC__stream_decoder_new', language='CXX')
+if conf.CheckLib ('FLAC', 'FLAC__seekable_stream_decoder_set_read_callback', language='CXX'):
+    conf.env.Append(CCFLAGS='-DHAVE_FLAC')
+    use_flac = True
+else:
+    use_flac = False
 libraries['flac'] = conf.Finish ()
 libraries['flac'] = conf.Finish ()
-
 # or if that fails...
 #libraries['flac']    = LibraryInfo (LIBS='FLAC')
 
 # or if that fails...
 #libraries['flac']    = LibraryInfo (LIBS='FLAC')
 
@@ -819,6 +856,8 @@ if env['SYSLIBS']:
     libraries['sigc2'].ParseConfig('pkg-config --cflags --libs sigc++-2.0')
     libraries['glibmm2'] = LibraryInfo()
     libraries['glibmm2'].ParseConfig('pkg-config --cflags --libs glibmm-2.4')
     libraries['sigc2'].ParseConfig('pkg-config --cflags --libs sigc++-2.0')
     libraries['glibmm2'] = LibraryInfo()
     libraries['glibmm2'].ParseConfig('pkg-config --cflags --libs glibmm-2.4')
+    libraries['cairomm'] = LibraryInfo()
+    libraries['cairomm'].ParseConfig('pkg-config --cflags --libs cairomm-1.0')
     libraries['gdkmm2'] = LibraryInfo()
     libraries['gdkmm2'].ParseConfig ('pkg-config --cflags --libs gdkmm-2.4')
     libraries['gtkmm2'] = LibraryInfo()
     libraries['gdkmm2'] = LibraryInfo()
     libraries['gdkmm2'].ParseConfig ('pkg-config --cflags --libs gdkmm-2.4')
     libraries['gtkmm2'] = LibraryInfo()
@@ -836,7 +875,7 @@ if env['SYSLIBS']:
     
     libraries['sndfile-ardour'] = LibraryInfo(LIBS='libsndfile-ardour',
                                     LIBPATH='#libs/libsndfile',
     
     libraries['sndfile-ardour'] = LibraryInfo(LIBS='libsndfile-ardour',
                                     LIBPATH='#libs/libsndfile',
-                                    CPPPATH=['#libs/libsndfile', '#libs/libsndfile/src'])
+                                    CPPPATH=['#libs/libsndfile/src'])
 
 #    libraries['libglademm'] = LibraryInfo()
 #    libraries['libglademm'].ParseConfig ('pkg-config --cflags --libs libglademm-2.4')
 
 #    libraries['libglademm'] = LibraryInfo()
 #    libraries['libglademm'].ParseConfig ('pkg-config --cflags --libs libglademm-2.4')
@@ -844,6 +883,8 @@ if env['SYSLIBS']:
 #    libraries['flowcanvas'] = LibraryInfo(LIBS='flowcanvas', LIBPATH='#/libs/flowcanvas', CPPPATH='#libs/flowcanvas')
     libraries['soundtouch'] = LibraryInfo()
     libraries['soundtouch'].ParseConfig ('pkg-config --cflags --libs libSoundTouch')
 #    libraries['flowcanvas'] = LibraryInfo(LIBS='flowcanvas', LIBPATH='#/libs/flowcanvas', CPPPATH='#libs/flowcanvas')
     libraries['soundtouch'] = LibraryInfo()
     libraries['soundtouch'].ParseConfig ('pkg-config --cflags --libs libSoundTouch')
+    # Comment the previous line and uncomment this for Debian:
+    #libraries['soundtouch'].ParseConfig ('pkg-config --cflags --libs libSoundTouch')
 
     libraries['appleutility'] = LibraryInfo(LIBS='libappleutility',
                                             LIBPATH='#libs/appleutility',
 
     libraries['appleutility'] = LibraryInfo(LIBS='libappleutility',
                                             LIBPATH='#libs/appleutility',
@@ -954,13 +995,31 @@ else:
 #   its included in the tarball
 #
 
 #   its included in the tarball
 #
 
-surface_subdirs = [ 'libs/surfaces/control_protocol', 'libs/surfaces/generic_midi', 'libs/surfaces/tranzport' ]
+surface_subdirs = [ 'libs/surfaces/control_protocol',
+                    'libs/surfaces/generic_midi',
+                    'libs/surfaces/tranzport',
+                    'libs/surfaces/mackie',
+                    'libs/surfaces/powermate'
+                    ]
 
 if env['SURFACES']:
     if have_libusb:
 
 if env['SURFACES']:
     if have_libusb:
-        env['TRANZPORT'] = 'yes'
+        env['TRANZPORT'] = 1
+    else:
+        env['TRANZPORT'] = 0
+        print 'Disabled building Tranzport code because libusb could not be found'
+
+    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.access ('libs/surfaces/sony9pin', os.F_OK):
         surface_subdirs += [ 'libs/surfaces/sony9pin' ]
     if os.access ('libs/surfaces/sony9pin', os.F_OK):
         surface_subdirs += [ 'libs/surfaces/sony9pin' ]
+else:
+    env['POWERMATE'] = 0
+    env['TRANZPORT'] = 0
 
 opts.Save('scache.conf', env)
 Help(opts.GenerateHelpText(env))
 
 opts.Save('scache.conf', env)
 Help(opts.GenerateHelpText(env))
@@ -1049,7 +1108,7 @@ env = conf.Finish()
 if env['NLS'] == 1:
     env.Append(CCFLAGS="-DENABLE_NLS")
 
 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
 
 #
 # the configuration file may be system dependent
@@ -1061,8 +1120,8 @@ if conf.CheckCHeader('/System/Library/Frameworks/CoreAudio.framework/Versions/A/
     subst_dict['%JACK_INPUT%'] = "coreaudio:Built-in Audio:in"
     subst_dict['%JACK_OUTPUT%'] = "coreaudio:Built-in Audio:out"
 else:
     subst_dict['%JACK_INPUT%'] = "coreaudio:Built-in Audio:in"
     subst_dict['%JACK_OUTPUT%'] = "coreaudio:Built-in Audio:out"
 else:
-    subst_dict['%JACK_INPUT%'] = "alsa_pcm:playback_"
-    subst_dict['%JACK_OUTPUT%'] = "alsa_pcm:capture_"
+    subst_dict['%JACK_INPUT%'] = "system:playback_"
+    subst_dict['%JACK_OUTPUT%'] = "system:capture_"
 
 # posix_memalign available
 if not conf.CheckFunc('posix_memalign'):
 
 # posix_memalign available
 if not conf.CheckFunc('posix_memalign'):
@@ -1072,15 +1131,26 @@ if not conf.CheckFunc('posix_memalign'):
 
 env = conf.Finish()
 
 
 env = conf.Finish()
 
-rcbuild = env.SubstInFile ('ardour.rc','ardour.rc.in', SUBST_DICT = subst_dict)
+# 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)
+
+# add to the substitution dictionary
+
+subst_dict['%VERSION%'] = ardour_version[0:3]
+subst_dict['%EXTRA_VERSION%'] = ardour_version[3:]
+subst_dict['%REVISION_STRING%'] = ''
+if os.path.exists('.svn'):
+    subst_dict['%REVISION_STRING%'] = '.' + fetch_svn_revision ('.') + 'svn'
+
+# specbuild = env.SubstInFile ('ardour.spec','ardour.spec.in', SUBST_DICT = subst_dict)
 
 the_revision = env.Command ('frobnicatory_decoy', [], create_stored_revision)
 
 env.Alias('revision', the_revision)
 env.Alias('install', env.Install(os.path.join(config_prefix, 'ardour2'), 'ardour_system.rc'))
 
 the_revision = env.Command ('frobnicatory_decoy', [], create_stored_revision)
 
 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'))
 
 
-Default (rcbuild)
+Default (sysrcbuild)
 
 # source tarball
 
 
 # source tarball
 
@@ -1090,7 +1160,6 @@ env.Distribute (env['DISTTREE'],
                [ 'SConstruct', 'svn_revision.h',
                   'COPYING', 'PACKAGER_README', 'README',
                   'ardour.rc.in',
                [ 'SConstruct', 'svn_revision.h',
                   'COPYING', 'PACKAGER_README', 'README',
                   'ardour.rc.in',
-                  'ardour_system.rc',
                   'tools/config.guess',
                   'icons/icon/ardour_icon_mac_mask.png',
                   'icons/icon/ardour_icon_mac.png',
                   'tools/config.guess',
                   'icons/icon/ardour_icon_mac_mask.png',
                   'icons/icon/ardour_icon_mac.png',