# # Copyright (C) 2007 Arnold Krille # Copyright (C) 2007 Pieter Palmers # Copyright (C) 2008 Marc-Olivier Barre # # This file originates from FFADO (www.ffado.org) # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # import os from string import Template import commands JACK_MAJOR_VERSION=1 JACK_MINOR_VERSION=9 JACK_MICRO_VERSION=0 JACKAPI_MAJOR_VERSION=0 JACKAPI_MINOR_VERSION=1 JACKAPI_MICRO_VERSION=0 def fetch_svn_revision(path): cmd = "LANG= " cmd += "svnversion " cmd += path return commands.getoutput(cmd) JACK_SVNREVISION=fetch_svn_revision('.') JACK_VERSION="%u.%u.%u" % (JACK_MAJOR_VERSION, JACK_MINOR_VERSION, JACK_MICRO_VERSION) JACKAPI_VERSION="%u.%u.%u" % (JACKAPI_MAJOR_VERSION, JACKAPI_MINOR_VERSION, JACKAPI_MICRO_VERSION) print "JACK %s (%s)" % (JACK_VERSION, JACK_SVNREVISION) platform = ARGUMENTS.get('OS', str(Platform())) build_dir = ARGUMENTS.get('BUILDDIR', '') if build_dir: build_base = build_dir + '/' if not os.path.isdir(build_base): os.makedirs(build_base) print 'Building into: ' + build_base else: build_base='' if not os.path.isdir('cache'): os.makedirs('cache') opts = Options('cache/'+build_base+'options.cache') # # Command-line options section # # If this is just to display a help-text for the variable used via ARGUMENTS, then its wrong... opts.Add( 'BUILDDIR', 'Path to place the built files in', '') opts.AddOptions( PathOption('DESTDIR', 'A prefix where the installed tree will be placed - for package maintainers', '', PathOption.PathAccept), PathOption('PREFIX', 'The prefix where jackdmp will be installed to', '/usr/local', PathOption.PathAccept), PathOption('BINDIR', 'Overwrite the directory where apps are installed to', '$PREFIX/bin', PathOption.PathAccept), PathOption('LIBDIR', 'Overwrite the directory where libs are installed to', '$PREFIX/lib', PathOption.PathAccept), PathOption('INCLUDEDIR', 'Overwrite the directory where headers are installed to', '$PREFIX/include', PathOption.PathAccept), # TODO: The next one is stupid, should be autodetected BoolOption('BUILD_FOR_LINUX', 'Enable/Disable depending on your system', True), BoolOption('ENABLE_ALSA', 'Enable/Disable the ALSA backend', True), BoolOption('ENABLE_FREEBOB', 'Enable/Disable the FreeBoB backend', True), BoolOption('ENABLE_FIREWIRE', 'Enable/Disable the FireWire backend', True), BoolOption('DEBUG', 'Do a debug build', False), BoolOption('BUILD_TESTS', 'Build tests where applicable', True), BoolOption('BUILD_EXAMPLES', 'Build the example clients in their directory', True), BoolOption('INSTALL_EXAMPLES', 'Install the example clients in the BINDIR directory', True), BoolOption('BUILD_DOXYGEN_DOCS', 'Build doxygen documentation', False), BoolOption('ENABLE_DBUS', 'Whether to use D-Bus API', False), ('cc', 'cc', False), ('cxx', 'cxx', False), ('ccflags', 'ccflags', False), ) # # Configuration section # # Load the builders in config buildenv = os.environ if os.environ.has_key('PATH'): buildenv['PATH'] = os.environ['PATH'] else: buildenv['PATH'] = '' if os.environ.has_key('PKG_CONFIG_PATH'): buildenv['PKG_CONFIG_PATH'] = os.environ['PKG_CONFIG_PATH'] else: buildenv['PKG_CONFIG_PATH'] = '' if os.environ.has_key('LD_LIBRARY_PATH'): buildenv['LD_LIBRARY_PATH'] = os.environ['LD_LIBRARY_PATH'] else: buildenv['LD_LIBRARY_PATH'] = '' env = Environment(tools=['default', 'scanreplace', 'pkgconfig', 'doxygen'], toolpath = ['admin'], ENV=buildenv, PLATFORM = platform, options = opts) Help('To build jackdmp you can set different options as listed below. You have to specify them only once, scons will save the latest values you set and re-use then. To really undo your settings and return to the factory defaults, remove the .sconsign.dblite and options.cache files from your BUILDDIR directory.') Help(opts.GenerateHelpText(env)) # update build settings if env['cc']: env['CC'] = env['cc'] if env['cxx']: env['CXX'] = env['cxx'] if env['ccflags']: env.Append(CCFLAGS=env['ccflags']) # Set version env['JACK_MAJOR_VERSION'] = JACK_MAJOR_VERSION env['JACK_MINOR_VERSION'] = JACK_MINOR_VERSION env['JACK_MICRO_VERSION'] = JACK_MICRO_VERSION env['JACK_SVNREVISION'] = JACK_SVNREVISION env['JACK_VERSION'] = JACK_VERSION env['JACKAPI_MAJOR_VERSION'] = JACKAPI_MAJOR_VERSION env['JACKAPI_MINOR_VERSION'] = JACKAPI_MINOR_VERSION env['JACKAPI_MICRO_VERSION'] = JACKAPI_MICRO_VERSION env['JACKAPI_VERSION'] = JACKAPI_VERSION # make sure the necessary dirs exist if not os.path.isdir('cache/' + build_base): os.makedirs('cache/' + build_base) if build_base: env['build_base']='#/'+build_base else: env['build_base']='#/' opts.Save('cache/' + build_base + 'options.cache', env) tests = {} tests.update(env['PKGCONFIG_TESTS']) if not env.GetOption('clean'): conf = Configure(env, custom_tests = tests, conf_dir = 'cache/' + build_base, log_file = 'cache/' + build_base + 'config.log') # Check if the environment can actually compile c-files by checking for a # header shipped with gcc if not conf.CheckHeader( 'stdio.h' ): print 'Error: It seems as if stdio.h is missing. This probably means that your build environment is broken, please make sure you have a working c-compiler and libstdc installed and usable.' Exit(1) # The following checks are for headers, libs and packages we depend on allpresent = 1; if env['BUILD_FOR_LINUX']: allpresent &= conf.CheckForPKGConfig('0.20'); if not allpresent: print "--> At least one of the dependencies is missing. I can't go on without it, please install the needed packages (remember to also install the *-devel packages)" Exit(1) # Optional checks follow: if env['BUILD_FOR_LINUX'] and env['ENABLE_ALSA']: env['ALSA_FLAGS'] = conf.GetPKGFlags('alsa', '1.0.0') if env['ALSA_FLAGS'] == 0: print "--> Disabling 'alsa' backend since no useful ALSA installation found" env['ENABLE_ALSA'] = False if env['BUILD_FOR_LINUX'] and env['ENABLE_FREEBOB']: env['FREEBOB_FLAGS'] = conf.GetPKGFlags('libfreebob', '1.0.0') if env['FREEBOB_FLAGS'] == 0: print "--> Disabling 'freebob' backend since no useful FreeBoB installation found" env['ENABLE_FREEBOB'] = False if env['BUILD_FOR_LINUX'] and env['ENABLE_FIREWIRE']: env['FFADO_FLAGS'] = conf.GetPKGFlags('libffado', '1.999.17') if env['FFADO_FLAGS'] == 0: print "--> Disabling 'firewire' backend since no useful FFADO installation found" env['ENABLE_FIREWIRE'] = False env = conf.Finish() if env['DEBUG']: print '--> Doing a DEBUG build' # TODO: -Werror could be added to, which would force the devs to really remove all the warnings :-) env.AppendUnique(CCFLAGS = ['-DDEBUG', '-Wall', '-g']) env.AppendUnique(LINKFLAGS = ['-g']) else: env.AppendUnique(CCFLAGS = ['-O3','-DNDEBUG']) env.AppendUnique(CCFLAGS = ['-fPIC', '-DSOCKET_RPC_FIFO_SEMA', '-D__SMP__']) env.AppendUnique(CFLAGS = ['-fPIC', '-DUSE_POSIX_SHM']) # used for alsa midi code, probably this define should be removed env.AppendUnique(CFLAGS = ['-DJACKMP']) env.AppendUnique(CPPFLAGS = ['-DJACKMP']) env['PREFIX'] = env.subst(env['PREFIX']) env['BINDIR'] = env.subst(env['BINDIR']) env['LIBDIR'] = env.subst(env['LIBDIR']) env['INCLUDEDIR'] = env.subst(env['INCLUDEDIR']) env['SERVER'] = 'jackd' env['CLIENTLIB'] = 'jack' env['SERVERLIB'] = 'jackserver' env['ADDON_DIR'] = env.subst(env['LIBDIR']) + "/jack" env['INSTALL_ADDON_DIR'] = env['DESTDIR'] + env.subst(env['LIBDIR']) + "/jack" env['INSTALL_PREFIX'] = env['DESTDIR'] + env['PREFIX'] env['INSTALL_BINDIR'] = env['DESTDIR'] + env['BINDIR'] env['INSTALL_LIBDIR'] = env['DESTDIR'] + env['LIBDIR'] env['INSTALL_INCLUDEDIR'] = env['DESTDIR'] + env['INCLUDEDIR'] + '/jack' env.Alias('install', env['INSTALL_LIBDIR']) env.Alias('install', env['INSTALL_INCLUDEDIR']) env.Alias('install', env['INSTALL_BINDIR']) env.Alias('install', env['INSTALL_ADDON_DIR']) env.ScanReplace('jack.pc.in') # jack.pc is always updated in case of config changes # (PREFIX or JACK_VERSION for instance) AlwaysBuild('jack.pc') pkg_config_dir = env['INSTALL_LIBDIR']+"/pkgconfig/" env.Install(pkg_config_dir, 'jack.pc') env.Alias('install', pkg_config_dir) env['BINDIR']=env.subst(env['BINDIR']) # To have the top_srcdir as the doxygen-script is used from auto* env['top_srcdir'] = env.Dir('.').abspath # for config.h.in env['JACK_LOCATION']=env.subst(env['BINDIR']) env.ScanReplace( 'config.h.in' ) # just like jack.pc, config.h is always updated in case of config changes # (PREFIX or JACK_VERSION for instance) AlwaysBuild('config.h') # Ensure we have a path to where the libraries are env.AppendUnique(LIBPATH=['#/common']) # # Build section # if env['BUILD_DOXYGEN_DOCS']: env.Doxygen('doxyfile') subdirs=['common'] if env['PLATFORM'] == 'posix': subdirs.append('linux') if env['ENABLE_DBUS']: subdirs.append('linux/dbus') env.AppendUnique(CCFLAGS = ['-DJACK_DBUS']) # TODO FOR Marc: make macosx/SConscript work right if env['PLATFORM'] == 'macosx': subdirs.append('macosx') # TODO FOR Marc: create/check windows/SConscript #if env['PLATFORM'] == 'windows': # subdirs.append('windows') if env['BUILD_EXAMPLES']: subdirs.append('example-clients') if env['BUILD_TESTS']: subdirs.append('tests') if build_base: env.SConscript(dirs=subdirs, exports='env', build_dir=build_base+subdir) else: env.SConscript(dirs=subdirs, exports='env')