2013-05-04 44 views
5

我有以下的(我还以为很常见),目录层次结构的应用程序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 

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

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

编辑:我要补充一点,显然#1可以通过添加-Isrc作为一个标志,GCC是固定的,但是这似乎是各地的主要问题更多的黑客)

我怎样才能让在致电gcc之前,SCons cd进入src目录?

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

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

+0

这看起来像什么,我会想我的问题还有:https://stackoverflow.com/questions/45519577/scons-link-program-without-build-directory-in-link-path – 2017-08-05 09:06:55

回答

3

这种行为只是SCons的工作原理,它不可能避免/改变。我一直在寻找一些有利的支持文件,并没有找到任何支持文件。它只是我已经习惯了。

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

+0

感谢确认我的怀疑。那么,我已经更新了记录器,这样就可以清除整个路径,并且只显示文件名(无论如何,这可能会更好,因为日志看起来更干净,如果需要,通常可以猜测路径)。我想我现在可以忍受这个:) – mgiuca 2013-05-05 01:11:56