2010-02-05 4 views
2

У меня есть следующие Makefile (фрагмент)Устранение автогенерируемые зависимостей (от ССЗ) в производстве

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 [email protected] 

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

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:... являются ключом, но я никогда раньше не работал с автогенерированными зависимостями.

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

ответ

2

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

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

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

+0

Спасибо за подсказку - я действительно закончил использование 'sed -i 's \\. (\\) \. O: | $ (OBJ_DIR)/\ 1.o $ (OBJ_DIR)/\ 1.d: |» $ @ '. Ура! –

Смежные вопросы