我相信只有当您的源目录是 '.' 时,接受的答案才有效。
这是一个工作示例,其中源目录为src,变体目录为build。
文件布局
.
├── include
│ └── sum.h
├── SConstruct
└── src
├── dir
│ └── sum.cpp
└── main.cpp
文件
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;
}
S构造
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
# Create Build Environment
env = Environment()
# Customize Environment
env.Replace(VARIANT_DIR='build',
SOURCE_DIR='src')
env.Append(CPPPATH=['include'])
# Setup Variant Directory
VariantDir(variant_dir=env['VARIANT_DIR'],
src_dir=env['SOURCE_DIR'], duplicate=0)
# Build the executable
exe = env.Program(os.path.join(env['VARIANT_DIR'], 'example'),
variantglob(env, '*.cpp', recursive=True))
# Install the executable
Install('bin', exe)
构建
只需在顶级目录执行scons。这将创建一个build 目录并将所有临时文件放在那里(变体目录),然后它将构建的结果安装到 bin 文件夹中。
运行
执行 bin/example 以查看它的工作原理。
注意
这个例子是在 linux 上测试的。
为什么会起作用
使用变体目录构建时,您必须指定源的路径,就好像它已经位于变体目录中一样,但这些目录可能不存在还。这个 glob 函数遍历源代码树以构造 在变体目录中的路径,然后针对这些路径进行 glob。