このMakefileがあり、単にいくつかの変数を設定するのに問題があります。
my_stage:
echo "FULL_NAME=$(FULL_NAME)"
echo "MY_NAME=$(MY_NAME)"
$(eval SOME_NAME=$(shell sh -c "echo ${FULL_NAME} | cut -d"-" -f 2"))
echo "SOME_NAME=$(SOME_NAME)"
$(eval NAME_ONLY=$(shell sh -c "echo ${SOME_NAME}-only))
echo "NAME_ONLY=$(NAME_ONLY)"
$(eval RIGHT_NAME=$(shell sh -c "echo ${SOME_NAME}-right))
$(eval NAME_APPENDED=$(shell sh -c "echo ${RIGHT_NAME}.${MY_NAME}))
echo "NAME_APPENDED=$(NAME_APPENDED)"
偽装結果は次のとおりです。
FULL_NAME=Shop-with-me
MY_NAME=Mariana
SOME_NAME=with
NAME_ONLY=with-only
NAME_APPENDED=with-right.Mariana
ただし、現在の結果は次のとおりです。
FULL_NAME=Shop-with-me
MY_NAME=Mariana
SOME_NAME=with
NAME_ONLY=
NAME_APPENDED=
誰かが私が何が起こっているのかを理解するのに役立ちますか?私は何が間違っていましたか?
私もこれを試しましたが(成功しませんでした):
my_stage:
echo "FULL_NAME=$(FULL_NAME)"
echo "MY_NAME=$(MY_NAME)"
$(eval SOME_NAME=$(shell sh -c "echo ${FULL_NAME} | cut -d"-" -f 2"))
echo "SOME_NAME=$(SOME_NAME)"
NAME_ONLY = ${SOME_NAME}-only
echo "NAME_ONLY=$(NAME_ONLY)"
RIGHT_NAME = ${SOME_NAME}-right
NAME_APPENDED = ${RIGHT_NAME}.${MY_NAME}
echo "NAME_APPENDED=$(NAME_APPENDED)"
答え1
${FOO}
コマンドに中かっこ(例:)を使用すると、aaを参照します。シェル呼び出しシェルで定義された変数make
。
$(fOO)
たとえば、コマンドで括弧を使用すると、makeの変数を参照します。
makeの変数のみを設定するので、同じ名前のシェル変数を参照すると、明らかにNULL値が発生します。
だから$(eval NAME_ONLY=$(shell sh -c "echo $(SOME_NAME)-only))
動作する必要があります。
単純さは$(eval NAME_ONLY = $(SOME_NAME)-only)
規則に従うべきです。このためにシェルを呼び出す必要はありません。
makeの使用を検討することもできます。テキスト機能、良いsubst
。
答え2
たぶん.ONESHELLが意図した目的を達成するかもしれません。
gnu makeはデフォルトで各レシピラインに対して新しいプロセスを開始するので、変数設定は次のレシピに伝播されません。 .ONESHELLは、単一のシェル呼び出しでこのターゲットのすべてのレシピを実行しようとします。
https://www.gnu.org/software/make/manual/make.html#One-Shell .ONESHELL: