我有这个 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壳变量,如调用 的 shell 中所定义make
。
$(fOO)
当您在命令中使用括号(例如)时,您引用的是 make 的变量。
由于您只设置 make 的变量,显然引用同名的 shell 变量将导致空值。
所以$(eval NAME_ONLY=$(shell sh -c "echo $(SOME_NAME)-only))
应该有效。
简单$(eval NAME_ONLY = $(SOME_NAME)-only)
应该遵循规则。您不需要为此调用 shell。
您还可以考虑使用 make文本函数, 喜欢subst
。
答案2
也许.ONESHELL 会实现预期目的。
由于 gnu make 默认为每个配方行启动一个新进程,因此变量设置不会传播到下面的配方。 .ONESHELL 尝试在单个 shell 调用中运行该目标的所有配方
https://www.gnu.org/software/make/manual/make.html#One-Shell .ONESHELL: