From 32dd0e661ae59be6dd3210c0cf8caeb1cacc1d3f Mon Sep 17 00:00:00 2001 From: Ichthyostega Date: Thu, 21 Aug 2008 09:59:24 +0200 Subject: [PATCH] replace the homebrew GCH-builder by a lib solution --- SConstruct | 32 ++++++----- admin/scons/BuilderGCH.py | 111 +++++++++++++++++++++++++++++++++++++ admin/scons/Buildhelper.py | 19 ------- 3 files changed, 128 insertions(+), 34 deletions(-) create mode 100644 admin/scons/BuilderGCH.py diff --git a/SConstruct b/SConstruct index 3a77f0cce..421502159 100644 --- a/SConstruct +++ b/SConstruct @@ -21,13 +21,6 @@ # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ##################################################################### -import sys -sys.path.append("./admin/scons") - -import os -from Buildhelper import * -from LumieraEnvironment import * - #-----------------------------------Configuration OPTIONSCACHEFILE = 'optcache' @@ -37,6 +30,7 @@ BINDIR = 'bin' TESTDIR = 'tests' ICONDIR = 'icons' VERSION = '0.1+pre.01' +TOOLDIR = './admin/scons' SVGRENDERER = 'admin/render-icon' #-----------------------------------Configuration @@ -47,6 +41,14 @@ SVGRENDERER = 'admin/render-icon' +import os +import sys + +sys.path.append(TOOLDIR) + +from Buildhelper import * +from LumieraEnvironment import * + ##################################################################### @@ -57,7 +59,10 @@ def setupBasicEnvironment(): EnsureSConsVersion(0,96,90) opts = defineCmdlineOptions() - env = LumieraEnvironment(options=opts) + env = LumieraEnvironment(options=opts + ,toolpath = [TOOLDIR] + ,tools = ["default", "BuilderGCH"] + ) env.Append ( CCCOM=' -std=gnu99') # workaround for a bug: CCCOM currently doesn't honor CFLAGS, only CCFLAGS env.Replace( VERSION=VERSION @@ -70,7 +75,6 @@ def setupBasicEnvironment(): ) RegisterIcon_Builder(env,SVGRENDERER) - RegisterPrecompiledHeader_Builder(env) handleNoBugSwitches(env) env.Append(CPPDEFINES = '_GNU_SOURCE') @@ -278,6 +282,10 @@ def defineBuildTargets(env, artifacts): setup sub-environments with special build options if necessary. We use a custom function to declare a whole tree of srcfiles. """ + # use PCH to speed up building + env['GCH'] = ( env.PrecompiledHeader('$SRCDIR/pre.hpp') + + env.PrecompiledHeader('$SRCDIR/pre_a.hpp') + ) objback = srcSubtree(env,'$SRCDIR/backend') objproc = srcSubtree(env,'$SRCDIR/proc') @@ -290,12 +298,6 @@ def defineBuildTargets(env, artifacts): + env.StaticLibrary('$BINDIR/lumi.la', objlib) ) - # use PCH to speed up building -# precomp = ( env.PrecompiledHeader('$SRCDIR/pre') -# + env.PrecompiledHeader('$SRCDIR/pre_a') -# ) -# env.Depends(objproc, precomp) -# env.Depends(objlib, precomp) artifacts['lumiera'] = env.Program('$BINDIR/lumiera', ['$SRCDIR/main.cpp']+ core ) artifacts['plugins'] = env.SharedLibrary('$BINDIR/lumiera-plugin', objplug) diff --git a/admin/scons/BuilderGCH.py b/admin/scons/BuilderGCH.py new file mode 100644 index 000000000..a8e0eb95c --- /dev/null +++ b/admin/scons/BuilderGCH.py @@ -0,0 +1,111 @@ +# -*- python -*- +## +## BuilderGCH.py - SCons builder for gcc's precompiled headers +## + +# Copyright (C) scons.org/wiki/GchBuilder +# 2006 Tim Blechmann +# 2008 Hermann Vosseler +# +# 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 2 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, write to the Free Software +# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +##################################################################### + +# history: 8/2008 adapted for Lumiera build system +# changed to accept a list of precompiled header defs + + +from types import ListType + +import SCons.Action +import SCons.Builder +import SCons.Scanner.C +import SCons.Util +import SCons.Script + +SCons.Script.EnsureSConsVersion(0,96,92) + +GchAction = SCons.Action.Action('$GCHCOM', '$GCHCOMSTR') +GchShAction = SCons.Action.Action('$GCHSHCOM', '$GCHSHCOMSTR') + +def gen_suffix(env, sources): + return sources[0].get_suffix() + env['GCHSUFFIX'] + + +GchShBuilder = SCons.Builder.Builder(action = GchShAction, + source_scanner = SCons.Scanner.C.CScanner(), + suffix = gen_suffix) + +GchBuilder = SCons.Builder.Builder(action = GchAction, + source_scanner = SCons.Scanner.C.CScanner(), + suffix = gen_suffix) + +def setup_dependency(target,source,env, key): + scanner = SCons.Scanner.C.CScanner() + path = scanner.path(env) + deps = scanner(source[0], env, path) + + if env.has_key(key) and env[key]: + for header in env[key]: + header_path = header.path.strip('.gch') + if header_path in [x.path for x in deps]: + print "Precompiled header(%s) %s \t <--- %s" % (key,header_path,source[0]) + env.Depends(target, header) + + +def static_pch_emitter(target,source,env): + SCons.Defaults.StaticObjectEmitter( target, source, env ) + setup_dependency(target,source,env, key='GCH') + return (target, source) + +def shared_pch_emitter(target,source,env): + SCons.Defaults.SharedObjectEmitter( target, source, env ) + setup_dependency(target,source,env, key='GCH-sh') + return (target, source) + +def generate(env): + """ + Add builders and construction variables for the Gch builder. + """ + env.Append(BUILDERS = { + 'gch': env.Builder( + action = GchAction, + target_factory = env.fs.File, + ), + 'gchsh': env.Builder( + action = GchShAction, + target_factory = env.fs.File, + ), + }) + + try: + bld = env['BUILDERS']['GCH'] + bldsh = env['BUILDERS']['GCH-sh'] + except KeyError: + bld = GchBuilder + bldsh = GchShBuilder + env['BUILDERS']['PrecompiledHeader'] = bld + env['BUILDERS']['PrecompiledHeaderShared'] = bldsh + + env['GCHCOM'] = '$CXX -o $TARGET -x c++-header -c $CXXFLAGS $_CCCOMCOM $SOURCE' + env['GCHSHCOM'] = '$CXX -o $TARGET -x c++-header -c $SHCXXFLAGS $_CCCOMCOM $SOURCE' + env['GCHSUFFIX'] = '.gch' + + for suffix in SCons.Util.Split('.c .C .cc .cxx .cpp .c++'): + env['BUILDERS']['StaticObject'].add_emitter( suffix, static_pch_emitter ) + env['BUILDERS']['SharedObject'].add_emitter( suffix, shared_pch_emitter ) + + +def exists(env): + return env.Detect('g++') diff --git a/admin/scons/Buildhelper.py b/admin/scons/Buildhelper.py index 4b05166d1..38940424c 100644 --- a/admin/scons/Buildhelper.py +++ b/admin/scons/Buildhelper.py @@ -151,25 +151,6 @@ def RegisterIcon_Builder(env, renderer): -def RegisterPrecompiledHeader_Builder(env): - """ Registeres an Custom Builder for generating a precompiled Header. - Note you should define a dependency to the PCH file - """ - def genCmdline(source, target, env, for_signature): - return '$CXXCOM -x c++-header %s' % source[0] - def fixSourceDependency(target, source, env): - print "precompiled header: %s --> %s" % (source[0],target[0]) - return (target, source) - - gchBuilder = env.Builder( generator = genCmdline - , emitter = fixSourceDependency - , suffix = '.gch' - , src_suffix = '.hpp' - ) - env.Append(BUILDERS = {'PrecompiledHeader' : gchBuilder}) - - - def Tarball(env,location,dirs,suffix=''): """ Custom Command: create Tarball of some subdirs location: where to create the tar (may optionally include filename.tar.gz)