git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@1725 0c269be4-1314-0410-8aa9-9f06e86f4224tags/0.69
@@ -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. | |||
@@ -0,0 +1,528 @@ | |||
# | |||
# 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']) | |||
@@ -0,0 +1,456 @@ | |||
#!/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: | |||
key = token | |||
key_token = False | |||
else: | |||
if token == "+=": | |||
if not data.has_key(key): | |||
data[key] = list() | |||
elif token == "=": | |||
data[key] = list() | |||
else: | |||
append_data( data, key, new_data, token ) | |||
new_data = True | |||
last_token = token | |||
token = lex.get_token() | |||
if last_token == '\\' and token != '\n': | |||
new_data = False | |||
append_data( data, key, new_data, '\\' ) | |||
# compress lists of len 1 into single strings | |||
for (k, v) in data.items(): | |||
if len(v) == 0: | |||
data.pop(k) | |||
# items in the following list will be kept as lists and not converted to strings | |||
if k in ["INPUT", "FILE_PATTERNS", "EXCLUDE_PATTERNS"]: | |||
continue | |||
if len(v) == 1: | |||
data[k] = v[0] | |||
return data | |||
def DoxySourceScan(node, env, path): | |||
""" | |||
Doxygen Doxyfile source scanner. This should scan the Doxygen file and add | |||
any files used to generate docs to the list of source files. | |||
""" | |||
default_file_patterns = [ | |||
'*.c', '*.cc', '*.cxx', '*.cpp', '*.c++', '*.java', '*.ii', '*.ixx', | |||
'*.ipp', '*.i++', '*.inl', '*.h', '*.hh ', '*.hxx', '*.hpp', '*.h++', | |||
'*.idl', '*.odl', '*.cs', '*.php', '*.php3', '*.inc', '*.m', '*.mm', | |||
'*.py', | |||
] | |||
default_exclude_patterns = [ | |||
'*~', | |||
] | |||
sources = [] | |||
data = DoxyfileParse(node.get_contents()) | |||
if data.get("RECURSIVE", "NO") == "YES": | |||
recursive = True | |||
else: | |||
recursive = False | |||
file_patterns = data.get("FILE_PATTERNS", default_file_patterns) | |||
exclude_patterns = data.get("EXCLUDE_PATTERNS", default_exclude_patterns) | |||
for node in data.get("INPUT", []): | |||
if os.path.isfile(node): | |||
sources.append(node) | |||
elif os.path.isdir(node): | |||
if recursive: | |||
for root, dirs, files in os.walk(node): | |||
for f in files: | |||
filename = os.path.join(root, f) | |||
pattern_check = reduce(lambda x, y: x or bool(fnmatch(filename, y)), file_patterns, False) | |||
exclude_check = reduce(lambda x, y: x and fnmatch(filename, y), exclude_patterns, True) | |||
if pattern_check and not exclude_check: | |||
sources.append(filename) | |||
else: | |||
for pattern in file_patterns: | |||
sources.extend(glob.glob("/".join([node, pattern]))) | |||
sources = map( lambda path: env.File(path), sources ) | |||
return sources | |||
def DoxySourceScanCheck(node, env): | |||
"""Check if we should scan this file""" | |||
return os.path.isfile(node.path) | |||
def DoxyEmitter(source, target, env): | |||
"""Doxygen Doxyfile emitter""" | |||
# possible output formats and their default values and output locations | |||
output_formats = { | |||
"HTML": ("YES", "html"), | |||
"LATEX": ("YES", "latex"), | |||
"RTF": ("NO", "rtf"), | |||
"MAN": ("YES", "man"), | |||
"XML": ("NO", "xml"), | |||
} | |||
data = DoxyfileParse(source[0].get_contents()) | |||
targets = [] | |||
out_dir = data.get("OUTPUT_DIRECTORY", ".") | |||
# add our output locations | |||
for (k, v) in output_formats.items(): | |||
if data.get("GENERATE_" + k, v[0]) == "YES": | |||
targets.append(env.Dir( os.path.join(out_dir, data.get(k + "_OUTPUT", v[1]))) ) | |||
# don't clobber targets | |||
for node in targets: | |||
env.Precious(node) | |||
# set up cleaning stuff | |||
for node in targets: | |||
env.Clean(node, node) | |||
return (targets, source) | |||
def generate(env): | |||
""" | |||
Add builders and construction variables for the | |||
Doxygen tool. This is currently for Doxygen 1.4.6. | |||
""" | |||
doxyfile_scanner = env.Scanner( | |||
DoxySourceScan, | |||
"DoxySourceScan", | |||
scan_check = DoxySourceScanCheck, | |||
) | |||
import SCons.Builder | |||
doxyfile_builder = SCons.Builder.Builder( | |||
action = "cd ${SOURCE.dir} && ${DOXYGEN} ${SOURCE.file}", | |||
emitter = DoxyEmitter, | |||
target_factory = env.fs.Entry, | |||
single_source = True, | |||
source_scanner = doxyfile_scanner, | |||
) | |||
env.Append(BUILDERS = { | |||
'Doxygen': doxyfile_builder, | |||
}) | |||
env.AppendUnique( | |||
DOXYGEN = 'doxygen', | |||
) | |||
def exists(env): | |||
""" | |||
Make sure doxygen exists. | |||
""" | |||
return env.Detect("doxygen") | |||
#!/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: | |||
key = token | |||
key_token = False | |||
else: | |||
if token == "+=": | |||
if not data.has_key(key): | |||
data[key] = list() | |||
elif token == "=": | |||
data[key] = list() | |||
else: | |||
append_data( data, key, new_data, token ) | |||
new_data = True | |||
last_token = token | |||
token = lex.get_token() | |||
if last_token == '\\' and token != '\n': | |||
new_data = False | |||
append_data( data, key, new_data, '\\' ) | |||
# compress lists of len 1 into single strings | |||
for (k, v) in data.items(): | |||
if len(v) == 0: | |||
data.pop(k) | |||
# items in the following list will be kept as lists and not converted to strings | |||
if k in ["INPUT", "FILE_PATTERNS", "EXCLUDE_PATTERNS"]: | |||
continue | |||
if len(v) == 1: | |||
data[k] = v[0] | |||
return data | |||
def DoxySourceScan(node, env, path): | |||
""" | |||
Doxygen Doxyfile source scanner. This should scan the Doxygen file and add | |||
any files used to generate docs to the list of source files. | |||
""" | |||
default_file_patterns = [ | |||
'*.c', '*.cc', '*.cxx', '*.cpp', '*.c++', '*.java', '*.ii', '*.ixx', | |||
'*.ipp', '*.i++', '*.inl', '*.h', '*.hh ', '*.hxx', '*.hpp', '*.h++', | |||
'*.idl', '*.odl', '*.cs', '*.php', '*.php3', '*.inc', '*.m', '*.mm', | |||
'*.py', | |||
] | |||
default_exclude_patterns = [ | |||
'*~', | |||
] | |||
sources = [] | |||
data = DoxyfileParse(node.get_contents()) | |||
if data.get("RECURSIVE", "NO") == "YES": | |||
recursive = True | |||
else: | |||
recursive = False | |||
file_patterns = data.get("FILE_PATTERNS", default_file_patterns) | |||
exclude_patterns = data.get("EXCLUDE_PATTERNS", default_exclude_patterns) | |||
for node in data.get("INPUT", []): | |||
if os.path.isfile(node): | |||
sources.append(node) | |||
elif os.path.isdir(node): | |||
if recursive: | |||
for root, dirs, files in os.walk(node): | |||
for f in files: | |||
filename = os.path.join(root, f) | |||
pattern_check = reduce(lambda x, y: x or bool(fnmatch(filename, y)), file_patterns, False) | |||
exclude_check = reduce(lambda x, y: x and fnmatch(filename, y), exclude_patterns, True) | |||
if pattern_check and not exclude_check: | |||
sources.append(filename) | |||
else: | |||
for pattern in file_patterns: | |||
sources.extend(glob.glob("/".join([node, pattern]))) | |||
sources = map( lambda path: env.File(path), sources ) | |||
return sources | |||
def DoxySourceScanCheck(node, env): | |||
"""Check if we should scan this file""" | |||
return os.path.isfile(node.path) | |||
def DoxyEmitter(source, target, env): | |||
"""Doxygen Doxyfile emitter""" | |||
# possible output formats and their default values and output locations | |||
output_formats = { | |||
"HTML": ("YES", "html"), | |||
"LATEX": ("YES", "latex"), | |||
"RTF": ("NO", "rtf"), | |||
"MAN": ("YES", "man"), | |||
"XML": ("NO", "xml"), | |||
} | |||
data = DoxyfileParse(source[0].get_contents()) | |||
targets = [] | |||
out_dir = data.get("OUTPUT_DIRECTORY", ".") | |||
# add our output locations | |||
for (k, v) in output_formats.items(): | |||
if data.get("GENERATE_" + k, v[0]) == "YES": | |||
targets.append(env.Dir( os.path.join(out_dir, data.get(k + "_OUTPUT", v[1]))) ) | |||
# don't clobber targets | |||
for node in targets: | |||
env.Precious(node) | |||
# set up cleaning stuff | |||
for node in targets: | |||
env.Clean(node, node) | |||
return (targets, source) | |||
def generate(env): | |||
""" | |||
Add builders and construction variables for the | |||
Doxygen tool. This is currently for Doxygen 1.4.6. | |||
""" | |||
doxyfile_scanner = env.Scanner( | |||
DoxySourceScan, | |||
"DoxySourceScan", | |||
scan_check = DoxySourceScanCheck, | |||
) | |||
import SCons.Builder | |||
doxyfile_builder = SCons.Builder.Builder( | |||
action = "cd ${SOURCE.dir} && ${DOXYGEN} ${SOURCE.file}", | |||
emitter = DoxyEmitter, | |||
target_factory = env.fs.Entry, | |||
single_source = True, | |||
source_scanner = doxyfile_scanner, | |||
) | |||
env.Append(BUILDERS = { | |||
'Doxygen': doxyfile_builder, | |||
}) | |||
env.AppendUnique( | |||
DOXYGEN = 'doxygen', | |||
) | |||
def exists(env): | |||
""" | |||
Make sure doxygen exists. | |||
""" | |||
return env.Detect("doxygen") |
@@ -0,0 +1,274 @@ | |||
#!/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/>. | |||
# | |||
# | |||
# Taken from http://www.scons.org/wiki/UsingPkgConfig | |||
# and heavily modified | |||
# | |||
# | |||
# Checks for pkg-config | |||
# | |||
def CheckForPKGConfig( context, version='0.0.0' ): | |||
context.Message( "Checking for pkg-config (at least version %s)... " % version ) | |||
ret = context.TryAction( "pkg-config --atleast-pkgconfig-version=%s" %version )[0] | |||
context.Result( ret ) | |||
return ret | |||
# | |||
# Checks for the given package with an optional version-requirement | |||
# | |||
# The flags (which can be imported into the environment by env.MergeFlags(...) | |||
# are exported as env['NAME_FLAGS'] where name is built by removing all +,-,. | |||
# and upper-casing. | |||
# | |||
def CheckForPKG( context, name, version="" ): | |||
name2 = name.replace("+","").replace(".","").replace("-","") | |||
if version == "": | |||
context.Message( "Checking for %s... \t" % name ) | |||
ret = context.TryAction( "pkg-config --exists '%s'" % name )[0] | |||
else: | |||
context.Message( "Checking for %s (%s or higher)... \t" % (name,version) ) | |||
ret = context.TryAction( "pkg-config --atleast-version=%s '%s'" % (version,name) )[0] | |||
if ret: | |||
context.env['%s_FLAGS' % name2.upper()] = context.env.ParseFlags("!pkg-config --cflags --libs %s" % name) | |||
context.Result( ret ) | |||
return ret | |||
# | |||
# Checks for the existance of the package and returns the packages flags. | |||
# | |||
# This should allow caching of the flags so that pkg-config is called only once. | |||
# | |||
def GetPKGFlags( context, name, version="" ): | |||
import os | |||
if version == "": | |||
context.Message( "Checking for %s... \t" % name ) | |||
ret = context.TryAction( "pkg-config --exists '%s'" % name )[0] | |||
else: | |||
context.Message( "Checking for %s (%s or higher)... \t" % (name,version) ) | |||
ret = context.TryAction( "pkg-config --atleast-version=%s '%s'" % (version,name) )[0] | |||
if not ret: | |||
context.Result( ret ) | |||
return ret | |||
out = os.popen2( "pkg-config --cflags --libs %s" % name )[1] | |||
ret = out.read() | |||
context.Result( True ) | |||
return ret | |||
def GetPKGPrefix( context, name ): | |||
import os | |||
out = os.popen2( "pkg-config --variable=prefix %s" % name )[1] | |||
ret = out.read() | |||
ret = ret.replace ( "\n", "" ) | |||
context.Message( " getting prefix... \t" ) | |||
context.Result( True ) | |||
return ret | |||
def GetPKGExecPrefix( context, name ): | |||
import os | |||
out = os.popen2( "pkg-config --variable=exec_prefix %s" % name )[1] | |||
ret = out.read() | |||
ret = ret.replace ( "\n", "" ) | |||
context.Message( " getting exec prefix... \t" ) | |||
context.Result( True ) | |||
return ret | |||
def GetPKGIncludedir( context, name ): | |||
import os | |||
out = os.popen2( "pkg-config --variable=includedir %s" % name )[1] | |||
ret = out.read() | |||
ret = ret.replace ( "\n", "" ) | |||
context.Message( " getting include dir... \t" ) | |||
context.Result( True ) | |||
return ret | |||
def GetPKGLibdir( context, name ): | |||
import os | |||
out = os.popen2( "pkg-config --variable=libdir %s" % name )[1] | |||
ret = out.read() | |||
ret = ret.replace ( "\n", "" ) | |||
context.Message( " getting lib dir... \t" ) | |||
context.Result( True ) | |||
return ret | |||
def generate( env, **kw ): | |||
env['PKGCONFIG_TESTS' ] = { | |||
'CheckForPKGConfig' : CheckForPKGConfig, | |||
'CheckForPKG' : CheckForPKG, | |||
'GetPKGFlags' : GetPKGFlags, | |||
'GetPKGPrefix' : GetPKGPrefix, | |||
'GetPKGExecPrefix' : GetPKGExecPrefix, | |||
'GetPKGIncludedir' : GetPKGIncludedir, | |||
'GetPKGLibdir' : GetPKGLibdir, | |||
} | |||
def exists( env ): | |||
return 1 | |||
#!/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/>. | |||
# | |||
# | |||
# Taken from http://www.scons.org/wiki/UsingPkgConfig | |||
# and heavily modified | |||
# | |||
# | |||
# Checks for pkg-config | |||
# | |||
def CheckForPKGConfig( context, version='0.0.0' ): | |||
context.Message( "Checking for pkg-config (at least version %s)... " % version ) | |||
ret = context.TryAction( "pkg-config --atleast-pkgconfig-version=%s" %version )[0] | |||
context.Result( ret ) | |||
return ret | |||
# | |||
# Checks for the given package with an optional version-requirement | |||
# | |||
# The flags (which can be imported into the environment by env.MergeFlags(...) | |||
# are exported as env['NAME_FLAGS'] where name is built by removing all +,-,. | |||
# and upper-casing. | |||
# | |||
def CheckForPKG( context, name, version="" ): | |||
name2 = name.replace("+","").replace(".","").replace("-","") | |||
if version == "": | |||
context.Message( "Checking for %s... \t" % name ) | |||
ret = context.TryAction( "pkg-config --exists '%s'" % name )[0] | |||
else: | |||
context.Message( "Checking for %s (%s or higher)... \t" % (name,version) ) | |||
ret = context.TryAction( "pkg-config --atleast-version=%s '%s'" % (version,name) )[0] | |||
if ret: | |||
context.env['%s_FLAGS' % name2.upper()] = context.env.ParseFlags("!pkg-config --cflags --libs %s" % name) | |||
context.Result( ret ) | |||
return ret | |||
# | |||
# Checks for the existance of the package and returns the packages flags. | |||
# | |||
# This should allow caching of the flags so that pkg-config is called only once. | |||
# | |||
def GetPKGFlags( context, name, version="" ): | |||
import os | |||
if version == "": | |||
context.Message( "Checking for %s... \t" % name ) | |||
ret = context.TryAction( "pkg-config --exists '%s'" % name )[0] | |||
else: | |||
context.Message( "Checking for %s (%s or higher)... \t" % (name,version) ) | |||
ret = context.TryAction( "pkg-config --atleast-version=%s '%s'" % (version,name) )[0] | |||
if not ret: | |||
context.Result( ret ) | |||
return ret | |||
out = os.popen2( "pkg-config --cflags --libs %s" % name )[1] | |||
ret = out.read() | |||
context.Result( True ) | |||
return ret | |||
def GetPKGPrefix( context, name ): | |||
import os | |||
out = os.popen2( "pkg-config --variable=prefix %s" % name )[1] | |||
ret = out.read() | |||
ret = ret.replace ( "\n", "" ) | |||
context.Message( " getting prefix... \t" ) | |||
context.Result( True ) | |||
return ret | |||
def GetPKGExecPrefix( context, name ): | |||
import os | |||
out = os.popen2( "pkg-config --variable=exec_prefix %s" % name )[1] | |||
ret = out.read() | |||
ret = ret.replace ( "\n", "" ) | |||
context.Message( " getting exec prefix... \t" ) | |||
context.Result( True ) | |||
return ret | |||
def GetPKGIncludedir( context, name ): | |||
import os | |||
out = os.popen2( "pkg-config --variable=includedir %s" % name )[1] | |||
ret = out.read() | |||
ret = ret.replace ( "\n", "" ) | |||
context.Message( " getting include dir... \t" ) | |||
context.Result( True ) | |||
return ret | |||
def GetPKGLibdir( context, name ): | |||
import os | |||
out = os.popen2( "pkg-config --variable=libdir %s" % name )[1] | |||
ret = out.read() | |||
ret = ret.replace ( "\n", "" ) | |||
context.Message( " getting lib dir... \t" ) | |||
context.Result( True ) | |||
return ret | |||
def generate( env, **kw ): | |||
env['PKGCONFIG_TESTS' ] = { | |||
'CheckForPKGConfig' : CheckForPKGConfig, | |||
'CheckForPKG' : CheckForPKG, | |||
'GetPKGFlags' : GetPKGFlags, | |||
'GetPKGPrefix' : GetPKGPrefix, | |||
'GetPKGExecPrefix' : GetPKGExecPrefix, | |||
'GetPKGIncludedir' : GetPKGIncludedir, | |||
'GetPKGLibdir' : GetPKGLibdir, | |||
} | |||
def exists( env ): | |||
return 1 | |||
@@ -0,0 +1,80 @@ | |||
#!/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/>. | |||
# | |||
# | |||
# Taken from http://www.scons.org/wiki/ReplacementBuilder | |||
# | |||
from string import Template | |||
def replace_action(target, source, env): | |||
open( str(target[0]), 'w' ).write( Template( open( str(source[0]), 'r' ).read() ).safe_substitute( env ) ) | |||
return 0 | |||
def replace_string(target, source, env): | |||
return "building '%s' from '%s'" % ( str(target[0]), str(source[0]) ) | |||
def generate(env, **kw): | |||
action = env.Action( replace_action, replace_string ) | |||
env['BUILDERS']['ScanReplace'] = env.Builder( action=action, src_suffix='.in', single_source=True ) | |||
def exists(env): | |||
return 1 | |||
#!/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/>. | |||
# | |||
# | |||
# Taken from http://www.scons.org/wiki/ReplacementBuilder | |||
# | |||
from string import Template | |||
def replace_action(target, source, env): | |||
open( str(target[0]), 'w' ).write( Template( open( str(source[0]), 'r' ).read() ).safe_substitute( env ) ) | |||
return 0 | |||
def replace_string(target, source, env): | |||
return "building '%s' from '%s'" % ( str(target[0]), str(source[0]) ) | |||
def generate(env, **kw): | |||
action = env.Action( replace_action, replace_string ) | |||
env['BUILDERS']['ScanReplace'] = env.Builder( action=action, src_suffix='.in', single_source=True ) | |||
def exists(env): | |||
return 1 | |||
@@ -22,6 +22,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||
#pragma warning (disable : 4786) | |||
#endif | |||
#include "config.h" | |||
#include "JackDriverLoader.h" | |||
#include "JackError.h" | |||
#include <getopt.h> | |||
@@ -42,14 +42,14 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||
#ifdef WIN32 | |||
#include "JackWinProcessSync.h" | |||
#include "JackWinNamedPipeClientChannel.h" | |||
#include "JackWinEvent.h" | |||
#include "JackWinEvent.h" | |||
#include "JackWinSemaphore.h" | |||
#include "JackWinThread.h" | |||
#endif | |||
// LINUX | |||
#ifdef __linux__ | |||
#include "JackAlsaDriver.h" | |||
#include "linux/alsa/JackAlsaDriver.h" | |||
#include "JackProcessSync.h" | |||
#include "JackSocketServerNotifyChannel.h" | |||
#include "JackSocketNotifyChannel.h" | |||
@@ -50,14 +50,14 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||
#include "JackWinNamedPipeNotifyChannel.h" | |||
#include "JackWinNamedPipeServerChannel.h" | |||
#include "JackWinNamedPipeClientChannel.h" | |||
#include "JackWinEvent.h" | |||
#include "JackWinEvent.h" | |||
#include "JackWinSemaphore.h" | |||
#include "JackWinThread.h" | |||
#endif | |||
// LINUX | |||
#ifdef __linux__ | |||
#include "JackAlsaDriver.h" | |||
#include "linux/alsa/JackAlsaDriver.h" | |||
#include "JackProcessSync.h" | |||
#include "JackSocketServerNotifyChannel.h" | |||
#include "JackSocketNotifyChannel.h" | |||
@@ -18,6 +18,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||
*/ | |||
#include "config.h" | |||
#include "JackChannel.h" | |||
#include "JackLibGlobals.h" | |||
#include "JackServerLaunch.h" | |||
@@ -1,11 +1,11 @@ | |||
# Type "make" or "make all" to compile ALSA driver, and "make freebob" to compile FREEBOB driver. | |||
# Choose the installation location | |||
prefix := /usr/local | |||
prefix := /usr | |||
prefix := ${DESTDIR}${prefix} | |||
libdir := lib | |||
subprojects := ../common ../common/jack ../tests ../example-clients alsa freebob | |||
subprojects := ../common ../common/jack ../tests ../example-clients alsa freebob firewire | |||
sources := $(wildcard *.cpp) $(wildcard */*.cpp) $(wildcard ../common/*.cpp) $(wildcard ../tests/*.cpp) | |||
@@ -21,6 +21,8 @@ TARGET_LINUX_ALSA := jack_alsa.so | |||
TARGET_LINUX_FREEBOB := jack_freebob.so | |||
TARGET_LINUX_FIREWIRE := jack_firewire.so | |||
TARGET_LINUX_DUMMY := jack_dummy.so | |||
VPATH := $(subprojects) | |||
@@ -46,6 +48,8 @@ objects_linux_alsa := JackAlsaDriver.o memops.o generic_hw.o hdsp.o hammerfall.o | |||
objects_linux_freebob := JackFreebobDriver.o | |||
objects_linux_firewire := JackFFADODriver.o | |||
objects_linux_dummy := JackDummyDriver.o | |||
CFLAGS := -g -fPIC -DUSE_POSIX_SHM $(addprefix -I, $(subprojects)) $(CFLAGS) | |||
@@ -65,6 +69,10 @@ freebob : $(TARGET_LINUX_SERVER_LIB) $(TARGET_LINUX_CLIENT_LIB) $(TARGET_LINUX_W | |||
$(TARGET_LINUX_SERVER) $(TARGET_LINUX_ALSA) $(TARGET_LINUX_FREEBOB) $(TARGET_LINUX_DUMMY) \ | |||
synchroClient synchroServer synchroServerClient testSem jack_test inprocess jack_load jack_unload | |||
firewire : $(TARGET_LINUX_SERVER_LIB) $(TARGET_LINUX_CLIENT_LIB) $(TARGET_LINUX_WRAPPER_LIB) \ | |||
$(TARGET_LINUX_SERVER) $(TARGET_LINUX_ALSA) $(TARGET_LINUX_FIREWIRE) $(TARGET_LINUX_DUMMY) \ | |||
synchroClient synchroServer synchroServerClient testSem jack_test | |||
synchroClient: JackPosixSemaphore.o testSynchroClient.o JackPosixThread.o JackError.o JackFifo.o | |||
$(CXX) $(CXXFLAGS) JackPosixSemaphore.o testSynchroClient.o JackPosixThread.o JackError.o JackFifo.o $(LIB_LINUX) -o synchroClient | |||
@@ -107,6 +115,9 @@ $(TARGET_LINUX_ALSA) : $(objects_linux_alsa) | |||
$(TARGET_LINUX_FREEBOB) : $(objects_linux_freebob) | |||
$(CXX) $(CXXFLAGS) -shared $(objects_linux_freebob) $(LIB_LINUX) -lfreebob libjackdmp.so -o $(TARGET_LINUX_FREEBOB) | |||
$(TARGET_LINUX_FIREWIRE) : $(objects_linux_firewire) | |||
$(CXX) $(CXXFLAGS) -shared $(objects_linux_firewire) $(LIB_LINUX) -lffado libjackdmp.so -o $(TARGET_LINUX_FIREWIRE) | |||
$(TARGET_LINUX_DUMMY) : $(objects_linux_dummy) | |||
$(CXX) $(CXXFLAGS) -shared $(objects_linux_dummy) $(LIB_LINUX) libjackdmp.so -o $(TARGET_LINUX_DUMMY) | |||
@@ -120,6 +131,7 @@ install: | |||
cp jack_alsa.so $(prefix)/$(libdir)/jackmp | |||
cp jack_dummy.so $(prefix)/$(libdir)/jackmp | |||
[ -f jack_freebob.so ] && cp jack_freebob.so $(prefix)/$(libdir)/jackmp || echo "freebob driver not installed" | |||
[ -f jack_firewire.so ] && cp jack_firewire.so $(prefix)/$(libdir)/jackmp || echo "firewire driver not installed" | |||
cd $(prefix)/bin && [ -f jackd ] && mv -f jackd tmp_jackd || echo "jackd server not found, continue..." | |||
cd $(prefix)/$(libdir) && [ -f libjack.so.0.0.23 ] && mv -f libjack.so.0.0.23 tmp_libjack.so.0.0.23 || echo "libjack not found, continue..." | |||
cd $(prefix)/include && [ -d jack ] && mv -f jack tmp_jack || echo "jack headers not found, continue..." | |||
@@ -149,7 +161,7 @@ remove: | |||
clean : | |||
rm -f *.o | |||
rm -f $(TARGET_LINUX_SERVER) $(TARGET_LINUX_SERVER_LIB) $(TARGET_LINUX_CLIENT_LIB) $(TARGET_LINUX_WRAPPER_LIB) $(TARGET_LINUX_ALSA) $(TARGET_LINUX_FREEBOB) $(TARGET_LINUX_DUMMY) \ | |||
rm -f $(TARGET_LINUX_SERVER) $(TARGET_LINUX_SERVER_LIB) $(TARGET_LINUX_CLIENT_LIB) $(TARGET_LINUX_WRAPPER_LIB) $(TARGET_LINUX_ALSA) $(TARGET_LINUX_FREEBOB) $(TARGET_LINUX_FIREWIRE) $(TARGET_LINUX_DUMMY) \ | |||
synchroClient synchroServer synchroServerClient testSem jack_test jack_load jack_unload inprocess.so | |||
depend : | |||
#makedepend -w120 -Y -- $(CXXFLAGS) -- $(sources) | |||
@@ -61,7 +61,7 @@ JackFreebobDriver::freebob_driver_read (freebob_driver_t * driver, jack_nframes_ | |||
printEnter(); | |||
// make sure all buffers have a valid buffer if not connected | |||
for (int i = 0; i < driver->capture_nchannels; i++) { | |||
for (unsigned int i = 0; i < driver->capture_nchannels; i++) { | |||
stream_type = freebob_streaming_get_playback_stream_type(driver->dev, i); | |||
if (stream_type == freebob_stream_type_audio) { | |||
freebob_streaming_set_playback_stream_buffer(driver->dev, i, | |||
@@ -104,10 +104,7 @@ JackFreebobDriver::freebob_driver_read (freebob_driver_t * driver, jack_nframes_ | |||
int | |||
JackFreebobDriver::freebob_driver_write (freebob_driver_t * driver, jack_nframes_t nframes) | |||
{ | |||
channel_t chn; | |||
JSList *node; | |||
jack_default_audio_sample_t* buf = NULL; | |||
jack_port_t *port; | |||
freebob_streaming_stream_type stream_type; | |||
@@ -121,7 +118,7 @@ JackFreebobDriver::freebob_driver_write (freebob_driver_t * driver, jack_nframes | |||
assert(driver->dev); | |||
// make sure all buffers output silence if not connected | |||
for (int i = 0; i < driver->playback_nchannels; i++) { | |||
for (unsigned int i = 0; i < driver->playback_nchannels; i++) { | |||
stream_type = freebob_streaming_get_playback_stream_type(driver->dev, i); | |||
if (stream_type == freebob_stream_type_audio) { | |||
freebob_streaming_set_playback_stream_buffer(driver->dev, i, | |||
@@ -736,7 +733,9 @@ int JackFreebobDriver::Attach() | |||
} else { | |||
printMessage ("Registering capture port %s", buf); | |||
if ((port_index = fGraphManager->AllocatePort(fClientControl->fRefNum, buf, (JackPortFlags)port_flags)) == NO_PORT) { | |||
if ((port_index = fGraphManager->AllocatePort(fClientControl->fRefNum, buf, | |||
JACK_DEFAULT_AUDIO_TYPE, | |||
(JackPortFlags)port_flags)) == NO_PORT) { | |||
jack_error("driver: cannot register port for %s", buf); | |||
return -1; | |||
} | |||
@@ -754,7 +753,7 @@ int JackFreebobDriver::Attach() | |||
driver->playback_nchannels = freebob_streaming_get_nb_playback_streams(driver->dev); | |||
driver->playback_nchannels_audio = 0; | |||
for (int i = 0; i < driver->playback_nchannels; i++) { | |||
for (unsigned int i = 0; i < driver->playback_nchannels; i++) { | |||
freebob_streaming_get_playback_stream_name(driver->dev, i, portname, sizeof(portname) - 1); | |||
snprintf(buf, sizeof(buf) - 1, "%s:%s", fClientControl->fName, portname); | |||
@@ -763,7 +762,9 @@ int JackFreebobDriver::Attach() | |||
printMessage ("Don't register playback port %s", buf); | |||
} else { | |||
printMessage ("Registering playback port %s", buf); | |||
if ((port_index = fGraphManager->AllocatePort(fClientControl->fRefNum, buf, (JackPortFlags)port_flags)) == NO_PORT) { | |||
if ((port_index = fGraphManager->AllocatePort(fClientControl->fRefNum, buf, | |||
JACK_DEFAULT_AUDIO_TYPE, | |||
(JackPortFlags)port_flags)) == NO_PORT) { | |||
jack_error("driver: cannot register port for %s", buf); | |||
return -1; | |||
} | |||
@@ -888,17 +889,7 @@ int JackFreebobDriver::Read() | |||
int JackFreebobDriver::Write() | |||
{ | |||
printEnter(); | |||
//JackLog("write\n"); | |||
int res = freebob_driver_write((freebob_driver_t *)fDriver, fEngineControl->fBufferSize); | |||
jack_time_t write_time = GetMicroSeconds(); | |||
/* | |||
if (write_time > (fLastWaitUst - fDelayedUst) + fEngineControl->fPeriodUsecs) { | |||
JackLog("FreeBoB write XRun \n"); | |||
NotifyXRun(write_time); | |||
} | |||
*/ | |||
printExit(); | |||
return res; | |||
} | |||
@@ -1052,8 +1043,6 @@ extern "C" | |||
} | |||
Jack::JackDriverClientInterface* driver_initialize(Jack::JackEngine* engine, Jack::JackSynchro** table, const JSList* params) { | |||
jack_driver_t *driver; | |||
unsigned int port = 0; | |||
unsigned int node_id = -1; | |||
int nbitems; | |||