capisuite/SConstruct

500 lines
16 KiB
Python
Raw Permalink Normal View History

# -*- mode: python ; coding: latin-1 -*-
#
# This file and all modifications and additions to the pristine
# package are under the same license as the package itself.
#
"""
Main SCons build script for CapiSuite
(c) Copyright 2004 by Hartmut Goebel <h.goebel@crazy-compilers.com>
CapiSuite is (c) Copyright by Gernot Hillier <gernot@hillier.de>
Use 'scons --help' for a list of available options.
Options have only to be given once, since they are cached in a file
'options.cache'. To change an option, simply pass it again with a
different value.
Example:
scons prefix=/ # build for prefix=/
scons # prefix=/ is taken from 'options.cache'
scons prefix=/usr/local # build for prefix=/usr/local
# since this is the default, the entry in
# options.cache will be removed
scons # default prefix is used
WARNING: This build method is not yet officially supported for
CapiSuite. Please use the usual 'configure; make; make install'
triplet instead!
"""
__targets__ = """
Additional targets:
configure : build the 'configure' script
(this is automatically done if 'config.h' is missing)
pycheck : check Python sources with PyChecker (not yet implemented)
install : install all files
install-pylib : install only the python library
install-scripts : install only the python scripts
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
"""
## 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<><6C>t selten gebaute File stehen
## maintainer-clean: clean + bison-output, info-files, tag tables, etc.
## check: perform self-test
##
## TAGS, info, dvi,
## installcheck, installdirs
###---####---###---####---###---####---###---####---###---####---###---###
# some Pythonic setup
import sys, os, os.path, glob
import SCons.Util, SCons.Script
import SCons.Node.FS
# Store signatures in ".sconsign.dbmlite" in the top-level directory.
SConsignFile()
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):
"""Install specified files in the given directory."""
dir = self.arg2nodes(dir, self.BasedDir)
files = Environment.Install(self, dir, source)
self.DistSourcesOf(files)
return files
def InstallAs(self, target, source):
"""Install sources as targets."""
target = self.arg2nodes(target, self.BasedFile)
files = Environment.InstallAs(self, target, source)
self.DistSourcesOf(files)
return files
def DistSourcesOf(self, files):
"""
Add all sourcefiles of the given files to the distribution archive.
"""
files = self.arg2nodes(files, self.File)
files = map(self.DistSourceOfFile, files)
#self.DistTar('$DIST_ARCHIVE', files)
self.Append(DIST_FILES=files)
return files
def ExtraDist(self, files):
"""Additional files to be distributed."""
files = self.arg2nodes(files, self.File)
#self.DistTar('$DIST_ARCHIVE', files)
self.Append(DIST_FILES=files)
return files
_valid_man_extensions = '0123456789ln' # from info automake
def mandir(self, section):
section = str(section)
assert section in self._valid_man_extensions, section # todo: error msg
return os.path.join('$mandir', 'man%s' % section)
def InstallMan(self, source, section=None):
"""
Install man pages.
If 'section' is given, file extensions are changed to 'section'.
Otherwise, the section is taken from file extension.
"""
source = self.arg2nodes(source, self.File)
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
#
# Support functions for linking with Python
#
def GetPythonModuleSetup(env):
"""
Get configuration for linking with the Python library.
"""
import distutils.sysconfig
from distutils.sysconfig import get_python_lib, get_config_vars, \
get_config_var
env.Append(
python_version = distutils.sysconfig.get_python_version(),
python_prefix = distutils.sysconfig.PREFIX,
python_execprefix = distutils.sysconfig.EXEC_PREFIX,
python_libdir = get_python_lib(plat_specific=1, standard_lib=1),
python_moduledir = get_python_lib(plat_specific=0, standard_lib=0),
python_moduleexecdir = get_python_lib(plat_specific=1, standard_lib=0),
python_includespec = get_config_vars('INCLUDEPY', 'CONFINCLUDEPY'),
python_linkforshared = get_config_var('LINKFORSHARED'),
pkgpython_moduledir = '${python_moduledir}/${PACKAGE}',
pkgpython_moduleexecdir = '${python_moduleexecdir}/${PACKAGE}',
LINKFLAGS = ['${python_linkforshared}'],
LIBS = ['python${python_version}'],
)
env.Append(
CPPPATH = env['python_includespec'],
PYTHON = sys.executable,
)
def GetPythonEmbeddedSetup(env):
"""
Get configuration for linking an embedded Python application.
"""
# Base idea on which variable to check are from the INN 2.3.1 package
import distutils.sysconfig
print 'Checking how to link an embedded Python application:',
libvars = Split("LIBS LIBC LIBM LOCALMODLIBS BASEMODLIBS")
python_libspec = []
for libvar in distutils.sysconfig.get_config_vars(*libvars):
libvar = libvar.split()
for lib in libvar:
# sanity check
if not lib.startswith('-l'):
print "Error in Python Makefile: shared lib spec does ", \
"not start with '-l':", lib
python_libspec.append(lib[2:])
env.Append(python_libspec = python_libspec,
python_configdir = distutils.sysconfig.get_config_var('LIBPL'),
# preferable these should be '$python..', but SCons
# doe not yet support this (SCons 0.94)
LIBS = python_libspec,
LIBPATH = ['${python_configdir}'],
)
print ' '.join(python_libspec)
#print '>>>', env['LIBS']
def Get_sfftobmp_Version(context):
"""
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 or
'rpms' 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',
SVNREPOSITORY = 'https://h3281.serverkompetenz.net/repos/capisuite/',
# 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}',
# Distribution of files and sources:
DIST_ARCHIVE = '#/dist/${PACKAGE}-${VERSION}.tar.gz',
DIST_FILES = [],
# 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)
GetPythonEmbeddedSetup(env)
Get_sfftobmp_Version(env)
# get some build variables we always need to evaluate,
# even for non-building targets.
GetPythonModuleSetup(env)
###---####---###---####---###---####---###---####---###---####---###---###
env.Append(
CCFLAGS = Split('-g -O2'),
# these should go into src/SConscript:
LIBS = Split('pthread capi20'),
CPPDEFINES={'LOCALSTATEDIR': r'\"${localstatedir}\"',
'PKGDATADIR' : r'\"${pkgdatadir}\"',
'PKGSYSCONFDIR': r'\"${pkgsysconfdir}\"',
'PKGLIBDIR' : r'\"${pkglibdir}\"',
'HAVE_CONFIG_H': 1, # we always have config.h
},
)
## # build debug?
## if ARGUMENTS.get('debug', 0):
## env.Append(CXXFLAGS = ['-g', '-DDEBUG'])
## else:
## env.Append(CXXFLAGS = ['-O2'])
##
## if env['CXX'] in ('g++', 'c++'):
## env.Append(CXXFLAGS = ['-Wall', '-Wno-non-virtual-dtor'])
###---####---###---####---###---####---###---####---###---####---###---###
#
# Build everything defined in the 'Sconscript' files.
#
env.SConscript(dirs=[Dir('.', build_dir),
Dir('src', build_dir),
Dir('scripts', build_dir),
Dir('scripts/waves', build_dir),
Dir('docs', build_dir),
Dir('packages/rpm'),
])
#--- additional files to be distributed ---
env.ExtraDist(Split("""
ChangeLog.2003 ChangeLog.2004
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
packages/rpm/SConscript
docs/SConscript
"""))
# ChangeLog and ChangeLog.complete are build in 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.CVS('pserver:anonymous@cvs.capisuite.berlios.de:/cvsroot/capisuite',
# 'capisuite'))
"""
make DESTDIR=$RPM_BUILD_ROOT install
mkdir -p $RPM_BUILD_ROOT/usr/sbin
ln -sf ../../etc/init.d/capisuite $RPM_BUILD_ROOT/usr/sbin/rccapisuite
"""
###---####---###---####---###---####---###---####---###---####---###---###
#
# Install targets
#
for d in (
'${localstatedir}/log',
'${spooldir}/sendq',
'${spooldir}/done',
'${spooldir}/failed',
'${spooldir}/users',
):
d = env.BasedDir(d)
if not d.exists():
d = env.Command(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_ARCHIVE', env['DIST_FILES'])[0]
env.Alias('dist', dist)
###---####---###---####---###---####---###---####---###---####---###---###
#
# '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)],
['packages/rpm/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'],
]))