我相信被接受的答案只适用于源目录是'.'
的情况。
这里有一个工作示例,其中源目录为src
,变体目录为build
。
文件布局
.
├── include
│ └── sum.h
├── SConstruct
└── src
├── dir
│ └── sum.cpp
└── main.cpp
Files
sum.h
#ifndef _SUM_H_
#define _SUM_H_
double sum(const double x, const double y);
#endif
main.cpp
#include <iostream>
#include <sum.h>
using namespace std;
int main() {
cout << "Sum of 1 and 2 = " << sum(1., 2.) << endl;
return 0;
}
sum.cpp
#include <sum.h>
double sum(const double x, const double y) {
return x + y;
}
SConstruct
import os
def variantglob(env, pattern, ondisk=True, source=True, strings=False,
recursive=False):
matches = []
for root, dirs, filenames in os.walk(env['SOURCE_DIR']):
cwd = Dir(os.path.join(env['VARIANT_DIR'],
os.path.relpath(root, env['SOURCE_DIR'])))
matches.extend(cwd.glob(pattern, ondisk, source, strings))
return matches
env = Environment()
env.Replace(VARIANT_DIR='build',
SOURCE_DIR='src')
env.Append(CPPPATH=['include'])
VariantDir(variant_dir=env['VARIANT_DIR'],
src_dir=env['SOURCE_DIR'], duplicate=0)
exe = env.Program(os.path.join(env['VARIANT_DIR'], 'example'),
variantglob(env, '*.cpp', recursive=True))
Install('bin', exe)
构建
在顶层目录执行scons
命令即可。这将创建一个build
目录,并将所有的临时文件(变体目录)放到其中,然后将构建结果安装到bin文件夹中。
运行
执行bin/example
命令以查看其运作情况。
注意
该示例在Linux上进行了测试。
为什么它有效
当使用变体目录进行构建时,您必须指定源路径,就好像它已经位于变体目录中一样,但这些目录可能不存在yet。该glob函数遍历源树来构造将在变量目录中的路径,然后对这些路径进行通配符匹配。
matches = Glob(matches)
不起作用,但是可以使用matches.append(Glob(os.path.join(root, filename)))
代替它。虽然这似乎不是最优的选择。 - Igor Chubin