scons的。用Glob递归递归

时间:2012-05-15 09:39:50

标签: scons

我使用scons几天而且有点困惑。为什么没有内置工具从给定的根开始递归地构建源?让我解释: 我有这样的来源性格:

src
    Core
       folder1
       folder2
           subfolder2_1
    Std
       folder1

..等等。这棵树可能会更深。

现在我用这样的结构构建它:

sources = Glob('./builds/Std/*/*.cpp')
sources = sources + Glob('./builds/Std/*.cpp')
sources = sources + Glob('./builds/Std/*/*/*.cpp')
sources = sources + Glob('./builds/Std/*/*/*/*.cpp')

这看起来并不那么完美。当然,我可以编写一些python代码,但是 有更合适的方法吗?

4 个答案:

答案 0 :(得分:9)

正如Torsten所说,SCons中没有“内部”递归Glob()。你需要自己写点东西。我的解决方案是:

import fnmatch
import os

matches = []
for root, dirnames, filenames in os.walk('src'):
  for filename in fnmatch.filter(filenames, '*.c'):
    matches.append(Glob(os.path.join(root, filename)[len(root)+1:]))

我想强调你在这里需要Glob()(而不是python中的glob.glob()),特别是当你使用VariantDir()时。此外,当您使用VariantDir()时,不要忘记将绝对路径转换为相对路径(在示例中,我使用[len(root)+1:]实现此目的)。

答案 1 :(得分:5)

不确定。 你需要编写python包装器来遍历dirs。您可以在stackoverflow上找到许多食谱。 这是我的简单函数,它返回当前目录中的子目录列表(并忽略以'。'开头的隐藏目录 - - 点)

def getSubdirs(abs_path_dir) :  
    lst = [ name for name in os.listdir(abs_path_dir) if os.path.isdir(os.path.join(abs_path_dir, name)) and name[0] != '.' ]
    lst.sort()
    return lst

例如,我的dir模块包含foo,bar,ice。

corePath = 'abs/path/to/modules'
modules = getSubdirs(corePath)
# modules = [bar, foo, ice]
for module in modules :
  sources += Glob(os.path.join(corePath, module, '*.cpp'))

您可以改进getSubdirs函数,添加递归并深入到子目录。

答案 2 :(得分:2)

Glob()SCons函数无法递归。

如果更改Python代码以使用list.extend()函数,效率会更高,如下所示:

sources = Glob('./builds/Std/*/*.cpp')
sources.extend(Glob('./builds/Std/*.cpp'))
sources.extend(Glob('./builds/Std/*/*/*.cpp'))
sources.extend(Glob('./builds/Std/*/*/*/*.cpp'))

不是像你一样尝试递归,而是在每个子目录和根SConstruct中都有一个SConscript脚本,并使用SConscript()函数调用它们。这称为SCons hierarchical build

答案 3 :(得分:1)

我用这个:

srcdir = './'
sources = [s for s in glob2.glob(srcdir + '**/*.cpp') if "/." not in s]