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

mgi*_*uca 5 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
Run Code Online (Sandbox Code Playgroud)

问题是,当我scons从顶级目录运行时,它gcc从该目录调用而不cd进入src,如下所示:

gcc -o src/foo.o src/foo.c
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

  • 我不想删除src目录并移动所有内容,因为顶层有很多其他(非代码)文件.
  • 我不希望SCons cd进入每个子目录.它应该只是cd进入src,然后从那里构建层次结构中的所有文件.
  • 我可以通过SConscriptsrc目录中移动并从那里运行它来解决这个问题,也许使用Makefile顶层的a .但这看起来相当hacky,而且我也想使用SCons在其他目录中构建(非代码)资产src.

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

Bra*_*ady 3

这种行为正是 SCons 的工作原理,并且不可能避免/改变。我一直在寻找一些对其有利的支持文档,但还没有找到。这只是我已经习惯的事情。

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