GNU make: чистая цель зависит от включений

Я использую gmake и gcc -MM для отслеживания зависимостей заголовка, следуя руководство . Механизм использует директиву include make-файла для импорта вычисленных зависимостей.

Поскольку файлы .d включены в make-файл, они должны существовать для любой цели, включая clean. Поэтому, прежде чем clean сможет сделать правильную вещь, необходимо сгенерировать зависимости, а если не удастся построить, то clean только что сделал больше беспорядка.

Помимо clean, он хочет создать все зависимости перед созданием любой цели.

Кроме того, если какой-либо файл будет заменен на несуществующий файл, разрешение зависимости будет нарушено, и ничего не будет построено.

Если заголовок удален, то существующие файлы зависимостей по-прежнему называют его целевым, и ничего не будет создано до тех пор, пока не будут удалены поврежденные файлы зависимостей ... что нельзя сделать с помощью clean

Замена шаблона замены include подстановочным знаком для включения всех существующих файлов зависимостей решает некоторые проблемы, но все же может очистить поврежденную зависимость, и устаревшие файлы зависимостей никогда не удаляются. Есть ли лучшее решение? Действительно ли пример руководства предназначен для реального использования?

12 голосов | спросил Potatoswatter 12 +04002012-10-12T14:21:55+04:00312012bEurope/MoscowFri, 12 Oct 2012 14:21:55 +0400 2012, 14:21:55

3 ответа


0

Только не предоставляйте правила для генерации файлов .d. Хорошее объяснение того, почему это не так хорошо (в том числе и ваш случай), доступно в «Расширенном авто». «Поколение зависимости» Пола Смита - сопровождающего GNU Make.

В двух словах, следующий шаблон отлично работает для меня во всех случаях:

CPPFLAGS += -MMD -MP

%.o: %.c
    $(CC) $(CPPFLAGS) $(CFLAGS) -o [email protected] -c $<

-include $(OBJS:.o=.d)

Смотрите также мои предыдущие похожие ответы:

ответил Eldar Abusalimov 12 +04002012-10-12T14:56:25+04:00312012bEurope/MoscowFri, 12 Oct 2012 14:56:25 +0400 2012, 14:56:25
0

Решением является использование условного синтаксиса .

ifneq ($(MAKECMDGOALS), clean)
-include $(notdir $(SOURCES:.cpp=.d))
endif

Это заставляет чистую цель не вызывать цели *.d, поскольку при запуске make clean файлы *.d не будут включены в Makefile.

Ссылка: https://www.gnu.org/software/сделать /ручной /html_node /Goals.html

ответил Jorgeluis 3 22015vEurope/Moscow11bEurope/MoscowTue, 03 Nov 2015 06:43:38 +0300 2015, 06:43:38
0

Мой обычный шаблон выглядит как

all: target
target: .depends

## [snip build rules]

.depends:
     gcc -MM $(CPPFLAGS) .... > [email protected]

-include .depends

Примечание -include вместо include , В основном, это включает в себя условно: то есть, если файл существует

Смотрите документацию: http://www.gnu.org/software /make/manual/make.html#Include

ответил sehe 12 +04002012-10-12T14:52:35+04:00312012bEurope/MoscowFri, 12 Oct 2012 14:52:35 +0400 2012, 14:52:35

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132