|
- #
- # 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 <http://www.gnu.org/licenses/>.
- #
-
- import os
- from string import Template
-
- JACK_MAJOR_VERSION=2
- JACK_MINOR_VERSION=0
- JACK_MICRO_VERSION=0
-
- JACK_VERSION="%u.%u.%u" % (JACK_MAJOR_VERSION, JACK_MINOR_VERSION, JACK_MICRO_VERSION)
-
- 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('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('FULL_MIMIC', 'Mimic jack-1.0 installation layout as much as possible', 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))
-
- # 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_VERSION'] = JACK_VERSION
-
- # Set the lib names
- env['CLIENTLIB'] = 'jackmp'
- env['SERVERLIB'] = 'jackservermp'
- env['WRAPPERLIB'] = 'jackwrapper'
-
- # 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)
-
- # If jack has the same PREFIX as the one we plan to use, exit with an error message
- env['JACK_FLAGS'] = conf.GetPKGFlags('jack', '0.90')
- if env['JACK_FLAGS']:
- print "--> Found an existing JACK installation, let's be careful not to erase it"
- if conf.GetPKGPrefix( 'jack' ) == env['PREFIX']:
- print '--> JACK is installed in the same directory as our current PREFIX. Either remove JACK or change your installation PREFIX.'
- 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.14')
- 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'])
- 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.Alias('install', env['LIBDIR'])
- env.Alias('install', env['INCLUDEDIR'])
- env.Alias('install', env['BINDIR'])
-
- if env['FULL_MIMIC']:
- env['SERVER'] = 'jackd'
- env['CLIENTLIB'] = 'jack'
- env['SERVERLIB'] = 'jackserver'
- env['WRAPPERLIB'] = 'jackwrapper'
- env['ADDON_DIR'] = env.subst(env['LIBDIR']) + "/jack"
- else:
- env['SERVER'] = 'jackdmp'
- env['CLIENTLIB'] = 'jackmp'
- env['SERVERLIB'] = 'jackservermp'
- env['WRAPPERLIB'] = 'jackwrapper'
- env['ADDON_DIR'] = env.subst(env['LIBDIR']) + "/jackmp"
-
- 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.ScanReplace('jack.pc.in')
- AlwaysBuild('jack.pc')
- pkg_config_dir = env['PREFIX']+"/lib/pkgconfig/"
- env.Install(pkg_config_dir, 'jack.pc')
- env.Alias('install', pkg_config_dir)
-
- # for config.h.in
- # TODO: Is that necessary ?
- env['LIB_DIR']='lib'
- env['JACK_LOCATION']=env.subst(env['BINDIR'])
-
- # To have the top_srcdir as the doxygen-script is used from auto*
- # TODO: Understand the previous comment
- env['top_srcdir'] = env.Dir('.').abspath
-
- env.ScanReplace( 'config.h.in' )
- # TODO: find out what's that about. Is it useful ?
- 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']
-
- # TODO: Really handle each platform automatically
- if env['PLATFORM'] == 'posix':
- subdirs.append('linux')
-
- # TODO FOR SLETZ: test macosx/SConscript
- if env['PLATFORM'] == 'macosx':
- subdirs.append('macosx')
-
- # TODO FOR SLETZ & 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')
|