2016-10-04 10 views
0

при чтении страницы man scons, мое понимание было, scons не всегда понимает, когда файл заголовка изменен, исходные файлы cpp также должны измениться. Я сделал эксперимент, но только для того, чтобы определить, есть ли у нас CPPPATH или нет, кажется, что scons всегда обнаруживает изменения файла заголовка и применяет пересоздание соответствующих исходных файлов.CPPPATH, похоже, не работает со счётами?

К примеру, у меня есть файл ос и заголовки/каталог, содержащий файл: Nh

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

И мой SCons SConstruct как это:

Program('o.c') 

Когда я изменить содержание пи , scons будет восстанавливать файл oc. Это довольно удивительно для меня. Я пытался изменить SConscript так:

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

На этот раз, я надеюсь, что SCons будет проверять только файлы заголовков под землей, но не под ./headers «». Тем не менее, scons перестраивает o.c

Я переместил заголовки/в другое место выше "." каталог и изменил o.c, чтобы включить его с абсолютным путем. Когда я изменяю пН, еще Scons восстановим Ос

Мои вопросы:

(1) Как SCons сканирование и определить, если заголовочный файл изменился, это называют Gcc передний конец или препроцессор, чтобы сделать это ? Если это так, похоже, это дублированная работа с компиляцией, правильно?

(2) Я не считаю, что спецификация CPPPATH полезна: будет ли она указана, сканирование будет сканировать. Даже когда я говорю CPPPATH = ".", Scons, похоже, сканирует другие каталоги.

Почему? Это по дизайну? Если да, то какое использование CPPPATH вообще?

+1

Один вопрос на, um, вопрос пожалуйста. –

+1

+1 для «только одного вопроса» ... и, пожалуйста, прекратите утверждать, что «Сконды, похоже, не работают». Это справедливо, если вы скажете: «Скотты не ведут себя так, как ожидалось». но тогда это должно включать ссылку на документацию и предпочтительно «минимальный рабочий пример», чтобы четко продемонстрировать отклонение. Просто заявляя, что SCons ведет себя иначе, чем вы ожидаете, а затем задавая «почему» вопросы об этом, вероятно, не очень помогает другим пользователям. – dirkbaechle

ответ

2

Снова (см. Using 'LIBS' in scons 'Program' command failed to find static library, why? и When I change SConstruct file, scons doesn't trigger rebuild?) Ваши предположения ошибочны.

SCons просто имитирует использование CPPPATH, как в компиляторе gcc/g++. В приведенном выше примере даже gcc найдет заголовок n.h без явного «-Iheaders» в командной строке. По вашему явному адресу

#include"headers/n.h" 

он имеет всю необходимую информацию (полный относительный/абсолютный путь к заголовку). Сделайте это

#include "n.h" 

и вы увидите разницу.