0
我需要一些宏來對目標進行評估,但是我不能讓OBJECT_FILE
被$^aparently評估。這是我的makefile:在makefile中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)'將在執行「測試」目標時進行評估,這會在稍後發生。你真的需要'$(eval)'這個沒有任何動態內容的東西嗎?只需按照通常的方式定義變量,它就可以工作。 – Dummy00001
這只是makefile的一部分,測試是我編譯規則之一,是唯一使用'Test _%。f90'文件的,調試和發佈使用不同的必備條件列表。我想要一個通用而簡潔的方式,這樣我就可以將最後兩個目標用於任何對象的編譯列表。我不應該評估每個對象,如:$ {OBJECT_DIR} /%。o:$ {SRC_DIR} /%。f90'。這不是一個合適的方法,讓我們從指定要編譯的所有文件中評估需要什麼?如果有辦法讓不同的對象列表得到這個規則,我將不勝感激。 – RomuloPBenedetti
'一個通用和簡潔的方式' - GNU make只是錯誤的工具。雖然,是的,您可以使用「輔助擴展」功能來實現這一點。我建議檢查一下BSD make,它有簡單的方法來做你想做的事情,因爲它基於傳統的預處理器,與GNU make相比,它更適合這樣的事情。 – Dummy00001