как написать makefile, чтобы позаботиться об изменениях в заголовочном файле

На самом деле у меня есть библиотека «cryptopp», и я хочу, чтобы когда я вношу какие-либо изменения в файл и запускаю команду make, она должна была позаботиться об изменениях, внесенных в любой файл в исходном каталоге. ну, GNUMakefile из cryptoopp заботится об изменениях if, сделанных в файлах '.cpp', но не об изменениях, сделанных в файле '.h'.

Итак, какие изменения я могу внести в «GNUMakefile» cryptopp, чтобы он просматривал все измененные заголовочные файлы и перекомпилировал все файлы, зависящие от «модифицированного» заголовочного файла.


person A. K.    schedule 01.09.2011    source источник


Ответы (3)


Если вы строите с помощью g++, вы можете позволить g++ генерировать make-файлы зависимостей. Вы можете включить их в свой основной make-файл.

Используйте аргументы -M и -M*, чтобы использовать эту функцию. (см. http://gcc.gnu.org/onlinedocs/gcc-4.6.1/gcc/Preprocessor-Options.html#Preprocessor-Options)

person Ingmar Blonk    schedule 01.09.2011

Вы должны добавить все зависимости в свой Makefile:

mycode.o: mycode.cpp mycode.h somelib.h resources.h
        $(CXX) -c -o $@ $< $(CXXFLAGS) $(INCLUDES)

Если у вас уже есть общая командная строка сопоставления шаблонов, вам не нужно повторять команду, вы можете просто перечислить зависимости:

%o: %.cpp
        $(CXX) -c -o $@ $< $(CXXFLAGS) $(INCLUDES)

mycode.o: mycode.cpp mycode.h somelib.h resources.h

yourcode.o: yourcode.cpp yourcode.h mycode.h somethingelse.h

# ...

В общем, это жуткая и немасштабируемая каша. Вы почти наверняка захотите, чтобы система сборки более высокого уровня генерировала Makefile для вас. Даже для очень маленьких проектов поддержание зависимостей заголовков в Makefile в актуальном состоянии настолько утомительно, что оно того не стоит.

Существует несколько популярных переносимых сред сборки. Мне лично очень нравится cmake, который включает обнаружение, если вы изменили настройки сборки (скажем, с Debug на Release) и всегда будет собирать все необходимые файлы (например, если вы измените мастер-файл cmake и наберете «make», он будет сначала автоматически запустите cmake снова для вас).

Для решения только для Unix вы можете попробовать makedepend или печально известный autotools, хотя это совсем другая головная боль...

person Kerrek SB    schedule 01.09.2011
comment
Это бардак. Вот почему используются файлы .depend (сгенерированные компилятором автоматически)... - person Diego Sevilla; 02.09.2011

Вы можете попробовать makedepend, если он установлен в вашей системе. Самый простой способ — добавить цель в ваш make-файл. Что-то типа:

depend:
    makedepend *.cc

Возможно, вам придется заменить «*.cc» списком ваших исходных файлов. Затем вы можете восстановить все зависимости с помощью команды «make depend». Возможно, вы захотите перенаправить сообщения об ошибках в /dev/null, так как это всегда создает много шума.

person John Gordon    schedule 01.09.2011