Pregunta

Tengo el siguiente makfile (fragmento)

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)

Cuando corro make dev Veo lo siguiente

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

Al cambiar src/socket.h (un archivo en el que todos dependen todos) y ejecutándose make, Esperaba que reconstruyera todo el proyecto, pero solo emite una acción

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

Creo que estoy generando las dependencias automáticas correctamente, por lo que tengo la sensación de que simplemente no las estoy usando correctamente. ¿Dónde me he equivocado? Sé que el makefile:59:... Los errores son una pista, pero nunca antes he trabajado con dependencias generadas automáticamente.

Gracias por adelantado; ¡Salud!

¿Fue útil?

Solución

Desafortunadamente, tu *.d Los archivos no obtienen sus dependencias completas; También dependen de todos los archivos de encabezado. Una forma de solucionar esto sería agregar una línea adicional al %.d directiva:

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

Si el -i te asusta, podrías intentarlo sponge (en el moreutils paquete en mi distribución).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top