如何过滤 SCons Glob 结果?

2024-01-10

我有时想从 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(使用前将#替换为@)

如何过滤 SCons Glob 结果? 的相关文章

随机推荐