【问题标题】:Building relative to src/ directory with SCons使用 SCons 相对于 src/ 目录构建
【发布时间】:2013-05-04 14:56:20
【问题描述】:

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

/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

这有几个原因:

  1. 在我的程序中,我的#include 文件给出了相对于src 目录的路径。例如,more.c 可以包括 foo.h 和 #include "foo.h"。这失败了,因为 GCC 是从父目录运行的。我不想将包含更改为 #include "src/foo.h"。
  2. 我使用__FILE__ 特殊宏来处理诸如日志记录之类的事情。当从顶级目录构建时,GCC 将“src/”放在所有文件名的前面,因为那是给它编译的路径。这可能看起来很挑剔,但我不希望这样,因为我认为我的源代码树是相对于 src 目录的。

(编辑:我应该补充一点,显然可以通过将-Isrc 添加为 GCC 的标志来修复#1,但这似乎是围绕主要问题的更多黑客攻击。)

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

  • 我不想摆脱 src 目录并将所有内容向上移动,因为顶层还有很多其他(非代码)文件。
  • 我不希望 SCons 将cd 放入每个子目录。它应该只是将cd 转换为src,然后从那里构建层次结构中的所有文件。
  • 我可以通过将SConscript 移动到src 目录中并从那里运行它来解决这个问题,也许在顶层使用Makefile。但这似乎很 hacky,而且我也确实想使用 SCons 在 src 以外的其他目录中构建(非代码)资产。

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

【问题讨论】:

标签: scons


【解决方案1】:

这种行为正是 SCons 的工作方式,无法避免/改变。我一直在寻找一些有利于它的支持文件,但还没有找到。这只是我已经习惯的东西。

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

【讨论】:

  • 感谢您确认我的怀疑。好吧,我已经更新了我的记录器,以便它去掉整个路径,只显示文件名(这可能更好,因为日志看起来更清晰,如果需要,你通常可以猜测路径)。我想我现在可以忍受这个了:)
猜你喜欢
  • 1970-01-01
  • 2014-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多