weak/runtime jack linking: load libjack dynamically at runtime
[ardour.git] / wscript
diff --git a/wscript b/wscript
index 6a01e3d8a3a5c54a5d7078dce6d478403743bf11..506f4a589c574fe65ef1e217c68ad415d97f5129 100644 (file)
--- a/wscript
+++ b/wscript
@@ -7,6 +7,7 @@ import string
 import subprocess
 import sys
 import platform as PLATFORM
+from waflib.Tools import winres
 
 def fetch_git_revision ():
     cmd = "git describe HEAD"
@@ -16,7 +17,7 @@ def fetch_git_revision ():
 
 def fetch_tarball_revision ():
     if not os.path.exists ('libs/ardour/revision.cc'):
-        print 'This tarball was not created correctly - it is missing libs/ardour/revision.cc'
+        print ('This tarball was not created correctly - it is missing libs/ardour/revision.cc')
         sys.exit (1)
     with open('libs/ardour/revision.cc') as f:
         content = f.readlines()
@@ -30,21 +31,21 @@ else:
 
 #
 # rev is now of the form MAJOR.MINOR-rev-commit
+# or, if right at the same rev as a release, MAJOR.MINOR
 #
 
 parts = rev.split ('.')
 MAJOR = parts[0]
 other = parts[1].split ('-')
 MINOR = other[0]
-MICRO = other[1]
+if len(other) > 1:
+    MICRO = other[1]
+else:
+    MICRO = '0'
 
 V = MAJOR + '.' + MINOR + '.' + MICRO
-#
-# it is important that VERSION *not* be unicode string
-# because if it is, it breaks waf somehow.
-#
-VERSION = V.encode ('ascii', 'ignore')
-APPNAME = 'Ardour' + MAJOR
+VERSION = V
+PROGRAM_VERSION = MAJOR
 
 # Mandatory variables
 top = '.'
@@ -77,6 +78,7 @@ children = [
         # shared helper binaries (plugin-scanner, exec-wrapper)
         'libs/fst',
         'libs/vfork',
+        'libs/ardouralsautil',
 ]
 
 i18n_children = [
@@ -148,15 +150,6 @@ def set_compiler_flags (conf,opt):
     # waf adds -O0 -g itself. thanks waf!
     is_clang = conf.env['CXX'][0].endswith('clang++')
     
-    if conf.options.cxx11:
-        conf.check_cxx(cxxflags=["-std=c++11"])
-        cxx_flags.append('-std=c++11')
-        if platform == "darwin":
-            cxx_flags.append('-stdlib=libc++')
-            link_flags.append('-lc++')
-            # Prevents visibility issues in standard headers
-            conf.define("_DARWIN_C_SOURCE", 1)
-
     if conf.options.asan:
         conf.check_cxx(cxxflags=["-fsanitize=address", "-fno-omit-frame-pointer"], linkflags=["-fsanitize=address"])
         cxx_flags.append('-fsanitize=address')
@@ -172,6 +165,15 @@ def set_compiler_flags (conf,opt):
     if opt.gprofile:
         debug_flags = [ '-pg' ]
 
+    # OSX
+    if platform == 'darwin':
+        if re.search ("^13[.]", version) != None:
+            conf.env['build_host'] = 'mavericks'
+        elif re.search ("^14[.]", version) != None:
+            conf.env['build_host'] = 'yosemite'
+        else:
+            conf.env['build_host'] = 'irrelevant'
+
     # Autodetect
     if opt.dist_target == 'auto':
         if platform == 'darwin':
@@ -186,8 +188,12 @@ def set_compiler_flags (conf,opt):
                 conf.env['build_target'] = 'snowleopard'
             elif re.search ("^11[.]", version) != None:
                 conf.env['build_target'] = 'lion'
-            else:
+            elif re.search ("^12[.]", version) != None:
                 conf.env['build_target'] = 'mountainlion'
+            elif re.search ("^13[.]", version) != None:
+                conf.env['build_target'] = 'mavericks'
+            else:
+                conf.env['build_target'] = 'yosemite'
         else:
             match = re.search(
                     "(?P<cpu>i[0-6]86|x86_64|powerpc|ppc|ppc64|arm|s390x?)",
@@ -208,25 +214,21 @@ def set_compiler_flags (conf,opt):
         # 
         compiler_flags.append ('-U__STRICT_ANSI__')
 
-    if cpu == 'powerpc' and conf.env['build_target'] != 'none':
-        #
-        # Apple/PowerPC optimization options
-        #
-        # -mcpu=7450 does not reliably work with gcc 3.*
-        #
-        if opt.dist_target == 'panther' or opt.dist_target == 'tiger':
-            if platform == 'darwin':
-                # optimization_flags.extend ([ "-mcpu=7450", "-faltivec"])
-                # to support g3s but still have some optimization for above
-                compiler_flags.extend ([ "-mcpu=G3", "-mtune=7450"])
-            else:
-                compiler_flags.extend ([ "-mcpu=7400", "-maltivec", "-mabi=altivec"])
-        else:
-            compiler_flags.extend([ "-mcpu=750", "-mmultiple" ])
-        compiler_flags.extend (["-mhard-float", "-mpowerpc-gfxopt"])
-        optimization_flags.extend (["-Os"])
+    if conf.options.cxx11 or conf.env['build_host'] in [ 'mavericks', 'yosemite' ]:
+        conf.check_cxx(cxxflags=["-std=c++11"])
+        cxx_flags.append('-std=c++11')
+        c_flags.append('-Qunused-arguments')
+        cxx_flags.append('-Qunused-arguments')
+        if platform == "darwin":
+            cxx_flags.append('--stdlib=libstdc++')
+            # Mavericks and later changed the syntax to be used when including Carbon headers,
+            # from requiring a full path to requiring just the header name.
+            cxx_flags.append('-DCARBON_FLAT_HEADERS')
+            linker_flags.append('--stdlib=libstdc++')
+            # Prevents visibility issues in standard headers
+            conf.define("_DARWIN_C_SOURCE", 1)
 
-    elif ((re.search ("i[0-9]86", cpu) != None) or (re.search ("x86_64", cpu) != None)) and conf.env['build_target'] != 'none':
+    if ((re.search ("i[0-9]86", cpu) != None) or (re.search ("x86_64", cpu) != None)) and conf.env['build_target'] != 'none':
 
 
         #
@@ -270,7 +272,7 @@ def set_compiler_flags (conf,opt):
     if conf.env['FPU_OPTIMIZATION']:
         if sys.platform == 'darwin':
             compiler_flags.append("-DBUILD_VECLIB_OPTIMIZATIONS");
-            linker_flags.append("-framework Accelerate")
+            conf.env.append_value('LINKFLAGS_OSX', ['-framework', 'Accelerate'])
         elif conf.env['build_target'] == 'i686' or conf.env['build_target'] == 'x86_64':
             compiler_flags.append ("-DBUILD_SSE_OPTIMIZATIONS")
         if not build_host_supports_sse:
@@ -299,8 +301,7 @@ def set_compiler_flags (conf,opt):
     # a single way to test if we're on OS X
     #
 
-    if conf.env['build_target'] in ['panther', 'tiger', 'leopard', 'snowleopard' ]:
-        conf.define ('IS_OSX', 1)
+    if conf.env['build_target'] in ['panther', 'tiger', 'leopard' ]:
         # force tiger or later, to avoid issues on PPC which defaults
         # back to 10.1 if we don't tell it otherwise.
 
@@ -308,12 +309,20 @@ def set_compiler_flags (conf,opt):
                 ("-DMAC_OS_X_VERSION_MIN_REQUIRED=1040",
                  '-mmacosx-version-min=10.4'))
 
+    elif conf.env['build_target'] in [ 'snowleopard' ]:
+        compiler_flags.extend(
+                ("-DMAC_OS_X_VERSION_MIN_REQUIRED=1060",
+                 '-mmacosx-version-min=10.6'))
+
     elif conf.env['build_target'] in [ 'lion', 'mountainlion' ]:
         compiler_flags.extend(
                 ("-DMAC_OS_X_VERSION_MIN_REQUIRED=1070",
                  '-mmacosx-version-min=10.7'))
-    else:
-        conf.define ('IS_OSX', 0)
+
+    elif conf.env['build_target'] in [ 'mavericks', 'yosemite' ]:
+        compiler_flags.extend(
+                ("-DMAC_OS_X_VERSION_MAX_ALLOWED=1090",
+                 "-mmacosx-version-min=10.8"))
 
     #
     # save off CPU element in an env
@@ -348,6 +357,9 @@ def set_compiler_flags (conf,opt):
                 "-fstrength-reduce"
                 ]
 
+    if opt.debug_symbols:
+        optimization_flags += [ '-g' ]
+
     if opt.stl_debug:
         cxx_flags.append("-D_GLIBCXX_DEBUG")
 
@@ -367,7 +379,7 @@ def set_compiler_flags (conf,opt):
     #
 
     compiler_flags.extend(
-            ('-Wall', '-Wpointer-arith', '-Wcast-qual', '-Wcast-align'))
+            ('-Wall', '-Wpointer-arith', '-Wcast-qual', '-Wcast-align', '-Wno-unused-parameter'))
 
     c_flags.extend(('-Wstrict-prototypes', '-Wmissing-prototypes'))
     cxx_flags.append('-Woverloaded-virtual')
@@ -388,6 +400,7 @@ def set_compiler_flags (conf,opt):
         compiler_flags.append('-DENABLE_NLS')
 
     compiler_flags.append ('-DPROGRAM_NAME="' + Options.options.program_name + '"')
+    compiler_flags.append ('-DPROGRAM_VERSION="' + PROGRAM_VERSION + '"')
 
     if opt.debug:
         conf.env.append_value('CFLAGS', debug_flags)
@@ -420,16 +433,24 @@ def options(opt):
                     help='Whether to build for TRX')
     opt.add_option('--arch', type='string', action='store', dest='arch',
                     help='Architecture-specific compiler flags')
+    opt.add_option('--with-dummy', action='store_true', default=False, dest='build_dummy',
+                   help='Build the dummy backend (no audio/MIDI I/O, useful for profiling)')
+    opt.add_option('--with-alsabackend', action='store_true', default=False, dest='build_alsabackend',
+                   help='Build the ALSA backend')
+    opt.add_option('--with-wavesbackend', action='store_true', default=False, dest='build_wavesbackend',
+                   help='Build the Waves/Portaudio backend')
     opt.add_option('--backtrace', action='store_true', default=True, dest='backtrace',
                     help='Compile with -rdynamic -- allow obtaining backtraces from within Ardour')
     opt.add_option('--no-carbon', action='store_true', default=False, dest='nocarbon',
                     help='Compile without support for AU Plugins with only CARBON UI (needed for 64bit)')
     opt.add_option('--boost-sp-debug', action='store_true', default=False, dest='boost_sp_debug',
                     help='Compile with Boost shared pointer debugging')
+    opt.add_option('--debug-symbols', action='store_true', default=False, dest='debug_symbols',
+                    help='Add debug-symbols to optimized builds')
     opt.add_option('--depstack-root', type='string', default='~', dest='depstack_root',
                     help='Directory/folder where dependency stack trees (gtk, a3) can be found (defaults to ~)')
     opt.add_option('--dist-target', type='string', default='auto', dest='dist_target',
-                    help='Specify the target for cross-compiling [auto,none,x86,i386,i686,x86_64,powerpc,tiger,leopard,mingw]')
+                    help='Specify the target for cross-compiling [auto,none,x86,i386,i686,x86_64,tiger,leopard,mingw]')
     opt.add_option('--fpu-optimization', action='store_true', default=True, dest='fpu_optimization',
                     help='Build runtime checked assembler code (default)')
     opt.add_option('--no-fpu-optimization', action='store_false', dest='fpu_optimization')
@@ -440,6 +461,8 @@ def options(opt):
                     help='Build a version suitable for distribution as a zero-cost binary')
     opt.add_option('--gprofile', action='store_true', default=False, dest='gprofile',
                     help='Compile for use with gprofile')
+    opt.add_option('--libjack', type='string', default="auto", dest='libjack_link',
+                    help='libjack link mode  [auto|link|weak]')
     opt.add_option('--internal-shared-libs', action='store_true', default=True, dest='internal_shared_libs',
                    help='Build internal libs as shared libraries')
     opt.add_option('--internal-static-libs', action='store_false', dest='internal_shared_libs',
@@ -453,6 +476,8 @@ def options(opt):
     opt.add_option('--lv2dir', type='string', help="install destination for builtin LV2 bundles [Default: LIBDIR/lv2]")
     opt.add_option('--lxvst', action='store_true', default=True, dest='lxvst',
                     help='Compile with support for linuxVST plugins')
+    opt.add_option('--no-lxvst', action='store_false', dest='lxvst',
+                    help='Compile without support for linuxVST plugins')
     opt.add_option('--nls', action='store_true', default=True, dest='nls',
                     help='Enable i18n (native language support) (default)')
     opt.add_option('--no-nls', action='store_false', dest='nls')
@@ -509,6 +534,9 @@ def sub_config_and_use(conf, name, has_objects = True):
 def configure(conf):
     conf.load('compiler_c')
     conf.load('compiler_cxx')
+    if Options.options.dist_target == 'mingw':
+        conf.load('winres')
+
     conf.env['VERSION'] = VERSION
     conf.env['MAJOR'] = MAJOR
     conf.env['MINOR'] = MINOR
@@ -649,6 +677,7 @@ def configure(conf):
 
     # executing a test program is n/a when cross-compiling
     if Options.options.dist_target != 'mingw':
+        conf.check_cc(function_name='dlopen', header_name='dlfcn.h', lib='dl', uselib_store='DL')
         conf.check_cxx(fragment = "#include <boost/version.hpp>\nint main(void) { return (BOOST_VERSION >= 103900 ? 0 : 1); }\n",
                   execute = "1",
                   mandatory = True,
@@ -656,6 +685,9 @@ def configure(conf):
                   okmsg = 'ok',
                   errmsg = 'too old\nPlease install boost version 1.39 or higher.')
 
+    if re.search ("linux", sys.platform) != None and Options.options.dist_target != 'mingw':
+        autowaf.check_pkg(conf, 'alsa', uselib_store='ALSA')
+
     autowaf.check_pkg(conf, 'glib-2.0', uselib_store='GLIB', atleast_version='2.2', mandatory=True)
     autowaf.check_pkg(conf, 'gthread-2.0', uselib_store='GTHREAD', atleast_version='2.2', mandatory=True)
     autowaf.check_pkg(conf, 'glibmm-2.4', uselib_store='GLIBMM', atleast_version='2.32.0', mandatory=True)
@@ -685,16 +717,6 @@ def configure(conf):
         # TODO put this only where it is needed
         conf.env.append_value('LIB', 'regex')
 
-    if Options.options.dist_target != 'mingw':
-        conf.check_cc(function_name='dlopen', header_name='dlfcn.h', lib='dl', uselib_store='DL')
-
-        conf.check_cxx(fragment = "#include <boost/version.hpp>\nint main(void) { return (BOOST_VERSION >= 103900 ? 0 : 1); }\n",
-                      execute = "1",
-                      mandatory = True,
-                      msg = 'Checking for boost library >= 1.39',
-                      okmsg = 'ok',
-                      errmsg = 'too old\nPlease install boost version 1.39 or higher.')
-
     # Tell everyone that this is a waf build
 
     conf.env.append_value('CFLAGS', '-DWAF_BUILD')
@@ -744,10 +766,10 @@ def configure(conf):
             conf.env['LXVST_SUPPORT'] = False
         elif Options.options.dist_target == 'mingw':
             conf.env['LXVST_SUPPORT'] = False
-       else:
-           conf.define('LXVST_SUPPORT', 1)
-           conf.env['LXVST_SUPPORT'] = True
-    conf.define('WINDOWS_KEY', opts.windows_key)
+        else:
+            conf.define('LXVST_SUPPORT', 1)
+            conf.env['LXVST_SUPPORT'] = True
+    conf.env['WINDOWS_KEY'] = opts.windows_key
     if opts.rt_alloc_debug:
         conf.define('DEBUG_RT_ALLOC', 1)
         conf.env['DEBUG_RT_ALLOC'] = True
@@ -759,6 +781,12 @@ def configure(conf):
         conf.env['DEBUG_DENORMAL_EXCEPTION'] = True
     if opts.build_tests:
         autowaf.check_pkg(conf, 'cppunit', uselib_store='CPPUNIT', atleast_version='1.12.0', mandatory=True)
+    if opts.build_alsabackend:
+        conf.env['BUILD_ALSABACKEND'] = True
+    if opts.build_dummy:
+        conf.env['BUILD_DUMMYBACKEND'] = True
+    if opts.build_wavesbackend:
+        conf.env['BUILD_WAVESBACKEND'] = True
 
     set_compiler_flags (conf, Options.options)
 
@@ -767,8 +795,7 @@ def configure(conf):
     elif Options.options.dist_target != 'mingw':
         sub_config_and_use(conf, 'tools/sanity_check')
 
-    if Options.options.dist_target != 'mingw':
-        sub_config_and_use(conf, 'libs/clearlooks-newer')
+    sub_config_and_use(conf, 'libs/clearlooks-newer')
 
     for i in children:
         sub_config_and_use(conf, i)
@@ -797,6 +824,8 @@ const char* const ardour_config_info = "\\n\\
     write_config_text('Use External Libraries', conf.is_defined('USE_EXTERNAL_LIBS'))
     write_config_text('Library exports hidden', conf.is_defined('EXPORT_VISIBILITY_HIDDEN'))
 
+    write_config_text('ALSA Backend',          opts.build_alsabackend)
+    write_config_text('ALSA DBus Reservation', conf.is_defined('HAVE_DBUS'))
     write_config_text('Architecture flags',    opts.arch)
     write_config_text('Aubio',                 conf.is_defined('HAVE_AUBIO'))
     write_config_text('AudioUnits',            conf.is_defined('AUDIOUNIT_SUPPORT'))
@@ -804,11 +833,14 @@ const char* const ardour_config_info = "\\n\\
     write_config_text('Build target',          conf.env['build_target'])
     write_config_text('CoreAudio',             conf.is_defined('HAVE_COREAUDIO'))
     write_config_text('Debug RT allocations',  conf.is_defined('DEBUG_RT_ALLOC'))
+    write_config_text('Debug Symbols',         conf.is_defined('debug_symbols') or conf.env['DEBUG'])
+    write_config_text('Dummy backend',         opts.build_dummy)
     write_config_text('Process thread timing', conf.is_defined('PT_TIMING'))
     write_config_text('Denormal exceptions',   conf.is_defined('DEBUG_DENORMAL_EXCEPTION'))
     write_config_text('FLAC',                  conf.is_defined('HAVE_FLAC'))
     write_config_text('FPU optimization',      opts.fpu_optimization)
     write_config_text('Freedesktop files',     opts.freedesktop)
+    write_config_text('Libjack linking',       conf.env['libjack_link'])
     write_config_text('LV2 UI embedding',      conf.is_defined('HAVE_SUIL'))
     write_config_text('LV2 support',           conf.is_defined('LV2_SUPPORT'))
     write_config_text('LXVST support',         conf.is_defined('LXVST_SUPPORT'))
@@ -821,6 +853,7 @@ const char* const ardour_config_info = "\\n\\
 #    write_config_text('Tranzport',             opts.tranzport)
     write_config_text('Unit tests',            conf.env['BUILD_TESTS'])
     write_config_text('Generic x86 CPU',       opts.generic)
+    write_config_text('Waves Backend',         opts.build_wavesbackend)
     write_config_text('Windows VST support',   opts.windows_vst)
     write_config_text('Wiimote support',       conf.is_defined('BUILD_WIIMOTE'))
     write_config_text('Windows key',           opts.windows_key)
@@ -868,13 +901,12 @@ def build(bld):
     elif bld.env['build_target'] != 'mingw':
         bld.recurse('tools/sanity_check')
 
-    if bld.env['build_target'] != 'mingw':
-        bld.recurse('libs/clearlooks-newer')
+    bld.recurse('libs/clearlooks-newer')
 
     for i in children:
         bld.recurse(i)
 
-    bld.install_files (bld.env['SYSCONFDIR'], 'ardour_system.rc')
+    bld.install_files (bld.env['CONFDIR'], 'system_config')
 
     if bld.env['RUN_TESTS']:
         bld.add_post_fun(test)