我有时想从 SCons 的 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])
但这是相当丑陋的,如果有多个文件需要过滤掉,那就更丑陋了。
有没有更清晰的方法来做到这一点?
我厌倦了重复[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
参数而不是简单的文件名列表,但这很适合我当前的需求。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)