试图在 Makefile 目标中实现循环
Trying to implement a loop in Makefile target
这是我的目标,我想 运行 为列表变量中的每个元素创建一个循环。
问题是循环 运行s 但 test
变量值被传递为空
list = mlflow emr
common=$(someDir)/common
.PHONY:build
build:
for var in $(list); do \
cd ${common}; \
test=$(git diff --name-only --diff-filter=AM master | grep ^$(var)/); \
if [ "$(test)" != "" ]; then \
echo "condition met"; \
else \
echo "It is Not Setup"; \
fi \
done
错误:
bash-5.0# sudo make build n=1
for var in mlflow emr; do \
cd /mak/epa-toolchain/common; \
test=; \
if [ "" != "" ]; then \
echo "condition met"; \
else \
echo "It is Not Setup"; \
fi \
done
It is Not Setup
It is Not Setup
$
是一个特殊的 make 字符:它引入了一个 make 变量引用。所以这个:
$(git diff --name-only --diff-filter=AM master | grep ^$(var)/)
不是 shell $(...)
命令,它是一个名字很奇怪的 make 变量。无论你想让 shell 看到 $
,你都必须将它转义为 $$
:
$$(git diff --name-only --diff-filter=AM master | grep ^$$var/)
(请注意,您必须将 $(var)
更改为 $$var
,因为前者是对 make 变量 var
的引用,但您在 shell 中循环设置 shell 变量 var
).
同上:
if [ "$(test)" != "" ]; then \
必须是:
if [ "$$test" != "" ]; then \
因为 test
是一个 shell 变量,而不是 make 变量。
这是我的目标,我想 运行 为列表变量中的每个元素创建一个循环。
问题是循环 运行s 但 test
变量值被传递为空
list = mlflow emr
common=$(someDir)/common
.PHONY:build
build:
for var in $(list); do \
cd ${common}; \
test=$(git diff --name-only --diff-filter=AM master | grep ^$(var)/); \
if [ "$(test)" != "" ]; then \
echo "condition met"; \
else \
echo "It is Not Setup"; \
fi \
done
错误:
bash-5.0# sudo make build n=1
for var in mlflow emr; do \
cd /mak/epa-toolchain/common; \
test=; \
if [ "" != "" ]; then \
echo "condition met"; \
else \
echo "It is Not Setup"; \
fi \
done
It is Not Setup
It is Not Setup
$
是一个特殊的 make 字符:它引入了一个 make 变量引用。所以这个:
$(git diff --name-only --diff-filter=AM master | grep ^$(var)/)
不是 shell $(...)
命令,它是一个名字很奇怪的 make 变量。无论你想让 shell 看到 $
,你都必须将它转义为 $$
:
$$(git diff --name-only --diff-filter=AM master | grep ^$$var/)
(请注意,您必须将 $(var)
更改为 $$var
,因为前者是对 make 变量 var
的引用,但您在 shell 中循环设置 shell 变量 var
).
同上:
if [ "$(test)" != "" ]; then \
必须是:
if [ "$$test" != "" ]; then \
因为 test
是一个 shell 变量,而不是 make 变量。