Использование файлов зависимостей GCC заставляет Make каждый раз полностью перестраивать проект - PullRequest
1 голос
/ 13 июня 2011

Я следовал инструкциям в Интернете, чтобы настроить gcc (фактически g ++) для генерации .d файлов для зависимостей, и теперь мой make-файл выглядит примерно так:

CPPFLAGS := ... -MMD -MP
...
OBJECTS := $(shell find *.cpp *.s | sed -e 's/\.cpp/\.o/' -e 's/\.s/\.o/')
all: setupdir $(OBJECTS) link image

А затем в конце файла:

-include $(pathsubst %.d,obj/%.d,$(OBJECTS:.o=.d))

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

1 Ответ

1 голос
/ 13 июня 2011

Важно отметить, что -M - это не волшебная палочка для зависимостей, во многих случаях вам нужно будет указывать определенные заголовки, чтобы все вещи перестраивались соответствующим образом, если они меняются.На самом деле, наиболее распространенная проблема с разрешением gcc обрабатывать зависимости - это вещи, которые не нужно пересобирать, что должно быть (в основном, в зависимости от версии GCC, используемой тем, кто запускает make).

При этом,Я не вижу ничего явно неправильного в том, что вы делаете.

То, что я рекомендую сделать, - это устранить хитрости оболочки, поскольку довольно легко точно указать, что вы хотите.Например,

foo_SOURCES = \
    src/foo.cpp \
    src/bar.cpp

foo_OBJECTS = $(foo_SOURCES:.cpp=.o)

foo_DEPS = $(foo_OBJECTS:.o=.d)

%.o : %.cpp
    $(CC) $(CFLAGS) ... $< -o $@
    $(CC) -M $< > $(@.o=.d)

# lots more rules and targets here

# and finally, at the bottom:

-include $(foo_DEPS)

Это в верхней части моей головы в мета-форме, поэтому проверьте это, чтобы быть уверенным.Я полагаю, что ваша проблема на самом деле в том, что зависимости не включены, но я не вижу ничего явно неправильного в том, как вы используете pathsubst.

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

Если вы работаете, попробуйте просто сохранить результаты ваших вызовов оболочки и отобразить их на экране.Это намного менее шумно, чем вывод отладки make.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...