Scons 没有按照我指定的那样计算正确的 'ParseDepends' 或 'Ignore'
Scons doesn't calculate correct 'ParseDepends' or 'Ignore' as I specified
我想告诉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)
你看,我没有定义任何 "FOO",所以 hello.c 文件根本不使用我的 .h 文件。
我还希望 ParseDepends 能够读取 C 预处理器命令以忽略我的 #include "n.h" 因为没有 "FOO" 定义。
但是当运行 scons,然后改变n.h文件,运行 scons再次触发重建hello.c
然后我尝试使用 'Ignore' 语句如下:
hello_obj=Object('hello.c')
hello=Program(hello_obj)
Ignore(hello_obj,'n.h')
好吧,我得到了相同的测试结果:n.h 内的变化不会被 scons 忽略!
为什么?
使用Ignore()
。引用 its documentation,
Sometimes it makes sense to not rebuild a program, even if a dependency file changes. In this case, you would tell SCons specifically to ignore a dependency
在您的情况下,这是一个完整的 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.
我想告诉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)
你看,我没有定义任何 "FOO",所以 hello.c 文件根本不使用我的 .h 文件。 我还希望 ParseDepends 能够读取 C 预处理器命令以忽略我的 #include "n.h" 因为没有 "FOO" 定义。
但是当运行 scons,然后改变n.h文件,运行 scons再次触发重建hello.c
然后我尝试使用 'Ignore' 语句如下:
hello_obj=Object('hello.c')
hello=Program(hello_obj)
Ignore(hello_obj,'n.h')
好吧,我得到了相同的测试结果:n.h 内的变化不会被 scons 忽略! 为什么?
使用Ignore()
。引用 its documentation,
Sometimes it makes sense to not rebuild a program, even if a dependency file changes. In this case, you would tell SCons specifically to ignore a dependency
在您的情况下,这是一个完整的 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.