关于 c :scons: 对象、源代码、可执行文件,都在不同的目录中
scons: objects, sources, executables, all in separate directories
我是 scons 的新手,我设法弄清楚如何将一个 (con) 脚本生成的二进制文件(可执行对象)重定向到另一个目录。
在我的主项目目录(根目录)中,我有一个
|
1
|
SConscript("source/SConscript", variant_dir="bin")
|
显然,它将
|
1
2 3 4 5 |
common = []
env = Environment() |
我目前的设置不太理想...
我希望所有的目标文件都在
如何使用 scons 实现这一目标? (最好不要弄乱命令式(常规)Python,我希望这是一个内置功能。)
您可以通过为对象添加另一个 SConscript 脚本来做到这一点,您将在其中将 variant_dir 设置为不同的目录,它看起来像这样:
S构造
|
1
2 3 4 5 |
env = Environment()
SConscript('source/SConscript_obj', variant_dir='object', duplicate=0, exports='env') SConscript('source/SConscript', variant_dir='bin', duplicate=0, exports='env') |
源/SConscript_obj
|
1
2 3 4 |
Import('env')
env.Object("test.cpp") |
来源/SConscript
|
1
2 3 4 |
Import('env')
env.Program("test", ["#/object/test.o"]) |
或者,在 SConscript_obj 中,您可以创建一个库,而不仅仅是编译对象。
您也可以考虑在现有的 SConscript 中添加对 VariantDir 的调用,但我不确定它的效果如何。
相关讨论
- 为什么要导出/导入环境?
- @yannbane 这只是一个好习惯。这样整个构建将使用相同的环境。如果您这样做,然后需要进行本地化更改,您可以克隆它: cloned_env = env.Clone()
- @yannbane 还要注意"duplicate=0"参数。这也不是必需的,但正如我在这里拥有的那样,它不会将源代码复制到 variant_dir。
-
好的,但是如果构建是在同一台机器上完成的,那么导出/导入有什么意义呢?每个对
Environment() 的调用不会返回相同的对象吗?另外,感谢您提供的重复提示。 - @yannbane 对 Environment() 的每次调用都会返回一个不同的对象,如果您在根 SConstruct 中的 env 上设置了一些东西(例如包含 pahts),那么这些值将不会在不同的 SConscript 中可见,除非该 env 被导出/导入。
-
还有另一个问题,`"#/object/..." 中的
# 到底是什么? - @yannbane 在 SCons 中,"#"字符表示路径相对于根 SConstruct 脚本。