Commit d172d3d4 authored by sletz's avatar sletz
Browse files

Pieter Palmers FFADO driver and scons based build.

git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@1725 0c269be4-1314-0410-8aa9-9f06e86f4224
parent b8a5db6b
......@@ -9,12 +9,17 @@ Thibault LeMeur
Pieter Palmers
Tom Szilagyi
Andrzej Szombierski
Kjetil S.Matheussen
Kjetil S.Matheussen
Pieter Palmers
---------------------------
Jackdmp changes log
---------------------------
2007-12-06 Stephane Letz <letz@grame.fr>
* Pieter Palmers FFADO driver and scons based build.
2007-12-05 Stephane Letz <letz@grame.fr>
* Correct sample_rate management in JackCoreAudioDriver::Open. Better handling in sample_rate change listener.
......
#
# Copyright (C) 2007 Arnold Krille
# Copyright (C) 2007 Pieter Palmers
#
# 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
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" )
# make this into a command line option and/or a detected value
build_for_linux = True
#
# 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(
# BoolOption( "DEBUG", """\
#Toggle debug-build. DEBUG means \"-g -Wall\" and more, otherwise we will use
# \"-O2\" to optimise.""", True ),
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 ),
PathOption( "SHAREDIR", "Overwrite the directory where misc shared files are installed to.", "$PREFIX/share/libffado", PathOption.PathAccept ),
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.""", True ),
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.""", True ),
)
## Load the builders in config
buildenv={}
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, options=opts )
Help( """
For building jackdmp you can set different options as listed below. You have to
specify them only once, scons will save the last value you used and re-use
that.
To really undo your settings and return to the factory defaults, remove the
"cache"-folder and the file ".sconsign.dblite" from this directory.
For example with: "rm -Rf .sconsign.dblite cache"
""" )
Help( opts.GenerateHelpText( env ) )
# make sure the necessary dirs exist
if not os.path.isdir( "cache/" + build_base ):
os.makedirs( "cache/" + build_base )
if not os.path.isdir( 'cache/objects' ):
os.makedirs( 'cache/objects' )
if build_base:
env['build_base']="#/"+build_base
else:
env['build_base']="#/"
CacheDir( 'cache/objects' )
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 "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 and libs and packages we need.
#
allpresent = 1;
if build_for_linux:
allpresent &= conf.CheckForPKGConfig();
# example on how to check for additional libs
# pkgs = {
# 'alsa' : '1.0.0',
# }
# for pkg in pkgs:
# name2 = pkg.replace("+","").replace(".","").replace("-","").upper()
# env['%s_FLAGS' % name2] = conf.GetPKGFlags( pkg, pkgs[pkg] )
# if env['%s_FLAGS'%name2] == 0:
# allpresent &= 0
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 )
# jack doesn't have to be present, but it would be nice to know if it is
env['JACK_FLAGS'] = conf.GetPKGFlags( 'jack', '0.100.0' )
if env['JACK_FLAGS']:
env['JACK_PREFIX'] = conf.GetPKGPrefix( 'jack' )
env['JACK_EXEC_PREFIX'] = conf.GetPKGExecPrefix( 'jack' )
env['JACK_LIBDIR'] = conf.GetPKGLibdir( 'jack' )
env['JACK_INCLUDEDIR'] = conf.GetPKGIncludedir( 'jack' )
#
# Optional checks follow:
#
if 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 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 build_for_linux and env['ENABLE_FIREWIRE']:
env['FFADO_FLAGS'] = conf.GetPKGFlags( 'libffado', '1.999.7' )
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"
# -Werror could be added to, which would force the devs to really remove all the warnings :-)
env.AppendUnique( CCFLAGS=["-DDEBUG","-Wall","-g"] )
env.AppendUnique( CFLAGS=["-DDEBUG","-Wall","-g"] )
else:
env.AppendUnique( CCFLAGS=["-O2","-DNDEBUG"] )
env.AppendUnique( CFLAGS=["-O2","-DNDEBUG"] )
env.AppendUnique( CCFLAGS=["-fPIC", "-DSOCKET_RPC_FIFO_SEMA", "-D__SMP__"] )
env.AppendUnique( CFLAGS=["-fPIC", "-DUSE_POSIX_SHM"] )
#
# XXX: Maybe we can even drop these lower-case variables and only use the uppercase ones?
#
env['prefix'] = Template( os.path.join( env['PREFIX'] ) ).safe_substitute( env )
env['bindir'] = Template( os.path.join( env['BINDIR'] ) ).safe_substitute( env )
env['libdir'] = Template( os.path.join( env['LIBDIR'] ) ).safe_substitute( env )
env['includedir'] = Template( os.path.join( env['INCLUDEDIR'] ) ).safe_substitute( env )
env['sharedir'] = Template( os.path.join( env['SHAREDIR'] ) ).safe_substitute( env )
env.Alias( "install", env['libdir'] )
env.Alias( "install", env['includedir'] )
env.Alias( "install", env['sharedir'] )
env.Alias( "install", env['bindir'] )
# for config.h.in
env['ADDON_DIR']='%s' % env['prefix']
env['LIB_DIR']='lib'
env['JACK_LOCATION']='%s' % env['bindir']
#
# To have the top_srcdir as the doxygen-script is used from auto*
#
env['top_srcdir'] = env.Dir( "." ).abspath
#subprojects = env.Split('common common/jack tests example-clients linux/alsa linux/freebob linux/firewire')
#for subproject in subprojects:
#env.AppendUnique( CCFLAGS=["-I%s" % subproject] )
#env.AppendUnique( CFLAGS=["-I%s" % subproject] )
env.ScanReplace( "config.h.in" )
# ensure that the config.h is always updated, since it
# sometimes fails to pick up the changes
# note: this still doesn't seem to cause dependent files to be rebuilt.
NoCache("config.h")
AlwaysBuild("config.h")
#
# Start building
#
if env['BUILD_DOXYGEN_DOCS']:
env.Doxygen("doxyfile")
subdirs=['common']
if build_for_linux:
subdirs.append('linux')
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" )
#
# Copyright (C) 2007 Arnold Krille
# Copyright (C) 2007 Pieter Palmers
#
# 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
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" )
# make this into a command line option and/or a detected value
build_for_linux = True
#
# 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(
# BoolOption( "DEBUG", """\
#Toggle debug-build. DEBUG means \"-g -Wall\" and more, otherwise we will use
# \"-O2\" to optimise.""", True ),
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 ),
PathOption( "SHAREDIR", "Overwrite the directory where misc shared files are installed to.", "$PREFIX/share/libffado", PathOption.PathAccept ),
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.""", True ),
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.""", True ),
)
## Load the builders in config
buildenv={}
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, options=opts )
Help( """
For building jackdmp you can set different options as listed below. You have to
specify them only once, scons will save the last value you used and re-use
that.
To really undo your settings and return to the factory defaults, remove the
"cache"-folder and the file ".sconsign.dblite" from this directory.
For example with: "rm -Rf .sconsign.dblite cache"
""" )
Help( opts.GenerateHelpText( env ) )
# make sure the necessary dirs exist
if not os.path.isdir( "cache/" + build_base ):
os.makedirs( "cache/" + build_base )
if not os.path.isdir( 'cache/objects' ):
os.makedirs( 'cache/objects' )
if build_base:
env['build_base']="#/"+build_base
else:
env['build_base']="#/"
CacheDir( 'cache/objects' )
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 "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 and libs and packages we need.
#
allpresent = 1;
if build_for_linux:
allpresent &= conf.CheckForPKGConfig();
# example on how to check for additional libs
# pkgs = {
# 'alsa' : '1.0.0',
# }
# for pkg in pkgs:
# name2 = pkg.replace("+","").replace(".","").replace("-","").upper()
# env['%s_FLAGS' % name2] = conf.GetPKGFlags( pkg, pkgs[pkg] )
# if env['%s_FLAGS'%name2] == 0:
# allpresent &= 0
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 )
# jack doesn't have to be present, but it would be nice to know if it is
env['JACK_FLAGS'] = conf.GetPKGFlags( 'jack', '0.100.0' )
if env['JACK_FLAGS']:
env['JACK_PREFIX'] = conf.GetPKGPrefix( 'jack' )
env['JACK_EXEC_PREFIX'] = conf.GetPKGExecPrefix( 'jack' )
env['JACK_LIBDIR'] = conf.GetPKGLibdir( 'jack' )
env['JACK_INCLUDEDIR'] = conf.GetPKGIncludedir( 'jack' )
#
# Optional checks follow:
#
if 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 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 build_for_linux and env['ENABLE_FIREWIRE']:
env['FFADO_FLAGS'] = conf.GetPKGFlags( 'libffado', '1.999.7' )
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"
# -Werror could be added to, which would force the devs to really remove all the warnings :-)
env.AppendUnique( CCFLAGS=["-DDEBUG","-Wall","-g"] )
env.AppendUnique( CFLAGS=["-DDEBUG","-Wall","-g"] )
else:
env.AppendUnique( CCFLAGS=["-O2","-DNDEBUG"] )
env.AppendUnique( CFLAGS=["-O2","-DNDEBUG"] )
env.AppendUnique( CCFLAGS=["-fPIC", "-DSOCKET_RPC_FIFO_SEMA", "-D__SMP__"] )
env.AppendUnique( CFLAGS=["-fPIC", "-DUSE_POSIX_SHM"] )
#
# XXX: Maybe we can even drop these lower-case variables and only use the uppercase ones?
#
env['prefix'] = Template( os.path.join( env['PREFIX'] ) ).safe_substitute( env )
env['bindir'] = Template( os.path.join( env['BINDIR'] ) ).safe_substitute( env )
env['libdir'] = Template( os.path.join( env['LIBDIR'] ) ).safe_substitute( env )
env['includedir'] = Template( os.path.join( env['INCLUDEDIR'] ) ).safe_substitute( env )
env['sharedir'] = Template( os.path.join( env['SHAREDIR'] ) ).safe_substitute( env )
env.Alias( "install", env['libdir'] )
env.Alias( "install", env['includedir'] )
env.Alias( "install", env['sharedir'] )
env.Alias( "install", env['bindir'] )
# for config.h.in
env['ADDON_DIR']='%s' % env['prefix']
env['LIB_DIR']='lib'
env['JACK_LOCATION']='%s' % env['bindir']
#
# To have the top_srcdir as the doxygen-script is used from auto*
#
env['top_srcdir'] = env.Dir( "." ).abspath
#subprojects = env.Split('common common/jack tests example-clients linux/alsa linux/freebob linux/firewire')
#for subproject in subprojects:
#env.AppendUnique( CCFLAGS=["-I%s" % subproject] )
#env.AppendUnique( CFLAGS=["-I%s" % subproject] )
env.ScanReplace( "config.h.in" )
# ensure that the config.h is always updated, since it
# sometimes fails to pick up the changes
# note: this still doesn't seem to cause dependent files to be rebuilt.
NoCache("config.h")
AlwaysBuild("config.h")
#
# Start building
#
if env['BUILD_DOXYGEN_DOCS']:
env.Doxygen("doxyfile")
subdirs=['common']
if build_for_linux:
subdirs.append('linux')
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" )
# -*- python -*-
import os
import sys
import re
import shutil
import glob
import errno
import time
import platform
import string
import commands
platform = ARGUMENTS.get('OS', Platform())
env = Environment(PLATFORM = platform,
CPPPATH = ['macosx', 'common'])
Export('env')
print platform
env.SConscript(['common/SConscript'])
\ No newline at end of file
#!/usr/bin/python
#
# Copyright (C) 2007 Arnold Krille
#
# 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/>.
#
#
# Astxx, the Asterisk C++ API and Utility Library.
# Copyright (C) 2005, 2006 Matthew A. Nicholson
# Copyright (C) 2006 Tim Blechmann
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License version 2.1 as published by the Free Software Foundation.
#
# This library 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
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
import os
import os.path
import glob
from fnmatch import fnmatch
def DoxyfileParse(file_contents):
"""
Parse a Doxygen source file and return a dictionary of all the values.
Values will be strings and lists of strings.
"""
data = {}
import shlex
lex = shlex.shlex(instream = file_contents, posix = True)
lex.wordchars += "*+./-:"
lex.whitespace = lex.whitespace.replace("\n", "")
lex.escape = ""
lineno = lex.lineno
token = lex.get_token()
key = token # the first token should be a key
last_token = ""
key_token = False
next_key = False
new_data = True
def append_data(data, key, new_data, token):
if new_data or len(data[key]) == 0:
data[key].append(token)
else:
data[key][-1] += token
while token:
if token in ['\n']:
if last_token not in ['\\']:
key_token = True
elif token in ['\\']:
pass
elif key_token: