28 from types
import ListType
32 import SCons.Scanner.C
36 SCons.Script.EnsureSConsVersion(0,96,92)
38 GchAction = SCons.Action.Action(
'$GCHCOM',
'$GCHCOMSTR')
39 GchShAction = SCons.Action.Action(
'$GCHSHCOM',
'$GCHSHCOMSTR')
41 def gen_suffix(env, sources):
42 return sources[0].get_suffix() + env[
'GCHSUFFIX']
45 GchShBuilder = SCons.Builder.Builder(action = GchShAction,
46 source_scanner = SCons.Scanner.C.CScanner(),
49 GchBuilder = SCons.Builder.Builder(action = GchAction,
50 source_scanner = SCons.Scanner.C.CScanner(),
53 def setup_dependency(target,source,env, key):
54 scanner = SCons.Scanner.C.CScanner()
55 path = scanner.path(env)
56 deps = scanner(source[0], env, path)
58 if env.has_key(key)
and env[key]:
59 for header
in env[key]:
60 header_path = header.path.strip(
'.gch')
61 if header_path
in [x.path
for x
in deps]:
62 print "Precompiled header(%s) %s \t <--- %s" % (key,header_path,source[0])
63 env.Depends(target, header)
66 def static_pch_emitter(target,source,env):
67 SCons.Defaults.StaticObjectEmitter( target, source, env )
68 setup_dependency(target,source,env, key=
'GCH')
69 return (target, source)
71 def shared_pch_emitter(target,source,env):
72 SCons.Defaults.SharedObjectEmitter( target, source, env )
73 setup_dependency(target,source,env, key=
'GCH-sh')
74 return (target, source)
78 """ Add builders and construction variables for the Gch builder. 80 env.Append(BUILDERS = {
83 target_factory = env.fs.File,
87 target_factory = env.fs.File,
92 bld = env[
'BUILDERS'][
'GCH']
93 bldsh = env[
'BUILDERS'][
'GCH-sh']
97 env[
'BUILDERS'][
'PrecompiledHeader'] = bld
98 env[
'BUILDERS'][
'PrecompiledHeaderShared'] = bldsh
100 env[
'GCHCOM'] =
'$CXX -o $TARGET -x c++-header -c $CXXFLAGS $_CCCOMCOM $SOURCE' 101 env[
'GCHSHCOM'] =
'$CXX -o $TARGET -x c++-header -c $SHCXXFLAGS $_CCCOMCOM $SOURCE' 102 env[
'GCHSUFFIX'] =
'.gch' 104 for suffix
in SCons.Util.Split(
'.c .C .cc .cxx .cpp .c++'):
105 env[
'BUILDERS'][
'StaticObject'].add_emitter( suffix, static_pch_emitter )
106 env[
'BUILDERS'][
'SharedObject'].add_emitter( suffix, shared_pch_emitter )
110 return env.Detect(
'g++')