我有一个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_TARGETS
或DEFAULT_TARGETS
传递的内容。我们项目中的所有目标都是隐式构建的。我们没有使用env.Default
等。有没有办法获得隐式目标列表,还是我必须手动构建它?我注意到TARGETS
是保留的,似乎不包含我想要的内容。
我可以为各自的SConscript文件中的所有目标添加env.Depends(target, forced_include_headers)
,但项目非常大。
答案 0 :(得分:0)
我不确定这是解决问题的最佳方法(实际上,我认为创建伪构建器的想法效果更好),但此代码将返回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')