replace the homebrew GCH-builder by a lib solution

This commit is contained in:
Fischlurch 2008-08-21 09:59:24 +02:00
parent 616d522ea9
commit 32dd0e661a
3 changed files with 128 additions and 34 deletions

View file

@ -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)

111
admin/scons/BuilderGCH.py Normal file
View file

@ -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 <Ichthyostega@web.de>
#
# 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++')

View file

@ -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)