SCons在所有目录中构建所有源文件

时间:2014-10-13 14:13:53

标签: scons

例如:

/project/SConstruct
/project/main.cpp
/project/folder/bar.h
/project/folder/bar.cpp
/project/folder/foo.h
/project/folder/foo.cpp

我希望SCons只需编译所有子目录中的所有源文件,而无需在每个子目录中添加SConscript文件。基本上我想在/ project中传递Glob('*.cpp') / project和所有子目录。

提前感谢任何回复的人!

4 个答案:

答案 0 :(得分:1)

正如Brady指出的那样," Glob()不是递归的#34;但也许我们可以创建一个递归的globber:

def AllSources(node='.', pattern='*'):
    result = [AllSources(dir, pattern)
              for dir in Glob(str(node)+'/*')
              if dir.isdir()]
    result += [source
               for source in Glob(str(node)+'/'+pattern)
               if source.isfile()]
    return result

env = Environment()
env.Program('program', source=AllSources('.', '*.c*'))

答案 1 :(得分:1)

除了使用Glob('*.cpp')进行导航之外,您还应该使用Glob('**/*.cpp)在子目录中查找并迭代接收到的文件。

答案 2 :(得分:0)

您可以从根SConstruct执行此操作,如下所示:

env = Environment()
env.Program(source=[Glob('*.cpp'), Glob('folder/*.cpp')], target='yourBinaryName')

您可能还需要按如下方式配置include目录:

env.Append(CPPPATH='folder')

记住Glob()不是递归的。

答案 3 :(得分:0)

一个适合我的递归globers

def GlobRecursive(pattern, node='.'):
    results = []
    for f in Glob(str(node) + '/*', source=True):
        if type(f) is SCons.Node.FS.Dir:
            results += GlobRecursive(pattern, f)
    results += Glob(str(node) + '/' + pattern, source=True)
    return results

Robᵩ的答案对我没有用,因为a)isdir()总是返回False(scons 2.5.1)和b)列表理解很难让我理解: - )