Scons没有计算出正确的ParseDepends'或者'忽略'正如我所说

时间:2016-10-04 15:32:16

标签: c++ linux parsing dependencies scons

我想告诉scons,当我更改一个头文件时,不要重新编译我的源文件(这只是我的测试!) 我有hello.c文件:

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

我的SConstruct文件是:

obj=Object('hello.c')
SideEffect('hello.d',obj)
ParseDepends('hello.d')
Program('hello',obj)

你知道,我没有定义任何&#34; FOO&#34;,所以hello.c文件根本不使用我的.h文件。 我还希望ParseDepends能够读取C-preprocessor命令,以便忽略我的#include&#34; n.h&#34;因为没有&#34; FOO&#34; definied。

但是当运行scons,然后更改n.h文件时,再次运行scons会触发重建hello.c

然后我尝试使用&#39;忽略&#39;声明如下:

hello_obj=Object('hello.c')
hello=Program(hello_obj)
Ignore(hello_obj,'n.h')

嗯,我得到了相同的测试结果:s.h中不会忽略n.h内的更改! 为什么呢?

1 个答案:

答案 0 :(得分:1)

使用Ignore()。引用its documentation

  

有时,即使依赖项文件发生更改,也不会重建程序。在这种情况下,您会告诉SCons专门忽略依赖

在您的情况下,这是一个完整的SConstruct(我将您的C程序更改为#include "headers/n.h"):

obj=Object('hello.c')
Ignore(obj, 'headers/n.h')
Program('hello',obj)

这是一个证明它有效的shell会话:

$ scons -Q -c
Removed hello.o
Removed hello
$ scons -Q 
gcc -o hello.o -c hello.c
gcc -o hello hello.o
$ echo hello >> headers/n.h 
$ scons -Q 
scons: `.' is up to date.