【问题标题】:scons: objects, sources, executables, all in separate directoriesscons:对象、源代码、可执行文件,都在不同的目录中
【发布时间】:2013-10-30 12:55:20
【问题描述】:

我是 scons 的新手,我设法弄清楚如何将一个 (con) 脚本生成的二进制文件(可执行文件+对象)重定向到另一个目录。

在我的主项目目录(根目录)中,我有一个 SConstruct 文件,其中包含以下行:

SConscript("source/SConscript", variant_dir="bin")

显然,它将source/SConscript 脚本的构建(变体)目录设置为bin

source/SConscript:

common = []

env = Environment()
env.Program("test", ["test.cpp"] + common)
env.Program("sdl-test", ["sdl_test.cpp"] + common, LIBS=["SDL2"])

我目前的设置不太理想......

我想让所有的目标文件都放在object,把所有的源文件放在source,最后的程序二进制文件放在bin目录中。

如何使用 scons 实现这一目标? (最好不要弄乱命令式(常规)Python,我希望这是一个内置功能。)

【问题讨论】:

    标签: c++ python build compilation scons


    【解决方案1】:

    您可以通过为对象添加另一个 SConscript 脚本来实现,您将在其中将 variant_dir 设置为不同的目录,它看起来像这样:

    SConstruct

    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

    Import('env')
    
    env.Object("test.cpp")
    env.Object("sdl_test.cpp")
    

    来源/SConscript

    Import('env')
    
    env.Program("test", ["#/object/test.o"])
    env.Program("sdl-test", ["#/object/sdl_test.o"], LIBS=["SDL2"])
    

    或者,在 SConscript_obj 中,您可以创建一个库,而不仅仅是编译对象。

    您也可以考虑在现有的 SConscript 中添加对 VariantDir 的调用,但我不确定它的效果如何。

    【讨论】:

    • 为什么要导出/导入环境?
    • @yannbane 这只是一个好习惯。这样整个构建将使用相同的环境。如果您这样做,然后需要进行本地化更改,您可以克隆它:cloned_env = env.Clone()
    • @yannbane 另请注意“duplicate=0”参数。这也不是必需的,但正如我在这里,它不会将源代码复制到 variant_dir。
    • 好的,但是如果构建是在同一台机器上完成的,那么导出/导入有什么意义呢?每次调用Environment() 不会返回相同的对象吗?另外,感谢您提供的重复提示。
    • @yannbane 对 Environment() 的每次调用都会返回一个不同的对象,如果您在根 SConstruct 中的 env 上设置了一些东西(例如包含 pahts),那么这些值将不会在不同的 SConscript 中可见,除非env 被导出/导入。
    猜你喜欢
    • 1970-01-01
    • 2020-04-12
    • 2014-01-15
    • 2013-04-08
    • 2014-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-16
    相关资源
    最近更新 更多