我有时想要从SCon中的Glob结果中排除某些源文件。通常是因为我想用不同的选项编译该源文件。像这样:
objs = env.Object(Glob('*.cc'))
objs += env.Object('SpeciallyTreatedFile.cc', CXXFLAGS='-O0')
当然,这会给SCons带来问题:
scons: *** Two environments with different actions were specified
for the same target: SpeciallyTreatedFile.o
我通常使用以下习语来解决这个问题:
objs = env.Object([f for f in Glob('*.cc')
if 'SpeciallyTreatedFile.cc' not in f.path])
但是这很丑陋,如果要过滤掉多个文件,那就更加丑陋了。
有更明确的方法吗?
答案 0 :(得分:7)
我厌倦了在几个地方重复[f for f in Glob ...]
表达式,所以我编写了以下帮助方法并将其添加到构建环境中:
import os.path
def filtered_glob(env, pattern, omit=[],
ondisk=True, source=False, strings=False):
return filter(
lambda f: os.path.basename(f.path) not in omit,
env.Glob(pattern))
env.AddMethod(filtered_glob, "FilteredGlob");
现在我可以写
objs = env.Object(env.FilteredGlob('*.cc',
['SpeciallyTreatedFile.cc', 'SomeFileToIgnore.cc']))
objs += env.Object('SpeciallyTreatedFile.cc', CXXFLAGS='-O0')
使用这种模式很容易编写类似的东西,例如使用正则表达式过滤器作为omit
参数而不是简单的文件名列表,但这适用于我当前的需求。
答案 1 :(得分:0)
这是一个古老的问题,但由于仍会出现在搜索结果中,因此值得更新。
SCons 2.3.5在 <Button
onClick={props.deleteCard.bind(null, props.i)}
aria-label='Remove Card'
disabled={props.isLoading || props.particles.length > 1}>
<Icon name='trash' aria/>
</Button>
中引入了exclude
关键字参数,因此以下内容现在有效:
Glob
由于objs = env.Object(Glob('*.cc'), exclude=['SpeciallyTreatedFile.cc'])
objs += env.Object('SpeciallyTreatedFile.cc', CXXFLAGS='-O0')
包含一个列表,因此可以包括许多排除项,并且排除列表本身可能包含与通配符相同的通配符。用户文档列出了以下示例:
exclude