Как написать Makefile, чтобы заботиться об изменениях в заголовочном файле - PullRequest
4 голосов
/ 01 сентября 2011

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

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

Ответы [ 3 ]

5 голосов
/ 02 сентября 2011

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

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

2 голосов
/ 02 сентября 2011

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

depend:
    makedepend *.cc

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

2 голосов
/ 01 сентября 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, хотя это совсем другая головная боль ...

...