使用SCons构建相对于src /目录

时间:2013-05-04 14:56:21

标签: scons

我有一个带有以下内容的应用程序(我认为很常见)目录层次结构:

/src
    subdir1/  # Subdirs with more source files.
        more.c
        SConscript
    foo.c     # Source files.
    foo.h
    SConscript
/other        # Other top-level directories with no source code.
/stuff        # However, there are other assets I may want to build.
README        # Other top-level files.
SConstruct

问题在于,当我从顶级目录运行scons时,它会从gcc cd调用该src目录中的gcc -o src/foo.o src/foo.c ,如下所示:< / p>

#include

由于以下几个原因,这是有问题的:

  1. 在我的程序中,我src个文件提供了相对于more.c目录的路径。例如,foo.h可以包含#include "foo.h"#include "src/foo.h"。这会失败,因为GCC是从父目录运行的。我不想将我的包含更改为__FILE__
  2. 我使用src/特殊宏来记录日志。当从顶级目录构建时,GCC将“src”放在所有文件名的前面,因为那是它被编译的路径。这可能看起来很挑剔,但我不希望这样,因为我认为我的源代码树是相对于-Isrc目录的。
  3. 编辑:我应该补充一点,显然可以通过将cd作为标志添加到GCC来修复#1,但这似乎是围绕主要问题的更多黑客攻击。)

    如何在调用src之前将SCons gcc放入src目录?

    • 我不想摆脱cd目录并移动所有内容,因为顶级有很多其他(非代码)文件。
    • 我不希望SCons到cd进入每个子目录。它应该src进入SConscript,然后从那里构建层次结构中的所有文件。
    • 我可以通过在src目录中移动Makefile并从那里运行它来解决这个问题,也许可以在顶层使用src。但是这看起来很糟糕,而且我也想使用SCons在Builder之外的其他目录中构建(非代码)资产。

    我已经读过您可以创建自定义Builder并使其更改目录。但是,我不想为C / C ++编写全新的Builder。有没有办法修改现有构建器的行为而无需从头开始编写一个?此外,在一个论坛上,有人说从{{1}}内更改目录会破坏并行构建,因为它会更改其他任务正在构建的目录。这是真的吗?

1 个答案:

答案 0 :(得分:3)

此行为正是SCons的工作方式,并且无法避免/更改。我一直在寻找一些有利于它的支持文档,并没有发现任何。它只是我习惯的东西。

如您所述,包含路径很容易修复。更难的部分是__FILE__宏。直到你提到它,我才注意到这一点。不幸的是,我认为解决这个问题的唯一方法是剥离记录器中的路径,这是一个相当难看的修复。