2015-08-18 2 views
1

Как я могу заставить GNU make обрабатывать цель как измененную без изменения файла цели (без тела рецепта)?MAKEFILE: обработка цели обновляется без изменения файла

У меня есть файл заголовка, который включает в себя другой заголовочный файл.

program.h:

//include guard  

#include "dependencies.h" 

//some actual signatures 

, и Makefile:

program: program.o dependencies.o 
    g++ -o program program.o dependencies.o 

program.o: program.cpp program.h 
    g++ -c program.cpp 

dependencies.o: dependencies.cpp dependencies.h 
    g++ -c dependencies.cpp 

program.h: dependencies.h 
    # I would like that this target was treated as modified after 
    # dependencies.h changes 

В приведенном выше примере, когда dependencies.h изменяется только dependencies.o перекомпилируется оставляя program.o нетронутыми и, таким образом, сборка будет вероятно, не удается. Можно ли изменить это поведение?

Спасибо.

Alek

+0

Ваш вопрос в целом похож на: https://stackoverflow.com/questions/2394609/makefile-header-dependencies. Вот еще один пример: http://scottmcpeak.com/autodepend/autodepend.html –

ответ

4

Изменить эти строки:

program.o: program.cpp program.h 
    g++ -c program.cpp 

dependencies.o: dependencies.cpp dependencies.h 
    g++ -c dependencies.cpp 

Чтобы быть:

OBJ_FILES = program.o dependencies.o 
DEP_FILES = $(patsbust %.o,%.d,$(OBJ_FILES)) 

%.o : %.cpp 
    g++ -c $< -MP -MMD -MF $(@:.o=.d) -o [email protected] 

program : $(OBJ_FILES) 
    g++ -o [email protected] $^ 

-include $(DEP_FILES) 

Это будет иметь g++ AutoGenerate файлы зависимостей для вас (в .d) файлов. Эти файлы будут иметь правила стиля makefile для зависимостей. В этом случае, я бы ожидать:

program.o : dependencies.h 

-include добавит те вашему Makefile. Таким образом, вам не нужно жестко кодировать свои зависимости - пусть компилятор выяснит это для вас!

1

Сделайте свою программу в зависимости от его зависимостей в полном объеме:

program.o: program.cpp program.h dependencies.h 
    g++ -c program.cpp 

Это, конечно, при условии, что ваш program.o самом деле зависит от dependencies.h. Если является внутренней деталью реализации program.h, тогда ваш код должен скомпилировать и перевести ссылку только без перекомпиляции program.o.

+0

Я делаю это точно так же, как вы говорите, но это утомительно, если есть более закодированные зависимости (и они не являются деталями реализации, но являются частью подписи fe). Я остался с такими строками: 'main.o: myWindows.h myViewModels.h iMyView.h model.h $ (DALINCLUDEDIR)/$ (DALHEADER) $ (GUIINCLUDEDIR)/$ (GUIHEADER) $ (SERVERINCLUDEDIR)/$ (SERVERHEADER) ' – listerreg

+0

Тогда возможно автоматическое решение Барри поможет :) –

Смежные вопросы