2 # \brief InstallIncludes builder
4 ## \package senfscons.InstallIncludes
5 # \brief Install all include files which some targets depend upon
9 import SCons.Builder, SCons.Action, SCons.Environment, SCons.Node.FS
11 from SCons.Tool.install import installFunc, stringFunc
13 installFunc = SCons.Environment.installFunc
14 stringFunc = SCons.Environment.installString
16 def recursiveChildren(f):
20 map(rv.setdefault,recursiveChildren(c.children()))
23 def filterIncludes(files, extensions):
24 return [ f for f in files
25 if f.get_suffix() in extensions ]
27 def filterDirectory(files, dir):
28 return [ f for f in files
29 if f.abspath.startswith(dir.abspath) ]
31 def excludeDirectories(files, dirs):
32 return [ f for f in files
33 if not [ True for d in dirs if files.abspath.startswith(dirs.abspath) ] ]
35 def emitter(target, source, env):
36 source = recursiveChildren(source)
37 source = filterIncludes(source, env['CPP_INCLUDE_EXTENSIONS'])
38 source = filterDirectory(source, env['INSTALL_BASE'])
39 source = excludeDirectories(source, env['INCLUDE_IGNORED_DIRECTORIES'])
41 # Build target file by appending the path of 'src' relative to INSTALL_BASE to target[0]
42 target = [ target[0].File(src.get_path(env.Dir(env['INSTALL_BASE'])))
45 return (target, source)
48 def __init__(self, target, source):
52 def __call__(self, target, source, env):
53 installFunc([self.target], [self.source], env)
55 def generator(target, source, env, for_signature):
56 return [ SCons.Action.Action( Installer(trg, src),
57 lambda a,b,c,s=stringFunc([trg], [src], env):s )
58 for trg, src in zip(target,source) ]
60 InstallIncludes = SCons.Builder.Builder(emitter = emitter,
61 generator = generator,
62 source_factory = SCons.Node.FS.Entry,
63 target_factory = SCons.Node.FS.Dir,
64 name = 'InstallIncludesBuilder',
68 env['BUILDERS']['InstallIncludes'] = InstallIncludes
69 env['INSTALL_BASE'] = '#'
70 env['INCLUDE_IGNORED_DIRECTORIES'] = []