Ich brauche einige Makros auf Ziele ausgewertet werden, aber ich kann OBJECT_FILE
nicht durch $^aparently ausgewertet werden. dies ist meine Make-Datei:Listen auf eval in einem Makefile
#___________________________________build tools_________________________________
MKDIR := mkdir
RM := rm
CP := cp
CD := cd
COMPILER := gfortran
GENERAL_FLAGS := -fno-automatic -static -I/usr/include -fimplicit-none
TESTING_DEBUG_FLAGS := -Og -g -fbounds-check -fbacktrace -pedantic -Wextra \
-Wall ${GENERAL_FLAGS}
RELEASE_FLAGS := ${GENERAL_FLAGS} -Ofast
#______________________________macros de diretórios_____________________________
SRC_DIR := src
BUILD_DIR := build
RELEASE_DIR := release
DEBUG_DIR := debug
TEST_DIR := test
DIST_DIR := dist
PROGRAM := ${DIST_DIR}/SimulArroz
#______________________________regras de compilação_____________________________
tests: | TEST_PATHS ${PROGRAM}
TEST_PATHS:
$(eval FLAGS = ${TESTING_DEBUG_FLAGS})
$(eval OBJECT_DIR = ${BUILD_DIR}/${TEST_DIR})
$(eval OBJECT_FILES = ${OBJECT_DIR}/Data.o ${OBJECT_DIR}/Model.o \
${OBJECT_DIR}/Control.o ${OBJECT_DIR}/Farmings.o \
${OBJECT_DIR}/Test_data.o ${OBJECT_DIR}/Test_main.o \
${OBJECT_DIR}/Test_subroutines.o)
${MKDIR} -p ${DIST_DIR}
${MKDIR} -p ${OBJECT_DIR}
clean :
${RM} -fr ${BUILD_DIR}
${RM} -fr ${DIST_DIR}
${RM} -f seed.mod
run :
${CD} ${DIST_DIR} ; ./${PROGRAM}
${PROGRAM}: ${OBJECT_FILES}
${COMPILER} ${FLAGS} -o [email protected] $^
${OBJECT_DIR}/%.o: ${SRC_DIR}/%.f90
${MKDIR} -p ${OBJECT_DIR}
${COMPILER} ${FLAGS} -c -o [email protected] $<
Das Ergebnis, das ich bekommen ist:
gfortran -Og -g -fbounds-check -fbacktrace -pedantic -Wextra -Wall -fno-automatic -static -I/usr/include -fimplicit-none -o dist/SimulArroz
gfortran: fatal error: no input files; unwilling to write output files
compilation terminated.
makefile:90: recipe for target 'dist/SimulArroz' failed
make: *** [dist/SimulArroz] Error 1
Update:
Ich versuchte secondary expansion
wie in Kommentaren darauf aber immer noch, schließlich auf meinem Fall ist es Geben Sie das gleiche Ergebnis, hier sind die Änderungen, die ich versucht habe:
tests: FLAGS := ${TESTING_DEBUG_FLAGS}
tests: OBJECT_DIR := ${BUILD_DIR}/${TEST_DIR}
tests: OBJECT_FILES := ${TEST_OBJ_DIR}/Data.o ${TEST_OBJ_DIR}/Model.o \
${TEST_OBJ_DIR}/Control.o ${TEST_OBJ_DIR}/Farmings.o \
${TEST_OBJ_DIR}/Test_data.o ${TEST_OBJ_DIR}/Test_main.o \
${TEST_OBJ_DIR}/Test_subroutines.o
.SECONDEXPANSION:
tests: $$(PROGRAM)
${PROGRAM}: ${OBJECT_FILES}
${MKDIR} -p ${DIST_DIR}
${COMPILER} ${FLAGS} -o [email protected] $^
${OBJECT_DIR}/%.o: ${SRC_DIR}/%.f90
${MKDIR} -p ${OBJECT_DIR}
${COMPILER} ${FLAGS} -c -o [email protected] $<
Die '$ {OBJECT_FILES}' würde beim Analysieren der Datei erweitert werden, während das entsprechende '$ (eval)' ausgewertet würde, wenn das "Test" -Ziel ausgeführt wird, was später passiert. Brauchst du wirklich '$ (eval)' etwas, das keinen dynamischen Inhalt enthält? Definieren Sie die Variablen einfach wie gewohnt und es sollte funktionieren. – Dummy00001
Dies ist nur ein Teil des Makefiles, testing ist eine der Kompilierungsregeln, die ich habe, ist die einzige, die 'Test _% f90' Dateien verwenden, debuggen und release verwenden eine andere Liste von Requisiten zum Beispiel. Ich möchte eine generische und prägnante Art und Weise, so dass ich die beiden letzten Ziele für jede Zusammenstellung von Objekten verwenden kann. Ich sollte nicht jedes Objekt wie folgt bewerten: '$ {OBJECT_DIR} /%. O: $ {SRC_DIR} /%. F90'. Ist das nicht der geeignete Weg, aus allen Dateien, die kompiliert werden sollen, zu bewerten, was benötigt wird? Wenn es eine Möglichkeit gibt, diese Regel für verschiedene Objektlisten zu erhalten, würde ich mich über eine Anleitung freuen. – RomuloPBenedetti
'eine generische und prägnante Art' - die GNU make ist einfach ein falsches Werkzeug dafür. Obwohl, ja, können Sie das erreichen - mit der Funktion "sekundäre Erweiterung". Ich würde empfehlen, zu überprüfen, BSD machen, was mit einfachen Mitteln zu tun, was Sie wollen, da es auf einem konventionellen Präprozessor basiert, die viel besser für solche Dinge im Vergleich zu der GNU-Marke geeignet ist. – Dummy00001