Исправление автоматически сгенерированных зависимостей (из gcc) в make - PullRequest
2 голосов
/ 05 февраля 2010

У меня есть следующий make-файл (фрагмент)

SRC_DIR     = src
OBJ_DIR     = obj
DEP_DIR     = dep
BIN_DIR     = .
SRC_FILES  := $(wildcard $(SRC_DIR)/*.cpp)
OBJ_FILES  := $(patsubst $(SRC_DIR)/%.cpp,$(OBJ_DIR)/%.o,$(SRC_FILES))
DEP_FILES  := $(patsubst $(SRC_DIR)/%.cpp,$(DEP_DIR)/%.d,$(SRC_FILES))

# Development build directive
dev: $(DEP_FILES) $(OBJ_FILES)
  $(CPPC) $(LIBS) $(FLAGS_DEV) $(OBJ_FILES) -o $(BIN_DIR)/$(PROJECT)

# Object file directives
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp $(DEP_DIR)/%.d
  $(CPPC) -c $(FLAGS_DEV) $< -o $@

# Dependency directives
$(DEP_DIR)/%.d: $(SRC_DIR)/%.cpp
  $(CPPC) -MM -MD $< -o $@

include $(DEP_FILES)

Когда я запускаю make dev, я вижу следующее

makefile:59: dep/area.d: No such file or directory
makefile:59: dep/avatar.d: No such file or directory
makefile:59: dep/board.d: No such file or directory
makefile:59: dep/socket.d: No such file or directory
g++ -MM -MD src/socket.cpp -o dep/socket.d
g++ -MM -MD src/board.cpp -o dep/board.d
g++ -MM -MD src/avatar.cpp -o dep/avatar.d
g++ -MM -MD src/area.cpp -o dep/area.d
g++ -c -ggdb3 -ansi -Wall -Werror -pedantic-errors src/area.cpp -o obj/area.o
g++ -c -ggdb3 -ansi -Wall -Werror -pedantic-errors src/avatar.cpp -o obj/avatar.o
g++ -c -ggdb3 -ansi -Wall -Werror -pedantic-errors src/board.cpp -o obj/board.o
g++ -c -ggdb3 -ansi -Wall -Werror -pedantic-errors src/socket.cpp -o obj/socket.o
g++ -ggdb3 -ansi -Wall -Werror -pedantic-errors obj/area.o obj/avatar.o obj/board.o obj/socket.o  -o ./game

При изменении src/socket.h (файл, от которого зависят все остальные) и запуске make, я ожидал, что он перестроит весь проект, но он генерирует только одно действие

g++ -ggdb3 -ansi -Wall -Werror -pedantic-errors obj/area.o obj/avatar.o obj/board.o obj/socket.o  -o ./game

Полагаю, я правильно генерирую автоматические зависимости - поэтому я чувствую, что просто неправильно их использую. Где я ошибся? Я знаю, что ошибки makefile:59:... являются подсказкой, но я никогда раньше не работал с автоматически генерируемыми зависимостями.

Спасибо заранее; Ура!

1 Ответ

2 голосов
/ 05 февраля 2010

К сожалению, ваши *.d файлы не получают своих полных зависимостей; они также зависят от всех заголовочных файлов. Один из способов исправить это - добавить дополнительную строку в директиву %.d:

# Dependency directives
$(DEP_DIR)/%.d: $(SRC_DIR)/%.cpp
  $(CPPC) -MM -MD $< -o $@
  sed -i 'p;s|$(OBJ_DIR)/\(.*\)\.o:|$(DEP_DIR)/\1.d:|' $@

Если -i вас пугает, вы можете попробовать sponge (в пакете moreutils в моем дистрибутиве).

...