2016-07-29 6 views
0

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] $< 
+0

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

+0

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

+0

'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

Antwort

0

Ok, ich habe es weiter untersucht, und wie in Fragekommentare gezeigt, ist es möglich, mein Problem mit second expansion zu lösen, ich habe es unter Verwendung text function auch gemacht. Da niemand eine Antwort kam ich stelle es hier:

#___________________________________build tools_________________________________ 

MKDIR := mkdir -p 
RM  := rm 
CP  := cp 
CD  := cd 
COMPILER := gfortran 

# flags do compilador 

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 

test_FILES := Data.o Model.o Control.o Farmings.o Test_Data.o Test_Main.o \ 
       Test_Subroutines.o 

#______________________________regras de compilação_____________________________ 

.PHONY: test clean run 

test: FLAGS  := ${TESTING_DEBUG_FLAGS} -o 
test: OBJ_DIR  := ${BUILD_DIR}/${TEST_DIR} 
test: PROGRAM_DIR := ${DIST_DIR}/${TEST_DIR} 
test: PROGRAM  := ${PROGRAM_DIR}/SimulArroz 

.SECONDEXPANSION: 
test: $${[email protected]_FILES} 
     ${MKDIR} ${PROGRAM_DIR} 
     ${COMPILER} ${FLAGS} ${PROGRAM} $([email protected]_FILES:%o=${OBJ_DIR}/%o) 

%.o: ${SRC_DIR}/%.f90 
    ${MKDIR} ${OBJ_DIR} 
    ${COMPILER} -c ${FLAGS} ${OBJ_DIR}/[email protected] $< 

clean : 
    ${RM} -fr ${BUILD_DIR} 
    ${RM} -fr ${DIST_DIR} 
    ${RM} -f seed.mod 

run : 
    ${CD} ${DIST_DIR} ; ./${PROGRAM} 

aber ... ich kann immer noch nicht, warum Figur kann ich nicht nur ein Ziel, wie erhalten:

${OBJ_DIR}/%.o: ${SRC_DIR}/%.f90 
    ${MKDIR} ${OBJ_DIR} 
    ${COMPILER} -c ${FLAGS} [email protected] $< 

als ${OBJ_DIR} wurde nicht erweitert, wenn es im Ziel verwendet wurde. Wenn jemand erklären kann, was in diesem Fall passiert, würde ich mich sehr freuen.

Ich möchte den Vorschlag danken, den ich in den Kommentaren auch erhielt.