我有以下的(我还以为很常见),目录层次结构的应用程序src /目录:大厦相对于与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
ING为src
,像这样:
gcc -o src/foo.o src/foo.c
这是有问题的有以下几个原因:
- 在我的程序中,我给出了相对于
src
目录的路径的#include
文件。例如,more.c
可以包括foo.h
和#include "foo.h"
。这失败了,因为GCC从父目录运行。我不想将我的内容更改为#include "src/foo.h"
。 - 我使用
__FILE__
特殊的宏来处理日志等事情。当从顶层目录构建时,GCC将“src/
”放在所有文件名的前面,因为这是它被编译的路径。这可能看起来很挑剔,但我不希望这样,因为我认为我的源代码树相对于src
目录。
(编辑:我要补充一点,显然#1可以通过添加-Isrc
作为一个标志,GCC是固定的,但是这似乎是各地的主要问题更多的黑客)
我怎样才能让在致电gcc
之前,SCons cd
进入src
目录?
- 我不想摆脱
src
目录和移动的一切行动,因为有很多其他的(非代码)的文件在顶层。 - 我不想让SCons到
cd
进入每个子目录。它应该只是cd
到src
,然后从那里构建层次结构中的所有文件。 - 我可以通过在
src
目录内移动SConscript
并从那里运行它来解决此问题,也许在顶层使用Makefile
。但是这看起来很诡异,我也想用SCons在src
以外的其他目录中构建(非代码)资产。
我读过你可以自定义Builder
并使其更改目录。但是,我不想为C/C++编写全新的Builder
。有没有办法修改现有的生成器的行为,而无需从头开始编写一个?另外,在一个论坛上,有人说从Builder
中更改目录会破坏并行构建,因为它会更改其他任务构建的目录。这是真的?
这看起来像什么,我会想我的问题还有:https://stackoverflow.com/questions/45519577/scons-link-program-without-build-directory-in-link-path – 2017-08-05 09:06:55