es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  ,

Answer

  1. Avatar for 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 objetivos myexe1 como myexe2.

    Aquí hay un ejemplo de implementación:

    FILE1 = ... alguna lista de archivos ...
    FILE2 = ... otra lista de archivos ...
    
    # Objetivo intermedio para verificar si los archivos de objeto están actualizados
    $(OBJ_DIR)/%.o: $(SRC_DIR)/%.f90 | $(OBJ_DIR)
        $(F90) -c -o $@ $< $(FFLAGS)
    
    # Objetivo común para verificar si los archivos de objeto están actualizados y actualizarlos si es necesario
    objects: $(patsubst %, $(OBJ_DIR)/%.o, $(FILE1) $(FILE2))
    
    $(EXE): objects | $(BIN_DIR)
        $(F90) -o $(EXE) $^ $(FFLAGS)
    
    myexe1: $(EXE)
        # Comandos específicos para myexe1
    
    myexe2: $(EXE)
        # Comandos específicos para myexe2
    

    En este makefile modificado:

    • La regla $(OBJ_DIR)/%.o es una regla de patrón genérico que compila cada archivo fuente .f90 en SRC_DIR a un archivo objeto .o correspondiente en OBJ_DIR.
    • El objetivo objects es una dependencia tanto de los objetivos myexe1 como myexe2, y asegura que todos los archivos de objeto se actualicen si es necesario antes de construir EXE.
    • La regla $(EXE) depende del objetivo objects y construye el ejecutable final.
    • Los objetivos myexe1 y myexe2 no han sido modificados.

    Ahora, cuando se llama make myexe1 o make myexe2, se ejecuta primero el objetivo objects 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.

Comments are closed.