Ich habe zwei Quelldateien, library.f90
und toolbox.f90
in einem separaten Verzeichnis. Diese werden in Objektdateien kompiliert, die beim Kompilieren der Hauptdatei mit dem passenden Namen main
verknüpft werden. Am Anfang hatte ich dieses Makefile:Warum werden diese Objektdateien nicht neu kompiliert, wenn die Quelldateien geändert werden?
TARGET = main
SRC = ${TARGET}.f95
FC = /usr/bin/gfortran
CFLAGS = -O2 -std=gnu -Wfatal-errors -I${INCLUDE}
INCLUDE = /home/ma/include
OBJ = library.o toolbox.o
OBJ_SRC = $(subst .o,.f90,${OBJ})
all: ${TARGET}
${TARGET}: ${SRC} ${OBJ}
@${FC} ${CFLAGS} -pedantic -Wall ${OBJ} ${SRC} -o ${TARGET}
${OBJ}:
@echo "Compiling $(subst .o,,[email protected])"
@${FC} ${CFLAGS} -c ${INCLUDE}/$(subst .o,.f90,[email protected]) -o [email protected]
clean:
@rm -vf ${TARGET} ${OBJ}
aber nicht library.o
nicht neu kompilieren (oder toolbox.o
, respectively), wenn die Quelldatei library.f90
oder toolbox.f90
bearbeitet wird. Ich dachte, dies war, weil die Abhängigkeit fehlte, so gezwickt ich das Makefile wie folgt aussehen:
TARGET = main
SRC = ${TARGET}.f95
FC = /usr/bin/gfortran
CFLAGS = -O2 -std=gnu -Wfatal-errors -I${INCLUDE}
INCLUDE = /home/ma/include
OBJ = library.o toolbox.o
all: ${TARGET}
${TARGET}: ${SRC} ${OBJ}
@${FC} ${CFLAGS} -pedantic -Wall ${OBJ} ${SRC} -o ${TARGET}
${OBJ}: ${OBJ_SRC}
@echo "Compiling $(subst .o,,[email protected])"
@${FC} ${CFLAGS} -c ${INCLUDE}/$(subst .o,.f90,[email protected]) -o [email protected]
clean:
@rm -vf ${TARGET} ${OBJ}
Das aber führt den Fehler
make: *** No rule to make target 'library.f90', needed by 'library.o'. Stop.
ich das nicht verstehen, weil es ist keine Regel, um ${SRC}
entweder zu erstellen, aber make erkennt die Abhängigkeit dort und kompiliert die Quelldatei wie erwartet.