WOOO! Мне удалось получить код в посте Беты для работы над небольшим тестовым проектом.
Я должен отметить, для всех, кто может столкнуться с этим,
Если вы используете оболочку bash (которой я и являлся), вам нужно будет добавить escape-символ перед знаком фунта, чтобы избежать превращения оставшейся части выражения в комментарий. (см. 4-ую строку кода)
%.o : %.cpp
g++ -c -MD -o $@ $<
cp $*.d $*.P; \
sed -e 's/\#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \
-e '/^$$/ d' -e 's/$$/ :/' < $*.d >> $*.P; \
rm -f $*.d
-include *.P
Теперь я хочу поделиться информацией, найденной в Управление проектами с помощью GNU Make, 3-е издание. , потому что она указывает на некоторые важные проблемы по этому вопросу и предоставляет код, который я до сих пор не до конца понимаю еще.
В книге появляется метод, который похож на метод, описанный на странице Make manual .
Это выглядит так:
include $(subst .c,.d,$(SOURCES))
%.d: %.c
$(CC) -M $(CPPFLAGS) $< > $@.$$$$; \
sed 's,\($*\).o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
rm -f $@.$$$$
Это то, что я считаю, происходит.
Сразу же, 'make' хочет включить файл ".d" для каждого исходного файла.
Поскольку изначально файлов .d не существует, кусок кода запускается снова и снова для создания всех отсутствующих файлов .d.
Это означает, что make будет запускаться снова и снова, пока каждый файл .d не будет создан и включен в make-файл.
Каждый файл ".d" - это то, что говорит Бета: цель с набором зависимостей и НЕТ рецепта.
Если заголовочный файл когда-либо изменяется, для тех правил, которые включены в него, сначала потребуется обновить зависимости. Это то, что меня немного сбивает с толку, как получается, что кусок кода может быть вызван снова? Он используется для обновления файлов .d, поэтому, если файл .h изменяется, как он вызывается? Помимо этого, я понимаю, что для компиляции объекта используется правило по умолчанию. Любые разъяснения / неправильные представления к этому объяснению приветствуются.
Далее в книге указываются проблемы с этим методом, а также проблемы, которые, как я считаю, также существуют в реализации Advanced Auto-Dependency Generation.
Задача 1: Это неэффективно. make должен перезапускаться каждый раз, когда создается файл .d
Проблема 2: make генерирует предупреждающие сообщения для всех отсутствующих файлов .d - это в основном просто неприятность и может быть скрыто добавлением «-» перед оператором включения.
Проблема 3: Если вы удалите файл src, потому что он больше не нужен, 'make' потерпит крах при следующей попытке компиляции, потому что в некотором файле .d отсутствует src в качестве зависимости, а также потому, что существует нет правила воссоздать этот src, make не пойдет дальше.
Говорят, что исправлением этих проблем является метод Тромея, но код выглядит сильно отличающимся от кода на сайте. Возможно, это просто потому, что они использовали некоторые макросы, сделали это вызовом функции и написали его немного по-другому. Я все еще изучаю это, но хотел поделиться некоторыми открытиями, которые я сделал до сих пор. Надеюсь, что это откроет немного больше дискуссий и приблизит меня к сути всего этого.