例如:
/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和所有子目录。
提前感谢任何回复的人!
答案 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)列表理解很难让我理解: - )