대상에서 평가할 매크로가 필요하지만 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] $<
'$ {OBJECT_FILES}'는 파일 분석 중에 확장 될 것이고''$ '(eval)'은 "test"타겟이 실행될 때 평가 될 것입니다. 동적 콘텐츠가없는 것을'$ (eval) '해야합니까? 변수를 일반적인 방법으로 정의하면 효과가 있습니다. – Dummy00001
이것은 makefile의 일부이며 testing은 내가 가지고있는 make 컴파일 규칙 중 하나이며'Test _ %. f90' 파일을 사용하는 유일한 것입니다. 예를 들어 debug와 release는 다른 requisites 목록을 사용합니다. 일반적이고 간결한 방법으로 개체의 컴파일 목록에 대해 두 개의 마지막 대상을 사용할 수 있습니다. 나는'$ {OBJECT_DIR}/% .o : $ {SRC_DIR}/% .f90'에서 각 객체를 평가해서는 안됩니다. 이것은 적절한 방법이 아니며, 컴파일되도록 지정된 모든 파일에서 필요한 것을 평가하게합니다. 다른 객체 목록에 대해이 규칙을 얻는 방법이 있다면 지침을 주시면 감사하겠습니다. – RomuloPBenedetti
''제네릭하고 간결한 방법 '- GNU make는 단순히 잘못된 도구입니다. 그래, 그래, 당신은 그것을 달성 할 수 있습니다 - "보조 확장"기능을 사용합니다. GNU make와 비교할 때 훨씬 더 적합한 전통적인 전 처리기를 기반으로하기 때문에, 원하는 것을하기위한 직접적인 수단을 가진 BSD make를 점검 할 것을 조언합니다. – Dummy00001