如何过滤SCons Glob结果?

时间:2012-09-20 18:30:58

标签: scons

我有时想要从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])

但是这很丑陋,如果要过滤掉多个文件,那就更加丑陋了。

有更明确的方法吗?

2 个答案:

答案 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