我有一个具有以下(我认为很常见)目录层次结构的应用程序:
/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
这是有问题的,原因有几个:
- 在我的程序中,我
#include
文件给出了相对于src
目录的路径。例如,more.c
可以包括foo.h
with#include "foo.h"
。这失败了,因为 GCC 是从父目录运行的。我不想将我的包含更改为#include "src/foo.h"
. - 我将
__FILE__
特殊宏用于日志记录之类的事情。当从顶级目录构建时,GCC 将“src/
”放在所有文件名的前面,因为那是它被赋予编译的路径。这可能看起来很挑剔,但我不希望这样,因为我认为我的源代码树是相对于src
目录的。
(编辑:我应该补充一点,显然#1可以通过将-Isrc
作为标志添加到GCC来修复,但这似乎是围绕主要问题的更多黑客攻击。)
如何在调用之前将 SConscd
放入目录?src
gcc
- 我不想摆脱
src
目录并向上移动所有内容,因为顶层还有很多其他(非代码)文件。 - 我不希望 SCons
cd
进入每个子目录。它应该只是cd
进入src
然后从那里构建层次结构中的所有文件。 - 我可以通过
SConscript
在src
目录中移动并从那里运行它来解决这个问题,也许Makefile
在顶层使用 a 。但这似乎很 hacky,而且我也确实想使用 SCons 在其他目录中构建(非代码)资产,而不是src
.
我读过您可以进行自定义Builder
并使其更改目录。但是,我不想Builder
为 C/C++ 编写一个全新的东西。有没有一种方法可以修改现有构建器的行为而无需从头开始编写?此外,在一个论坛上,有人说从 a 中更改目录Builder
会破坏并行构建,因为它会更改其他任务正在构建的目录。这是真的?