2016-10-04 2 views
0

Я хочу сказать, что scons, когда я изменил один заголовочный файл, не перекомпилировал мой исходный файл (это только мой тест!) I ' ве получил hello.c файл:Scons не вычисляет правильные «ParseDepends» или «Ignore», как я указал

#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-preprocessor, чтобы игнорировать мой #include «n.h», потому что не определено «FOO».

Но при запуске SCons, а затем изменить файл NH, работает SCons снова будет инициировать перестроение hello.c

Затем я попытался использовать «Игнорировать» заявление, как показано ниже:

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

Ну я получил тот же результат теста: изменение внутри nh не игнорируется scons! Почему?

+0

И почему вы это проверяете? Что вы пытаетесь достичь? – dirkbaechle

ответ

1

Использование Ignore(). Цитата its documentation,

Иногда имеет смысл не перестраивать программу, даже если файл зависимостей изменяется. В этом случае, вы бы сказать SCons конкретно игнорировать зависимость

В вашем случае, вот полный SConstruct (я изменил вашу C программу, чтобы сказать #include "headers/n.h"):

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

Вот является который доказывает, что он работает:

$ 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. 
Смежные вопросы