【问题标题】:Implicit List of All Build Targets in SCONS?SCONS中所有构建目标的隐式列表?
【发布时间】:2010-08-24 18:27:26
【问题描述】:

我有一个 scons 项目,它强制包含几个头文件作为编译器标志。

# Forced include files passed directly to the compiler
env.Append(CCFLAGS = ['/FIinclude.h'])

项目中的任何文件都不包含这些文件。我需要为它们添加一个明确的依赖关系。

forced_include_headers = ['include.h']

# Trying to add an explicit dependency for each build target
for object in BUILD_TARGETS:
  env.Depends(object, forced_include_headers)

我遇到的问题是BUILD_TARGETS 列表是空的。它似乎只包含从COMMAND_LINE_TARGETSDEFAULT_TARGETS 传递的东西。我们项目中的所有目标都是隐式构建的。我们不使用env.Default等。有没有办法获取隐式目标列表,还是我必须手动构建它?我注意到TARGETS 是保留的,似乎也不包含我想要的内容。

我可以为它们各自的 SConscript 文件中的所有目标添加一个env.Depends(target, forced_include_headers),但该项目非常大。

【问题讨论】:

  • 我最终通过为项目中的每个目标调用一个 psuedo-builder 来解决这个问题(无论如何都需要这样做)。在对 psuedo-builder 的调用中添加了依赖项。

标签: c++ scons


【解决方案1】:

我不确定这是否是解决问题的最佳方法(实际上,我认为创建伪构建器的想法效果更好),但这段代码将返回Object 目标列表:

# Typical SConstruct / SConscript
env = Environment()
env.Program('foo.c')
lib = env.SharedLibrary('bar.c')
env.Program('foo2.c', LIBS=[lib])
SConscript('subdir/SConscript', exports={'env':env})

# Get a list of all Object targets
def get_all_targets(env, node='.'):
    def get_all_targets_iter(env, node):
        if node.has_builder() and node.get_builder().get_name(env) in ('Object', 'SharedObject'):
            yield node
        for kid in node.all_children():
            for kid in get_all_targets(env, kid):
                yield kid
    node = env.arg2nodes(node, env.fs.Entry)[0]
    return list(get_all_targets_iter(env, node))

# Force them all to depend upon some header
env.Depends(get_all_targets(env), 'site_wide.h')

【讨论】:

    猜你喜欢
    • 2010-12-25
    • 1970-01-01
    • 1970-01-01
    • 2010-10-16
    • 1970-01-01
    • 1970-01-01
    • 2014-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多