2016-07-29 1 views
0

대상에서 평가할 매크로가 필요하지만 OBJECT_FILE을 $^aparently에서 평가할 수 없습니다.메이크 파일 내 eval에 대한 목록

#___________________________________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] $< 

내가 얻는 결과는 다음과 같습니다 :

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 

갱신 :

나는 내 경우에 마지막에 여전히 의견에 지적 secondary expansion을 시도했지만 그것은이다이 내 메이크입니다 동일한 결과를주었습니다. 시도한 변경 사항은 다음과 같습니다.

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

'$ {OBJECT_FILES}'는 파일 분석 중에 확장 될 것이고''$ '(eval)'은 "test"타겟이 실행될 때 평가 될 것입니다. 동적 콘텐츠가없는 것을'$ (eval) '해야합니까? 변수를 일반적인 방법으로 정의하면 효과가 있습니다. – Dummy00001

+0

이것은 makefile의 일부이며 testing은 내가 가지고있는 make 컴파일 규칙 중 하나이며'Test _ %. f90' 파일을 사용하는 유일한 것입니다. 예를 들어 debug와 release는 다른 requisites 목록을 사용합니다. 일반적이고 간결한 방법으로 개체의 컴파일 목록에 대해 두 개의 마지막 대상을 사용할 수 있습니다. 나는'$ {OBJECT_DIR}/% .o : $ {SRC_DIR}/% .f90'에서 각 객체를 평가해서는 안됩니다. 이것은 적절한 방법이 아니며, 컴파일되도록 지정된 모든 파일에서 필요한 것을 평가하게합니다. 다른 객체 목록에 대해이 규칙을 얻는 방법이 있다면 지침을 주시면 감사하겠습니다. – RomuloPBenedetti

+0

''제네릭하고 간결한 방법 '- GNU make는 단순히 잘못된 도구입니다. 그래, 그래, 당신은 그것을 달성 할 수 있습니다 - "보조 확장"기능을 사용합니다. GNU make와 비교할 때 훨씬 더 적합한 전통적인 전 처리기를 기반으로하기 때문에, 원하는 것을하기위한 직접적인 수단을 가진 BSD make를 점검 할 것을 조언합니다. – Dummy00001

답변

0

좋아, 나는 그것을 더 조사하고 질문 주석에서 지적한대로, second expansion를 사용하여 나의 문제를 해결하는 것이 가능하다, 나는 text function를 사용하여 그것을 만들었다조차.

#___________________________________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} 

을하지만 ... 난 여전히 문이 안 열려 그림은 왜처럼 대상을 얻을 수 없습니다 : 아무도 대답과 함께 없기 때문에 난 여기가 가져온 거에요

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

${OBJ_DIR} 대상에서 사용하는 경우 확장되지 않았습니다. 이 사건에서 어떤 일이 일어 났는지 설명 할 수 있다면 많이 감사하겠습니다.

의견에받은 제안에 감사드립니다.