CPPPATH 似乎不适用于 scons?

CPPPATH doesn't seem to work with scons?

在阅读 scons 的手册页时,我的理解是,当 header 文件更改时,scons 并不总是意识到,cpp 源文件也应该更改。我做了一个实验,但只是发现,无论我们是否指定了 CPPPATH,似乎 scons 总是会检测 header 文件更改并应用相应源文件的重建。

例如,我有 o.c 文件和包含 n.h 文件的 headers/ 目录:

#include"headers/n.h"
#include<stdio.h>
int main(){
  printf("hello\n");
  return 2;
}

而我的scons SConstruct是这样的:

Program('o.c')

当我更改 n.h 的内容时,scons 将重建 o.c 文件。这让我很惊讶。我试图像这样更改 SConscript:

Program('o.c',CPPPATH='.')

This time, I hope scons will only check header files under ".", but not under ./headers. Still, scons will rebuild o.c

I moved headers/ to another place above "." directory, and changed o.c to include it with absolute path. When I change n.h, still scons will rebuild o.c

我的问题:

(1) scons 如何扫描并确定header 文件是否已更改,它是调用gcc front-end 还是预处理器来执行此操作?如果是的话,好像是和编译重复了对吧?

(2) 我发现指定 CPPPATH 没有用:无论是否指定,scons 都会扫描。即使我说 CPPPATH=".",scons 似乎也在扫描其他目录。

为什么?这是设计使然吗?如果是,那么 CPPPATH 的用途是什么?

再次强调(参见 Using 'LIBS' in scons 'Program' command failed to find static library, why? and When I change SConstruct file, scons doesn't trigger rebuild?)您的假设是错误的。

SCons 简单地模仿 CPPPATHgcc/g++ 编译器中的用法。在您上面的示例中,即使 gcc 也会找到 header n.h,而 command-line 中没有明确的“-Iheaders”。通过你的明确

#include"headers/n.h"

它拥有所需的所有信息(relative/absolute header 的完整路径)。让它成为

#include "n.h"

你会看到不同。