makefile mismo ejecutable con dependencias diferentes
Estoy tratando de escribir un archivo makefile que crea el mismo ejecutable (EXE
) pero para diferentes propósitos (los archivos *.o
en OBJ_DIR
se construyen con una regla separada, no se muestra aquí)
FILE1 = ... una lista de archivos ...
FILE2 = ... una lista diferente de archivos ...
myexe1: $(patsubst %, $(OBJ_DIR)/%.o, $(FILE1))| $(BIN_DIR)
$(F90) -o $(EXE) $^ $(FFLAGS)
myexe2: $(patsubst %, $(OBJ_DIR)/%.o, $(FILE2))| $(BIN_DIR)
$(F90) -o $(EXE) $^ $(FFLAGS)
Puedo llamar al make con make myexe1
y make myexe2
y construir el EXE
.
Pero como el EXE
no es myexe1
o myexe2
, la construcción se activa cada vez que se llama make myexe1/myexe2
. Sin embargo, lo que quiero es que cuando se llame myexe1
, se verifique si EXE
está actualizado y luego se active la construcción. Puedo hacer que myexe1
sea un objetivo ficticio para lograr esto parcialmente, como
FILE1 = ... una lista de archivos ...
FILE2 = ... una lista diferente de archivos ...
myexe1: $(EXE)
$(EXE): $(patsubst %, $(OBJ_DIR)/%.o, $(FILE1))| $(BIN_DIR)
$(F90) -o $(EXE) $^ $(FFLAGS)
Pero entonces ya no puedo ejecutar myexe2
. ¿Es posible que cuando se llame myexe1
o myexe2
, se verifique si EXE
y los archivos de objeto asociados están actualizados y solo entonces se active el proceso de construcción?
davy.ai
Sí, es posible modificar el makefile para verificar si
EXE
y los archivos de objeto asociados están actualizados antes de iniciar el proceso de compilación. Una forma de hacerlo sería introducir un objetivo intermedio común que verifique si los archivos de objeto se han actualizado y los actualice si es necesario. Este objetivo puede luego ser un requisito previo tanto para los objetivosmyexe1
comomyexe2
.Aquí hay un ejemplo de implementación:
En este makefile modificado:
$(OBJ_DIR)/%.o
es una regla de patrón genérico que compila cada archivo fuente.f90
enSRC_DIR
a un archivo objeto.o
correspondiente enOBJ_DIR
.objects
es una dependencia tanto de los objetivosmyexe1
comomyexe2
, y asegura que todos los archivos de objeto se actualicen si es necesario antes de construirEXE
.$(EXE)
depende del objetivoobjects
y construye el ejecutable final.myexe1
ymyexe2
no han sido modificados.Ahora, cuando se llama
make myexe1
omake myexe2
, se ejecuta primero el objetivoobjects
para verificar si los archivos de objeto están actualizados y los actualiza si es necesario. Solo entonces se ejecuta la regla$(EXE)
para construir el ejecutable final.