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] $<
'$ {OBJECT_FILES}'はファイルの解析中に展開され、対応する '$(eval)'は '' test ''ターゲットが実行されたときに評価されます。動的コンテンツを持たないものを本当に '$(eval)'する必要がありますか?通常の方法で変数を定義するだけで動作するはずです。 – Dummy00001
これはmakefileの一部であり、testingは私が持っているmakeコンパイルルールの一つで、 'Test _%.f90'ファイルを使う唯一のものです。例えば、debugとreleaseは別のリストを使います。一般的で簡潔な方法で、オブジェクトのコンパイルリストの最後の2つのターゲットを使用できるようにしたいと思います。 '$ {OBJECT_DIR} /%。o:$ {SRC_DIR} /%。f90'のように各オブジェクトを評価するべきではありません。これは適切な方法ではなく、コンパイルするすべてのファイルから必要なものを評価するようにしますか?異なるオブジェクトリストに対してこのルールを取得する方法がある場合、私は指針に感謝します。 – RomuloPBenedetti
'一般的かつ簡潔な方法' - GNU makeはそれのために単に間違ったツールです。ただし、「セカンダリ拡張」機能を使用して、これを達成できます。 GNU makeと比較してはるかに適した従来のプリプロセッサをベースにしているので、あなたが望むことをするための簡単な手段があるBSD makeをチェックすることをお勧めします。 – Dummy00001