que estoy haciendo algunos refactorización Makefile y tratando de averiguar la forma más concisa para implementar un Makefile que hace lo siguiente:un diccionario Makefile
- Tiene una variable que tiene todos los archivos de fuentes incluidas (puede ser a la vez C y C++ archivos)
- Todos los archivos de objetos se generan en OBJ_DIR
- La lista de objetos se crea si no existe
Esto es lo que tengo hasta ahora:
...
OBJ_DIR = obj/
BIN_DIR = bin/
PROGRAM = program
SRCS = test1.cpp test2.c
OBJS = $(addprefix $(OBJ_DIR), \
$(patsubst %.cpp, %.o, \
$(patsubst %.c, %.o, $(SRCS))))
$(BIN_DIR)$(PROGRAM) : $(OBJS)
$(CREATE_OUT_DIR)
$(LINK)
$(OBJ_DIR)%.o : %.c
$(CREATE_OBJ_DIR)
$(CCOMPILE)
$(OBJ_DIR)%.o : %.cpp
$(CREATE_OBJ_DIR)
$(CPPCOMPILE)
...
Me gustaría eliminar la llamada a $ (CREATE_OBJ_DIR) para cada compilación .o. Alguien sabe cómo hacer esto? He intentado añadir esto, pero entonces no sería construir los archivos de objetos:
$(OBJS): | $(OBJ_DIR)
$(OBJ_DIR):
$(CREATE_OBJ_DIR)
Veo problemas con este diseño. ¿Cómo se contabilizan las dependencias del encabezado? Normalmente escribo makefiles con algo como 'src = $ (shell find ./ --name" * .cpp ")' y uso los conmutadores GCC '-M' para tener dependencias manejadas por mí. De esta manera, tengo un archivo make reutilizable corto para todos mis proyectos. En cuanto a su problema real, ¿por qué no crear el directorio 'obj' de antemano? –
No es exactamente una respuesta, pero ¿ya has visto alternativas a 'Makefile'? 'SConstruct' viene a mi mente (y es genial) pero hay muchas otras herramientas que manejan muy bien ese tipo de problemas. – ereOn
@Alexandre: también iba a examinar las dependencias de encabezado. ¿Tienes un buen ejemplo de cómo hacer esto? – waffleman