* Enhanced for SCons build system:

- Added traget 'dist' and 'distcheck' for creating and testing a
    distribution archive (.tar.gz).
  - Added env.InstallMan() for easy installation of man pages.
  - Added more fine-grained 'install-*' targets sub-aliases of
    'install' this allowed some cleaning up in SConscripts.
  - Added target 'rpms' for build source and binary RPMs (currently
    the .spec file is hardcoded).
  - Updated tests to status of current ./configure script
    (CS_TEST_CAPI4LINUX, CS_TEST_SFFTOBMP, CS_SET_DOCDIR)
* Enhanced for SCons build scripts for supporting SCons 0.96's
  'toolpath' feature.
* Use prebuild man pages from SVN repository. Building from docbook is
  still to do.
* New SConscript for building .spec files.
* Added .spec for Mandrake 9.2


git-svn-id: https://svn.ibp.de/svn/capisuite/trunk/capisuite@385 4ebea2bb-67d4-0310-8558-a5799e421b66
This commit is contained in:
htgoebel 2005-01-02 22:05:17 +00:00
parent 0ec7378e77
commit 71edbe1da9
16 changed files with 823 additions and 199 deletions

View File

@ -1,3 +1,27 @@
2005-01-02 Hartmut Goebel <h.goebel@crazy-compilers.com>
* SConstruct: enhanced for supporting SCons 0.96's 'toolpath'
feature
* scons-tools/filesubst.py: likewise
* scons-tools/sourcetar.py: likewise
* SConstruct: Added traget 'dist' and 'distcheck' for creating and
testing a distribution archive (.tar.gz)
* SConstruct: env.InstallMan() for easy installation of man pages.
* SConstruct: made 'install-*' targets sub-aliases of 'install';
this allowed some cleaning up in SConscripts.
* SConscript: likewise
* src/SConscript: likewise
* src/capisuite-py/SConscript: likewise
* scripts/SConscript: likewise
* docs/SConscript: changed to use prebuild man pages from SVN
repository. Building from docbook is still to do.
* suse/SConscript: New SConscript for building .spec files.
* suse/capisuite-mdk-9.2.spec.in: Added .spec for Mandrake 9.2
* SConstruct: Added target 'rpms' for build source and binary RPMs
(currently the .spec file is hardcoded).
* SConstruct: updated tests to status of current ./configure script
* SConstruct-Config: likewise
* Changelog, TODO: Updated
2004-12-30 Hartmut Goebel <h.goebel@crazy-compilers.com> 2004-12-30 Hartmut Goebel <h.goebel@crazy-compilers.com>
* scripts/cs_helpers.pyin: Changed sfftotiff to be defined * scripts/cs_helpers.pyin: Changed sfftotiff to be defined
depending on @sfftobmp_major_version@ during runtime. This depending on @sfftobmp_major_version@ during runtime. This

View File

@ -7,11 +7,11 @@ Import('env')
cronfile = env.FileSubst('capisuite.cron', 'capisuite.cronin') cronfile = env.FileSubst('capisuite.cron', 'capisuite.cronin')
rcfile = env.FileSubst('rc.capisuite', 'rc.capisuite.in') rcfile = env.FileSubst('rc.capisuite', 'rc.capisuite.in')
env.AddPostAction([cronfile, rcfile], 'chmod gu+x $TARGET') env.AddPostAction([cronfile, rcfile], Chmod('$TARGETS', 0755))
Alias('install', env.Alias('install', [
env.Install('$docdir', Split('COPYING NEWS README')), env.Install('$docdir', Split('COPYING NEWS README AUTHORS')),
env.Install('$sysconfdir/init.d/capisuite', rcfile), env.InstallAs('$sysconfdir/init.d/capisuite', rcfile),
env.InstallAs('$sysconfdir/cron.daily/capisuite', cronfile), env.InstallAs('$sysconfdir/cron.daily/capisuite', cronfile),
env.InstallAs('$pkgsysconfdir/cronjob.conf','cronjob.conf'), env.InstallAs('$pkgsysconfdir/cronjob.conf','cronjob.conf'),
) ])

View File

@ -105,11 +105,26 @@ def CheckStringClear(context):
context.did_show_result = 1 context.did_show_result = 1
return ret return ret
# capisuite special test
def CheckCapiALERT_REQ(context):
context.Display('Checking for new ALERT_REQ signature in capiutils.h ... ')
text = """
#include <capiutils.h>
int main() {
ALERT_REQ (NULL, 0, 0, 0, NULL, NULL, NULL, NULL, NULL);
}
\n"""
ret = context.CompileProg(text, '.cpp')
SCons.Conftest._YesNoResult(context, ret, "HAVE_NEW_CAPI4LINUX", text)
context.did_show_result = 1
return ret
conf = Configure(env, conf = Configure(env,
custom_tests = {'CheckHeadersStdC': CheckHeadersStdC, custom_tests = {'CheckHeadersStdC': CheckHeadersStdC,
'CheckHeaderTime': CheckHeaderTime, 'CheckHeaderTime': CheckHeaderTime,
'CheckStringClear': CheckStringClear, 'CheckStringClear': CheckStringClear,
'CheckCapiALERT_REQ': CheckCapiALERT_REQ,
}, },
conf_dir = '.sconf_temp', # no '#' to build in build-dir conf_dir = '.sconf_temp', # no '#' to build in build-dir
log_file = 'config.log' # no '#' to build in build-dir log_file = 'config.log' # no '#' to build in build-dir
@ -131,21 +146,24 @@ conf.CheckHeaderTime()
###--- CapiSuite specials ---### ###--- CapiSuite specials ---###
# CS_TEST_GCC3
# new gcc3 feature: we can #include<ostream> instead of ostream.h # new gcc3 feature: we can #include<ostream> instead of ostream.h
conf.CheckHeader('ostream', language='C++') conf.CheckHeader('ostream', language='C++')
conf.CheckStringClear() # checking for string::clear method conf.CheckStringClear() # checking for string::clear method
conf.CheckCapiALERT_REQ() # CS_TEST_CAPI4LINUX
# CS_TEST_SFFTOBMP is implemented in SConstruct.Get_sfftobmp_Version
# CS_SET_DOCDIR is implemented in SConscript-Options
###--- libs required by CapiSuite ---### ###--- libs required by CapiSuite ---###
# checking for capi20_register in -lcapi20... yes # checking for capi20_register in -lcapi20... yes
if not conf.CheckLib('capi20', 'capi20_register', language='C++'): if not conf.CheckLib('capi20', 'capi20_register', language='C++'):
print 'libcapi not found - aborting' print 'libcapi20 not found - aborting'
Exit(5) Exit(5)
# checking for pthread_create in -lpthread... yes # checking for pthread_create in -lpthread... yes
if not conf.CheckLib('pthread', 'pthread_create', language='C++'): if not conf.CheckLib('pthread', 'pthread_create', language='C++'):
print 'lipthread not found - aborting' print 'libpthread not found - aborting'
Exit(5) Exit(5)
# todo # todo

View File

@ -30,14 +30,18 @@ opts.AddOptions(
('mandir', 'man documentation', '$prefix/man'), ('mandir', 'man documentation', '$prefix/man'),
# install into another filesystem base # install into another filesystem base
('INSTALL_BASE', 'base dir for installation (userfull for RPMs)', ('INSTALL_BASE', 'base dir for installation (usefull for RPMs)', '/'),
'#/dist'), #('KEEP_CONFIG', 'Do not install config files (usefull for development)',
# 0),
# this is a capisuite-special # this is a capisuite-special (CS_SET_DOCDIR)
('docdir', 'other documentation', '$datadir/doc/capisuite'), ('docdir', 'other documentation', '$datadir/doc/capisuite'),
) )
Import(['env', '__targets__']) Import(['env', '__targets__'])
opts.Update(env) opts.Update(env)
Help(opts.GenerateHelpText(env) + __targets__) Help(opts.GenerateHelpText(env) + __targets__)
if env.has_key('INSTALL_BASE'):
if str(env['INSTALL_BASE']) in ('/', ''):
del env['INSTALL_BASE']
opts.Save('options.cache', env) opts.Save('options.cache', env)

View File

@ -1,10 +1,10 @@
# -*- python -*- # -*- mode: python ; coding: latin-1 -*-
""" """
Main SCons build script for CapiSuite Main SCons build script for CapiSuite
(c) Copyright 2004 by Hartmut Goebel <h.goebel@crazy-compilers.com> (c) Copyright 2004 by Hartmut Goebel <h.goebel@crazy-compilers.com>
CapiSuite is (c) Copyright by Gernot Hiller <gernot@hiller.de> CapiSuite is (c) Copyright by Gernot Hillier <gernot@hillier.de>
Use 'scons --help' for a list of available options. Use 'scons --help' for a list of available options.
@ -17,123 +17,122 @@ Example:
scons prefix=/ # build for prefix=/ scons prefix=/ # build for prefix=/
scons # prefix=/ is taken from 'options.cache' scons # prefix=/ is taken from 'options.cache'
scons prefix=/usr/local # build for prefix=/usr/local scons prefix=/usr/local # build for prefix=/usr/local
# since this is the default, the entry in options.cache # since this is the default, the entry in
# will be renmoved # options.cache will be removed
scons # default prefix is used scons # default prefix is used
WARNING: This build method is not officially supported for CapiSuite. Please WARNING: This build method is not yet officially supported for
use the usual configure;make;make install triplet instead! CapiSuite. Please use the usual 'configure; make; make install'
triplet instead!
""" """
__targets__ = """ __targets__ = """
Additional targets: Additional targets:
configure : build the 'configure' script configure : build the 'configure' script
(this is automatically done if 'config.h' is missing) (this is automatically done if 'config.h' is missing)
pycheck : check Python sources with PyChecker (not yet implemented) pycheck : check Python sources with PyChecker (not yet implemented)
install : install all files install : install all files
install-pylib : install only the python library install-pylib : install only the python library
install-scripts : install only the python scripts install-scripts : install only the python scripts
install-exec : install only the executables install-exec : install only the executables
install-man : install only the man pages
install-data-local: create spool- and state-dirs
For all 'install'-targets the installation base may be set with
INSTALL_BASE=...
dist : build distribution archive (.tar.gz)
distcheck : test whether distribution archive is slef-contained
rpms : build source and binay rpms
For all install-targets base may be set with INSTALL_BASE=...
""" """
## install-strip: strip the _installed_ binaries
## all == .
## clean == -c: clean all file that could be made by building
## distclean: clean all file that are made by configuring and building
## config.h, .sconf.temp, ...
## uninstall == -c install
## mostlyclean: läßt selten gebaute File stehen
## maintainer-clean: clean + bison-output, info-files, tag tables, etc.
## check: perform self-test
##
## TAGS, info, dvi,
## installcheck, installdirs
###---####---###---####---###---####---###---####---###---####---###---###
# File-Content Substitution will (hopefully ) be part of SCons 0.95 # some Pythonic setup
def _file_subst(target, source, env): import sys, os, os.path, glob
import os, re import SCons.Util, SCons.Script
import SCons.Util
def _substitute(matchobj, env=env):
sym = matchobj.group(1)
try:
return env.subst(str(env[sym]))
except: # TypeError: # sym not a string
print 'Not substituting', sym
return matchobj.group(0) # matched
delim = re.escape(env.get('SUBST_DELIM', '@'))
subst_pattern = re.compile('%s(.*?)%s' % (delim, delim))
for t, s in zip(target, source):
t = str(t)
s = s.rstr()
text = open(s, 'rb').read()
text = subst_pattern.sub(_substitute, text)
open(t, 'wb').write(text)
os.chmod(t, os.stat(s)[0])
return None
def _fs_strfunc(target, source, env):
return "generating '%s' from '%s'" % (target[0], source[0])
_fs_builder = Builder(action = Action(_file_subst, strfunction = _fs_strfunc))
import sys, os, os.path
import SCons.Util
import SCons.Node.FS import SCons.Node.FS
EnsurePythonVersion(2,2) # capisuite requires this # Store signatures in ".sconsign.dbmlite" in the top-level directory.
#EnsureSConsVersion(0,94) SConsignFile()
build_dir = Dir('#/build')
class InstallableEnv(Environment): class InstallableEnv(Environment):
"""Extended Environment which supports INSTALL_BASE and ExtraDist."""
def BasedFile(self, name):
if self.get('INSTALL_BASE'): name = ('$INSTALL_BASE/%s' % name)
return self.File(name)
def BasedDir(self, name):
if self.get('INSTALL_BASE'): name = ('$INSTALL_BASE/%s' % name)
return self.Dir(name)
def Install(self, dir, source): def Install(self, dir, source):
"""Install specified files in the given directory.""" """Install specified files in the given directory."""
if self.has_key('INSTALL_BASE'): dir = self.arg2nodes(dir, self.BasedDir)
def _Dir(name): files = Environment.Install(self, dir, source)
return SCons.Node.FS.Dir(name, parent, self.fs) env.ExtraDist(files)
parent = self['INSTALL_BASE'] #self.SourceDist(files)
dir = self.arg2nodes(dir, _Dir) return files
return Environment.Install(self, dir, source)
def InstallAs(self, target, source): def InstallAs(self, target, source):
"""Install sources as targets.""" """Install sources as targets."""
def _File(name): target = self.arg2nodes(target, self.BasedFile)
return SCons.Node.FS.File(name, dir, self.fs) files = Environment.InstallAs(self, target, source)
self.ExtraDist(files)
if self.has_key('INSTALL_BASE'): return files
dir = self['INSTALL_BASE']
targets = self.arg2nodes(target, _File)
return Environment.InstallAs(self, target, source)
env = InstallableEnv() _valid_man_extensions = '0123456789ln' # from info automake
env.Append(
BUILDERS={'FileSubst' : _fs_builder},
PACKAGE = 'capisuite',
VERSION = '0.5.cvs',
srcdir = build_dir,
pkgdatadir = '${datadir}/${PACKAGE}', def mandir(self, section):
pkglibdir = '${libdir}/${PACKAGE}', section = str(section)
pkgincludedir = '${includedir}/${PACKAGE}', assert section in self._valid_man_extensions, section # todo: error msg
return os.path.join('$mandir', 'man%s' % section)
pkgbindir = '${bindir}', def InstallMan(self, source, section=None):
pkgsbindir = '${sbindir}', """
pkgsysconfdir = '${sysconfdir}/${PACKAGE}', Install man pages.
#pkglibdir = '${prefix}/lib', If 'section' is given, file extensions are changed to 'section'.
spooldir = '${localstatedir}/spool/${PACKAGE}', Otherwise, the section is taken from file extension.
docdir = '${pkgdatadir}/doc/${PACKAGE}', """
) source = self.arg2nodes(source, self.File)
env.SConscript('SConscript-Options', exports=['env', '__targets__']) result = []
for man in source:
base = os.path.basename(man.name)
base, ext = os.path.splitext(base)
sect = section
if sect is None:
sect = ext[1] # determine section from name/extension
else:
ext = '.%s' % sect # overwrite extension
res = self.InstallAs(os.path.join(self.mandir(sect), base + ext),
man)
result.extend(res)
return result
if env.has_key('INSTALL_BASE'): def ExtraDist(self, files):
env.Replace(INSTALL_BASE=env.Dir('$INSTALL_BASE')) """Collect Additional files to be distributed."""
Export('env') if SCons.Util.is_List(files):
files = map(File, files)
else:
files = File(files)
env.Append(__SOURCES=files)
env.BuildDir(build_dir=build_dir, src_dir='.') #
# Support functions for linking with Python
#
###---####---###---####---###---####---###---####---###---####---###---###
# call configure if required
# if config.h does not exist, build it using Scons' conftest
if not os.path.exists(str(File('config.h', build_dir))) \
or 'configure' in COMMAND_LINE_TARGETS:
env.SConscript('SConscript-Config', build_dir=build_dir)
###---####---###---####---###---####---###---####---###---####---###---###
def GetPythonModuleSetup(env): def GetPythonModuleSetup(env):
""" """
@ -190,11 +189,129 @@ def GetPythonEmbeddedSetup(env):
print ' '.join(python_libspec) print ' '.join(python_libspec)
#print '>>>', env['LIBS'] #print '>>>', env['LIBS']
GetPythonModuleSetup(env) def Get_sfftobmp_Version(context):
GetPythonEmbeddedSetup(env) """
Test for the sfftobmp version installed as different versions
need different parameters. :-(
"""
import commands, re
print 'Checking for sfftobmp version ...',
status, text = commands.getstatusoutput('sfftobmp -v')
if status:
print 'failed'
print text
Exit(1)
res = re.search(r'Version ([0-9,.]+)', text, re.M) or 0
if not res:
print 'failed'
print
print '** It seams like the output of sfftobmp has changed. Please'
print '** contact the authors of capisuite to fix this.'
Exit(10)
res = res.group(1)
env.Replace(sfftobmp_major_version = res.split('.')[0])
print res
# A Shortcut
is_dist = ('dist' in COMMAND_LINE_TARGETS or
'distcheck' in COMMAND_LINE_TARGETS)
###---####---###---####---###---####---###---####---###---####---###---###
# capisuite requires Python 2.2
EnsurePythonVersion(2,2)
if is_dist:
# 'dist' target requires module tarfile which is new in Python 2.3
EnsurePythonVersion(2,3)
EnsureSConsVersion(0,96)
###---####---###---####---###---####---###---####---###---####---###---###
#
# Setting up build-environment
#
# Build all files in this subdir
build_dir = Dir('#/build')
env = InstallableEnv(tools=Split('default sourcetar filesubst'),
toolpath=['scons-tools'],
# set some build variables
PACKAGE = 'capisuite',
VERSION = '0.5.cvs',
RELEASE = '1',
# required for some building the docs (doxygen)
srcdir = build_dir,
# default pathes
pkgdatadir = '${datadir}/${PACKAGE}',
pkglibdir = '${libdir}/${PACKAGE}',
pkgincludedir = '${includedir}/${PACKAGE}',
pkgbindir = '${bindir}',
pkgsbindir = '${sbindir}',
pkgsysconfdir = '${sysconfdir}/${PACKAGE}',
#pkglibdir = '${prefix}/lib',
spooldir = '${localstatedir}/spool/${PACKAGE}',
docdir = '${pkgdatadir}/doc/${PACKAGE}',
# required for ExtraDist
__SOURCES = [],
# used for distcheck
SCONS = 'scons',
DISTCHECK_DIR = Dir('#/dist/check'),
)
###---####---###---####---###---####---###---####---###---####---###---###
#
# Handling of command line options
#
# Some commonly used make targets have to be done another way.
# Inform the used if he tries to use such a target:
for ct, t in (
('clean', '-c'),
('uninstall', '-c install'),
('distclean', '-c dist'),
):
if ct in COMMAND_LINE_TARGETS:
print
print "Please use 'scons %s' instead of the pseudo-target '%s'." \
% (t, ct)
print
Exit(1)
# Handle options
env.SConscript('SConscript-Options', exports=['env', '__targets__'])
### Some more setup
env.BuildDir(build_dir=build_dir, src_dir='.')
Export('env', 'is_dist')
###---####---###---####---###---####---###---####---###---####---###---###
#
# Configure build (only if neither cleaning nor 'dist'-ing)
#
if not GetOption('clean') and not is_dist:
# "configure" only if necessary or requested
if not File('config.h', build_dir).exists() \
or 'configure' in COMMAND_LINE_TARGETS:
env.SConscript('SConscript-Config')#, build_dir=build_dir)
# get some build variables we always need to evaluate
GetPythonModuleSetup(env)
GetPythonEmbeddedSetup(env)
Get_sfftobmp_Version(env)
###---####---###---####---###---####---###---####---###---####---###---###
env.Append( env.Append(
CCFLAGS = Split('-g -O2'), CCFLAGS = Split('-g -O2'),
# these should go into src/SConscript:
LIBS = Split('pthread capi20'), LIBS = Split('pthread capi20'),
CPPDEFINES={'LOCALSTATEDIR': r'\"${localstatedir}\"', CPPDEFINES={'LOCALSTATEDIR': r'\"${localstatedir}\"',
'PKGDATADIR' : r'\"${pkgdatadir}\"', 'PKGDATADIR' : r'\"${pkgdatadir}\"',
@ -212,24 +329,72 @@ env.Append(
## if env['CXX'] in ('g++', 'c++'): ## if env['CXX'] in ('g++', 'c++'):
## env.Append(CXXFLAGS = ['-Wall', '-Wno-non-virtual-dtor']) ## env.Append(CXXFLAGS = ['-Wall', '-Wno-non-virtual-dtor'])
###---####---###---####---###---####---###---####---###---####---###---### ###---####---###---####---###---####---###---####---###---####---###---###
#
# snippet for unittest # Build everything defined in the 'Sconscript' files.
#mytest = env.program(...) #
#Alias( 'unittest', mytest )
#Alias( 'all', 'unittest' )
#unittetsInstall = env.Install(...)
#Alias('unittest', unitteststInstall)
# now build the subdirectories' stuff
env.SConscript(dirs=[Dir('.', build_dir), env.SConscript(dirs=[Dir('.', build_dir),
Dir('src', build_dir), Dir('src', build_dir),
Dir('scripts', build_dir), Dir('scripts', build_dir),
Dir('scripts/waves', build_dir), Dir('scripts/waves', build_dir),
Dir('docs', build_dir), Dir('docs', build_dir),
Dir('suse'),
]) ])
#--- additional files to be distributed ---
env.ExtraDist(Split("""
ChangeLog TODO
SConstruct
SConscript-Config
SConscript-Options
scons-tools/sourcetar.py
scons-tools/filesubst.py
scons-tools/textfile.py
SConscript
src/SConscript
scripts/SConscript
scripts/waves/SConscript
suse/SConscript
docs/SConscript
"""))
#--- additional files to be distributed (automake/autoconf stuff) ---
# only add these files if they exist
for f in Split("""
INSTALL
acinclude.m4
aclocal.m4
config.h.in
configure
configure.in
depcomp
install-sh
missing
mkinstalldirs
Makefile.am
Makefile.in
docs/Makefile.am
docs/Makefile.in
scripts/Makefile.am
scripts/Makefile.in
scripts/waves/Makefile.am
scripts/waves/Makefile.in
src/Makefile.am
src/Makefile.in
src/application/Makefile.am
src/application/Makefile.in
src/backend/Makefile.am
src/backend/Makefile.in
src/capisuite-py/Makefile.am
src/capisuite-py/Makefile.in
src/modules/Makefile.am
src/modules/Makefile.in
"""):
if os.path.exists(f):
env.ExtraDist(f)
#env.SourceCode('.', #env.SourceCode('.',
# env.CVS('pserver:anonymous@cvs.capisuite.berlios.de:/cvsroot/capisuite', # env.CVS('pserver:anonymous@cvs.capisuite.berlios.de:/cvsroot/capisuite',
# 'capisuite')) # 'capisuite'))
@ -240,10 +405,73 @@ mkdir -p $RPM_BUILD_ROOT/usr/sbin
ln -sf ../../etc/init.d/capisuite $RPM_BUILD_ROOT/usr/sbin/rccapisuite ln -sf ../../etc/init.d/capisuite $RPM_BUILD_ROOT/usr/sbin/rccapisuite
""" """
#EXTRA_DIST = rc.capisuite.in capisuite.cronin cronjob.conf
#install-data-local: ###---####---###---####---###---####---###---####---###---####---###---###
# mkdir -p $(DESTDIR)$(localstatedir)/log #
# $(mkinstalldirs) $(DESTDIR)$(spooldir)/sendq # Install targets
# $(mkinstalldirs) $(DESTDIR)$(spooldir)/done #
# $(mkinstalldirs) $(DESTDIR)$(spooldir)/failed
# $(mkinstalldirs) $(DESTDIR)$(spooldir)/users for d in (
'${DESTDIR}${localstatedir}/log',
'${DESTDIR}${spooldir}/sendq',
'${DESTDIR}${spooldir}/done',
'${DESTDIR}${spooldir}/failed',
'${DESTDIR}${spooldir}/users',
):
if not os.path.exists(env.subst(d)):
d = env.Command(env.BasedDir(d), None, Mkdir('$TARGET'))
env.Alias('install-data-local', d)
# 'install' includes the other parts, too
env.Alias('install', env.Alias('install-pylib'))
env.Alias('install', env.Alias('install-scripts'))
env.Alias('install', env.Alias('install-exec'))
env.Alias('install', env.Alias('install-data-local'))
env.Alias('install', env.Alias('install-man'))
###---####---###---####---###---####---###---####---###---####---###---###
#
# 'Dist' target
#
if is_dist or 'rpms' in COMMAND_LINE_TARGETS:
dist = env.DistTar('#/dist/${PACKAGE}-${VERSION}.tar.gz', env['__SOURCES'],
TARFLAGS='-c -z')[0]
###---####---###---####---###---####---###---####---###---####---###---###
#
# 'Dist' target
#
if 'distcheck' in COMMAND_LINE_TARGETS:
distcheck = env.Command('distcheck',
env.Dir('$DISTCHECK_DIR/${PACKAGE}-${VERSION}'),
[Delete('$SOURCE'),
Mkdir('$SOURCE'),
'$TAR xz -C ${SOURCE.dir} -f ' + dist.abspath,
'$SCONS -C $SOURCE .',
'$SCONS -C $SOURCE dist',
'echo ; echo checkdist passed ; echo'
])
env.Clean(distcheck, env['DISTCHECK_DIR'])
env.Depends(distcheck, dist)
###---####---###---####---###---####---###---####---###---####---###---###
#
# 'rpm' target
#
if 'rpms' in COMMAND_LINE_TARGETS:
_builddir = build_dir
_distdir = dist.dir
_arch = 'i586'
_rpmbasename = env.subst('capisuite-$VERSION-$RELEASE')
env.Alias('rpms',
env.Command([File('%s.%s.rpm' % (_rpmbasename, _arch), _distdir),
File('%s.%s.rpm' % (_rpmbasename, 'src'), _distdir)],
['suse/capisuite-mdk-9.2.spec', dist], [ \
['rpmbuild',
'--define', '_builddir %s' % _builddir.abspath,
'--define', '_sourcedir %s' % _distdir.abspath,
'--define', '_srcrpmdir %s' % _distdir.abspath,
'--define', '_rpmdir %s' % _distdir.abspath,
'--define', '_rpmfilename $TARGET.name',
'-ba', '$SOURCE'],
]))

4
TODO
View File

@ -10,6 +10,10 @@ Important for 0.5.0/capisuite-py:
* Add option '--is-configured' to capisuite-checkconfig to be used * Add option '--is-configured' to capisuite-checkconfig to be used
by rc-file. by rc-file.
Build:
* Determine the path of the stylsheets automatically. These are
currently hardcoded for Suse Linux.
NICE: NICE:
- more checks/options for capisuite-checkconfig - more checks/options for capisuite-checkconfig
- ?valgrind-clean the used libs and Python? - ?valgrind-clean the used libs and Python?

View File

@ -1,18 +1,24 @@
# -*- python -*- # -*- python -*-
Import('env') Import('env', 'is_dist')
#EXTRA_DIST = Doxyfile.in mainpage.doxy manual.docbook manual.README
## dist-hook: manual-html manual-pdf reference-html
## mkdir $(distdir)/manual
## cp -r $(srcdir)/manual/* $(distdir)/manual/
## mkdir $(distdir)/reference
## cp $(srcdir)/reference/* $(distdir)/reference/
## cp manual.pdf $(distdir)/
import re import re
#---- man pages -----------
env.Alias('install-man',
env.InstallMan(Split('capisuite.8 capisuite.conf.5 fax.conf.5 '
'answering_machine.conf.5 capisuitefax.1')))
env.ExtraDist(Split('Doxyfile.in mainpage.doxy manual.docbook '
'manual-de.docbook manual.README'))
# todo:
# - find stylesheet dir (how?)
# - build manpages from manual.docbook
# - build pdf-manual from manual.docbook
# - build html-manual from manual.docbook
def patch_version(target, source, env): def patch_version(target, source, env):
""" """
Change version contained in the <title> tag. Change version contained in the <title> tag.
@ -24,43 +30,69 @@ def patch_version(target, source, env):
text) text)
open(source[0].abspath, 'w').write(text) open(source[0].abspath, 'w').write(text)
env.Append(docbuilddir=Dir('.')) env.Append(docbuilddir=Dir('.'))
manualdir = Dir('manual') manualdir = Dir('manual')
stylesheetdir = Dir('/usr/share/sgml/docbook/xsl-stylesheets') #stylesheetdir = Dir('/usr/share/sgml/docbook/xsl-stylesheets')
stylesheetdir = Dir('/usr/share/xml/docbook/stylesheet/nwalsh/current/')
profile_xsl = File("profiling/profile.xsl", stylesheetdir)
docbook_xsl = File("manpages/docbook.xsl", stylesheetdir)
#images = Install(Dir('images', manualdir), images) #images = Install(Dir('images', manualdir), images)
"""
# create HTML manual # create HTML manual
manual_html = env.Command(File('index.html', manualdir), manual_html = env.Command('manual/index.html', 'manual.docbook', [
'manual.docbook', [
patch_version, patch_version,
['xmllint', '--noout', '--valid', '$SOURCE'], 'xmllint --noout --valid $SOURCE',
['xsltproc', '-o', '${TARGET.dir}/', ['xsltproc', '-o', '${TARGET.dir}/',
File('xhtml/chunk.xsl', stylesheetdir), '$SOURCE'] File('xhtml/chunk.xsl', stylesheetdir), '$SOURCE'],
]) Delete('${TARGET.dir}/images'),
#env.Depends(manual_html, images) Copy('${TARGET.dir}/images', Dir('images', stylesheetdir).abspath),
# copy missing images
env.AddPostAction(manual_html, [ \
['rm', '-fr', Dir('images', manualdir)],
['cp', '-r', Dir('images', stylesheetdir), Dir(manualdir)]
]) ])
# create PDF manual # create PDF manual
manual_pdf = env.Command('manual.pdf', 'manual.docbook', db_xml = env.Command('manual.xml', 'manual.docbook',
'db2pdf -o ${TARGET.dir} $SOURCE' 'xsltproc --stringparam profile.condition pdf '
) '-o $TARGET $profile_xsl $SOURCE')
manual_pdf = env.Command('manual.pdf', db_xml,
['db2pdf -o ${TARGET.dir} $SOURCE',
#Delete(Split('CATALOG.local manual.aux manual.log '
# 'manual.out manual.tex suse-*.dsl '
# 'manual.xml')
])
# substitute version, capisuite_sources, srcdir # substitute version, capisuite_sources, srcdir
doxyfile = env.FileSubst('Doxyfile', 'Doxyfile.in') doxyfile = env.FileSubst('Doxyfile', 'Doxyfile.in')
ref_html = env.Command('reference/index.html', doxyfile, [ \ reference_html = env.Command('reference/index.html', doxyfile, [
['doxygen', doxyfile] Delete('${TARGET.dir}'),
]) ['doxygen', doxyfile]
])
Alias('install',
env.Install('$docdir', manual_pdf), #--- build man pages ------------------
#env.Install('$docdir', 'manual'), db4man = env.Command('manual-4man.docbook', 'manual.docbook',
#env.Install('$docdir', 'reference'), 'xsltproc --stringparam profile.condition man '
) '-o $TARGET $profile_xsl $SOURCE')
manpages = env.Command(Split('capisuite.8 capisuite.conf.5 fax.conf.5 '
'answering_machine.conf.5 capisuitefax.1'),
db4man,
'xsltproc $docbook4man_xsl $SOURCE')
#--- install ---
for i in (env.Install('$docdir', manual_pdf),
#env.Install('$docdir', manual_html),
#env.Install('$docdir', reference_html),
):
env.Alias('install', i)
#--- dist ---
## for t, s in ((env.Dir('${DISTDIR}/manual'), manual_html),
## (env.Dir('${DISTDIR}/reference'), reference_html),
## ('${DISTDIR}/manual.pdf', manual_pdf)):
## env.Command(t, s, Copy('$TARGET', '$SOURCE'))
"""

47
scons-tools/filesubst.py Normal file
View File

@ -0,0 +1,47 @@
# -*- python -*-
"""
File-Content Substitution builder for SCons
"""
__author__ = "Hartmut Goebel <h.goebel@crazy-compilers.com>"
import os, re
import SCons
def _action(target, source, env):
def _substitute(matchobj, env=env):
sym = matchobj.group(1)
try:
return env.subst(str(env[sym]))
except: # TypeError: # sym not a string
txt = matchobj.group(0) # the string matched
print 'Not substituting', txt
return txt
delim = re.escape(env['FILESUBSTDELIM'])
# compile a non-greedy pattern
subst_pattern = re.compile('%s(.*?)%s' % (delim, delim))
for t, s in zip(target, source):
t = str(t)
s = s.rstr()
text = open(s, 'rb').read()
text = subst_pattern.sub(_substitute, text)
open(t, 'wb').write(text)
os.chmod(t, os.stat(s)[0])
return None
def _strfunc(target, source, env):
return "generating '%s' from '%s'" % (target[0], source[0])
_builder = SCons.Builder.Builder(
action = SCons.Action.Action(_action, _strfunc),
src_suffix = '.in',
)
def generate(env):
env['BUILDERS']['FileSubst'] = _builder
env['FILESUBSTDELIM'] = '@'
def exists(env):
return 1

62
scons-tools/sourcetar.py Normal file
View File

@ -0,0 +1,62 @@
# -*- python -*-
"""
SCons builder for creating source tars.
"""
import SCons
from SCons.Node.FS import Base
def _e_dist(target, source, env):
def collect_sources(sources, collected, done, dbg=''):
for s in sources:
if s in done.keys(): continue
done[s] = None
if not s.is_derived(): # this node is not built (nor side-effect)
#assert not s.all_children()
if isinstance(s, Base) and s.is_under(env.fs.Dir('#')):
#print s
collected[s] = None
else:
collect_sources(s.all_children(scan=1), collected,done)
return collected
def cmp_path(a, b):
return cmp(a.get_path(), b.get_path())
collected = collect_sources(source, {}, {})
collected = [ c.srcnode() for c in collected.keys() ]
collected.sort(cmp_path)
return (target, collected)
def DistTar(target, source, env):
import tarfile
tar = tarfile.open(str(target[0]), "w:gz")
for name in source:
name = str(name)
tar.add(name, env.subst('${PACKAGE}-${VERSION}/') + name)
tar.close()
def _str_DistTar(target, source, env):
return env.subst('tar czf $TARGET $SOURCES')
_builder = SCons.Builder.Builder(
action="$TARCOM",
emitter = _e_dist,
multi = 1,
)
_builder_dist = SCons.Builder.Builder(
action=SCons.Action.Action(DistTar,strfunction=_str_DistTar),
emitter = _e_dist,
multi = 0,
)
def generate(env):
env['BUILDERS']['SourceTar'] = _builder
env['BUILDERS']['DistTar'] = _builder_dist
def exists(env):
import SCons.Tools.tar
return SCons.Tools.tar.exists(env)

View File

@ -557,13 +557,7 @@ capisuitefax: capisuitefax.in
.pyin.py: .pyin.py:
rm -f $@ rm -f $@
if test $(sfftobmp_major_version) = "2"; then \ sed 's,@sfftobmp_major_version@,$(sfftobmp_major_version),g' $< >$@
sed -e 's,@\pkgsysconfdir@,$(pkgsysconfdir),g' \
-e 's,#2 ,,g' $< >$@ ;\
else \
sed -e 's,@\pkgsysconfdir@,$(pkgsysconfdir),g' \
-e 's,#3 ,,g' $< >$@ ;\
fi
.confin.conf: .confin.conf:
rm -f $@ rm -f $@

View File

@ -12,13 +12,13 @@ def py_compile(target, source, env):
env.subst('$SOURCE.file')), env.subst('$SOURCE.file')),
) )
# these ar meant to be used by users # these are meant to be used by users
user_scripts = [env.FileSubst('capisuitefax', 'capisuitefax.in'),] user_scripts = [env.FileSubst('capisuitefax', 'capisuitefax.in'),]
env.AddPostAction(user_scripts, 'chmod 755 $TARGETS') env.AddPostAction(user_scripts, Chmod('$TARGETS', 0755))
# these are meant to be used by the admin # these are meant to be used by the admin
sbin_scripts = [File('capisuite-checkconfig'),] sbin_scripts = [File('capisuite-checkconfig'),]
#env.AddPostAction(sbin_scripts, 'chmod 755 $TARGETS') #env.AddPostAction(sbin_scripts, Chmod('$TARGETS', 0755))
# config files # config files
configs = [ configs = [
@ -26,8 +26,7 @@ configs = [
env.FileSubst('answering_machine.conf', 'answering_machine.confin') env.FileSubst('answering_machine.conf', 'answering_machine.confin')
] ]
# this is no longer needed # file subst. is required because of sfftobmp_major_version
# todo: check cs_helper.py into cvs instead of cs_helper.pyin
env.FileSubst('cs_helpers.py', 'cs_helpers.pyin') env.FileSubst('cs_helpers.py', 'cs_helpers.pyin')
pymodules = [] pymodules = []
@ -37,17 +36,20 @@ for mod in Split('cs_helpers'):
#--- install --- #--- install ---
install_pylib = env.Install('$python_moduledir', pymodules) env.Alias('install-pylib', env.Install('$python_moduledir', pymodules))
Alias('install-pylib',install_pylib)
for i in [env.Install('$pkgbindir', user_scripts), for i in (
env.Install('$pkgsbindir', sbin_scripts), env.Install('$pkgbindir', user_scripts),
env.Install('$pkglibdir', Split('idle.py incoming.py'))]: env.Install('$pkgsbindir', sbin_scripts),
Alias('install-scripts', i) env.Install('$pkglibdir', Split('idle.py incoming.py'))
Alias('install', i) ):
env.Alias('install-scripts', i)
Alias('install',
env.Install('$python_moduledir', pymodules), for i in (
env.Install('$pkgsysconfdir', configs), env.Install('$python_moduledir', pymodules),
env.Install('$pkglibdir', 'README'), env.Install('$pkgsysconfdir', configs),
) env.Install('$pkglibdir', 'README'),
):
env.Alias('install', i)
# this also includes 'install-pylib' and 'install-scripts'
# (set in #/SConstruct)

View File

@ -7,8 +7,9 @@ def findFiles(pattern, subdir=''):
files = [] files = []
for file in os.listdir(os.path.join(Dir('.').srcnode().abspath, subdir)): for file in os.listdir(os.path.join(Dir('.').srcnode().abspath, subdir)):
if fnmatch.fnmatch(file, pattern): if fnmatch.fnmatch(file, pattern):
files.append(os.path.join(subdir, file)) files.append(File(os.path.join(subdir, file), Dir('.')))
return files return files
Alias('install', env.Install('$pkgdatadir/waves', 'README' )) for n in (env.Install('$pkgdatadir/waves', 'README' ),
Alias('install', env.Install('$pkgdatadir/waves', findFiles('*.la'))) env.Install('$pkgdatadir/waves', findFiles('*.la'))):
env.Alias('install', n)

View File

@ -8,16 +8,19 @@ libmodule = SConscript('modules/SConscript')
libappl = SConscript('application/SConscript') libappl = SConscript('application/SConscript')
libback = SConscript('backend/SConscript') libback = SConscript('backend/SConscript')
env.ExtraDist(Split("""
capisuite-py/SConscript
modules/SConscript
application/SConscript
backend/SConscript
"""))
capisuite = env.Program('capisuite', capisuite = env.Program('capisuite',
['main.cpp', libappl, libmodule, libback, ]) ['main.cpp', libappl, libmodule, libback])
env.AddPostAction(capisuite, 'strip $TARGET') #env.AddPostAction(capisuite, 'strip $TARGET')
capisuite_conf = env.FileSubst('capisuite.conf', 'capisuite.conf.in') capisuite_conf = env.FileSubst('capisuite.conf', 'capisuite.conf.in')
install_exec = env.Install('$sbindir', capisuite) # -- install --
Alias('install-exec', install_exec) env.Alias('install-exec', env.Install('$sbindir', capisuite))
env.Alias('install', env.Install('$pkgsysconfdir', capisuite_conf))
Alias('install',
env.Install('$pkgsysconfdir', capisuite_conf),
install_exec,
)

View File

@ -14,14 +14,11 @@ def py_compile(target, source, env):
# substitute "pgksysconfdir" # substitute "pgksysconfdir"
env.FileSubst('config.py', 'config.py.in') env.FileSubst('config.py', 'config.py.in')
modules = [] modules = []
for mod in Split('__init__ config consts fax fileutils voice exceptions ' for mod in Split('__init__ config consts fax fileutils voice exceptions '
'core'): 'core'):
modules.append(mod+'.py') modules.append(mod+'.py')
modules.append(env.Command(mod + '.pyc', mod+'.py', py_compile)) modules.append(env.Command(mod + '.pyc', mod+'.py', py_compile))
install_pylib = env.Install('$pkgpython_moduledir', modules) env.Alias('install-pylib', env.Install('$pkgpython_moduledir', modules))
Alias('install-pylib',install_pylib)
Alias('install', install_pylib)

11
suse/SConscript Normal file
View File

@ -0,0 +1,11 @@
# -*- python -*-
Import('env')
specs = []
for f in Split('capisuite-mdk-9.2.spec'):
#env.ExtraDist(File(f, Dir('.')))
env.ExtraDist(f)
specs.append(env.FileSubst(f, '%s.in' % f))
#env.ExtraDist(specs)

View File

@ -0,0 +1,197 @@
#
# spec file for package capisuite
#
# Copyright (c) 2003 Gernot Hillier <gernot@hillier.de>
# Copyright (c) 2004 Hartmut Goebel <h.goebel@crazy-compilers.com>
#
# This file and all modifications and additions to the pristine
# package are under the same license as the package itself.
#
Name: capisuite
License: GPL
Group: Communications/ISDN
Version: @VERSION@
Release: @RELEASE@
Requires: python>=2.2 sox>=12.17.3 sfftobmp libtiff3-progs ghostscript
#Requires: libisdn4k-utils2-devel libpython2.3-devel
Requires: jpeg2ps
Summary: ISDN telecommunication suite providing fax and voice services
Source0: %{name}-%{version}.tar.gz
URL: http://www.capisuite.de/
BuildRoot: %{_tmppath}/%{name}-%{version}-build
%description
CapiSuite is an ISDN telecommunication suite providing easy to use
telecommunication functions which can be controlled from Python
scripts.
It uses a CAPI-compatible driver for accessing the ISDN-hardware, so
you'll need an AVM card with the according driver.
CapiSuite is distributed with two example scripts for call incoming
handling and fax sending. See /usr/share/doc/capisuite-%{version} for
further information.
Authors:
--------
Gernot Hillier
Hartmut Goebel
%prep
%setup
#./configure --localstatedir=/var --with-docdir=/usr/share/doc/%{name}-%{version}
#--prefix=%{_prefix} --exec-prefix=%{_exec_prefix} --bindir=%{_bindir} --sbindir=%{_sbindir} --sysconfdir=%{_sysconfdir} --datadir=%{_datadir} --includedir=%{_includedir} --libdir=%{_libdir} --libexecdir=%{_libexecdir} --localstatedir=%{_var} --mandir=%{_mandir}
scons prefix=%{_prefix} \
exec-prefix=%{_exec_prefix} \
bindir=%{_bindir} \
sbindir=%{_sbindir} \
sysconfdir=%{_sysconfdir} \
datadir=%{_datadir} \
includedir=%{_includedir} \
libdir=%{_libdir} \
libexecdir=%{_libexecdir} \
localstatedir=%{_var} \
sharedstatedir=%{_sharedstatedir} \
mandir=%{_mandir} \
infodir=%{_infodir} \
docdir=/usr/share/doc/%{name}-%{version} configure
%build
scons
#make
#strip src/capisuite
%install
scons INSTALL_BASE=$RPM_BUILD_ROOT install
builddir=build/
#make DESTDIR=$RPM_BUILD_ROOT install
install -Dm 644 cronjob.conf $RPM_BUILD_ROOT%{_sysconfdir}/capisuite/cronjob.conf
mkdir -p $RPM_BUILD_ROOT%{_initrddir}
mv $RPM_BUILD_ROOT%{_sysconfdir}/init.d/capisuite \
$RPM_BUILD_ROOT%{_initrddir}/capisuite
install -Dm 755 ${builddir}capisuite.cron $RPM_BUILD_ROOT%{_sysconfdir}/cron.daily/capisuite
gzip --recursive --best $RPM_BUILD_ROOT%{_mandir}
%clean
#rm -rf $RPM_BUILD_ROOT
%post
%_post_service capisuite
%preun
%_preun_service capisuite
%files
%defattr(-,root,root)
%config(noreplace) %{_sysconfdir}/capisuite/cronjob.conf
%config(noreplace) %{_sysconfdir}/capisuite/capisuite.conf
%config(noreplace) %{_sysconfdir}/capisuite/fax.conf
%config(noreplace) %{_sysconfdir}/capisuite/answering_machine.conf
#__RPM_FILES__
%{_sbindir}/capisuite
%{_sbindir}/capisuite-checkconfig
%{_bindir}/capisuitefax
%doc %{_defaultdocdir}/%name-%version
%doc %{_mandir}/*/*
%{_datadir}/capisuite
%{_libdir}/capisuite
%dir %{_var}/spool/capisuite
%{_var}/spool/capisuite/*
%{_libexecdir}/python2.?/site-packages/cs_helpers.py*
%dir %{_libexecdir}/python2.?/site-packages/capisuite
%{_libexecdir}/python2.?/site-packages/capisuite/*
%{_initrddir}/capisuite
%{_sysconfdir}/cron.daily/capisuite
%changelog -n capisuite
* Sun Jun 12 2004 Hartmut Goebel <h.goebel@crazy-compilers.com>
- updated for capisuite-pylib
- changed to use SCons build system
* Sun Nov 09 2003 Steffen Barszus <steffen@mandrakeuser.de>
- initial spec for mdk, taken mostly the SuSE spec of gernot
* Sun Jul 20 2003 - gernot@hillier.de
- updated to 0.4.3
* Sun Apr 27 2003 - gernot@hillier.de
- updated to 0.4.2
* Sat Apr 05 2003 - gernot@hillier.de
- updated to 0.4.1a (SECURITY FIX for cronjob, ...)
* Thu Mar 20 2003 - ghillie@suse.de
- updated to 0.4.1, thrown away all patches which are already
included in this release
* Thu Mar 13 2003 - ghillie@suse.de
- SECURITY FIX: permissions of saved documents and waves are 0600
now instead of 0644 and dirs have 0700 instead of 0755. This
fixes critical bug #25242. Bug severity was approved by kkeil.
* Mon Mar 10 2003 - ghillie@suse.de
- added current documentation as .tar.bz2 to avoid change of
Makefile so late (old Makefiles won't install new docs correctly)
* Mon Mar 03 2003 - ghillie@suse.de
- added capisuite-faxid.diff: fixes sending of fax station ID, fax
headline works now
* Sun Feb 23 2003 - ghillie@suse.de
- added capisuite-cron.diff: cron-script errors to /dev/null
* Fri Feb 21 2003 - ghillie@suse.de
- capisuite-removesetuid.diff: fixes Bugzilla 23732 (freeze because
of usage of setuid() which isn't allowed in threads)
- capisuite-cosmetical.diff: cosmetical fixes (examples in conf files
were wrong, removed debug output)
- added tiff & ghostscript-library to Requires: fixes Bug 23962
* Tue Feb 18 2003 - ghillie@suse.de
- fixed Bugzilla 23731 (lock files weren't deleted in idle.py)
* Mon Feb 17 2003 - ghillie@suse.de
- updated to 0.4 (new/old messages in remote inquiry, capisuitefax
can show sendqueue and abort jobs)
* Tue Feb 11 2003 - ghillie@suse.de
- included cron job for cleaning up
- rc.capisuite was moved into tar ball
* Mon Feb 10 2003 - ghillie@suse.de
- updated to 0.3.2 (got rid of CommonC++, using native pthreads now,
fixed some major bugs)
* Mon Feb 03 2003 - ghillie@suse.de
- updated to 0.3.1: (bugfixes, use different sendqueue for each user,
script improvements, e.g. sayNumber supports 0-99 well now)
* Wed Jan 29 2003 - ghillie@suse.de
- added sox to Require:
* Wed Jan 29 2003 - ghillie@suse.de
- don't start if no user configured for default scripts
- added insserv to %%post (spec file)
* Mon Jan 27 2003 - ghillie@suse.de
- included startup script
* Mon Jan 27 2003 - ghillie@suse.de
- updated to 0.3 (split configuration files into fax and
answering machine config)
* Thu Jan 23 2003 - ghillie@suse.de
- updated to 0.2.1 (mainly documentation improvements, has an own
manual now)
* Mon Jan 20 2003 - ghillie@suse.de
- updated to 0.2 (see included NEWS for changes)
- added correct docdir to configure call in specfile
* Mon Dec 16 2002 - gernot@hillier.de
- first package
* Mon Dec 16 2002 - gernot@hillier.de
- fixed 2 small bugs (physical disconnect was missing in some cases,
file delete in remote inquiry didn't work)