2016-07-29 2 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は別のリストを使います。一般的で簡潔な方法で、オブジェクトのコンパイルリストの最後の2つのターゲットを使用できるようにしたいと思います。 '$ {OBJECT_DIR} /%。o:$ {SRC_DIR} /%。f90'のように各オブジェクトを評価するべきではありません。これは適切な方法ではなく、コンパイルするすべてのファイルから必要なものを評価するようにしますか?異なるオブジェクトリストに対してこのルールを取得する方法がある場合、私は指針に感謝します。 – RomuloPBenedetti

+0

'一般的かつ簡潔な方法' - GNU makeはそれのために単に間違ったツールです。ただし、「セカンダリ拡張」機能を使用して、これを達成できます。 GNU makeと比較してはるかに適した従来のプリプロセッサをベースにしているので、あなたが望むことをするための簡単な手段があるBSD makeをチェックすることをお勧めします。 – Dummy00001

答えて

0

[OK]を私はそれをさらに調査し、問題のコメントを指摘したように、私は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}はターゲットで使用されても展開されませんでした。この場合、誰かが何が起こっているのかを説明することができれば、私はとても感謝しています。

私もコメントで受け取った提案に感謝したいと思います。

関連する問題