在 Makefile 目标中测试一个变量
Test a variable in Makefile target
我试图让它工作,但变量似乎没有正确传递给 if 语句,因为它没有“进入”if 循环
apply_test:
$(eval var=$(shell bash -c "echo 1"))
echo $(var)
ifeq ($(var),1)
echo "inside the stmt"
$(eval var=$(shell bash -c "echo 2"))
endif
echo $(var)
一般来说,我会尝试评估函数的return值,以执行后续的条件设置,例如在 if-stmt 中设置一个新变量。
我的方法有什么问题?
我的意思是,这里几乎所有的东西都有问题:)。您还没有对为什么 尝试做如此复杂的事情给出任何解释,但专家提示:
- 任何时候你在食谱中使用
ifeq
等 make 条件,它很可能不会做你想做的,除非你非常确定你完全理解 makefile 的扩展规则.
- 任何时候你在食谱中使用
$(shell ...)
,这几乎总是一个坏主意。
- 任何时候你在食谱中使用
$(eval ...)
,这几乎 100% 绝对是个坏主意。
然而,只处理您眼前的问题:ifeq
在 解析 时处理 makefile。直到整个 makefile 被解析并且 make 决定将哪些目标 运行 之后,食谱才会 运行。因此,当 make 解析 makefile 并查看 ifeq
时,变量 var
尚未设置,因此它的计算结果为空字符串并且永远不会等于 1
.
预计到达时间
在不了解您的要求的情况下,我会说实现此目的的“正确”方法是在配方中使用 shell 操作。看起来像这样:
apply_test:
var=$$(echo 1) ; \
echo $$var; \
if [ $$var = 1 ]; then \
echo "inside the stmt"; \
var=$$(echo 2); \
fi; \
echo $$var
我试图让它工作,但变量似乎没有正确传递给 if 语句,因为它没有“进入”if 循环
apply_test:
$(eval var=$(shell bash -c "echo 1"))
echo $(var)
ifeq ($(var),1)
echo "inside the stmt"
$(eval var=$(shell bash -c "echo 2"))
endif
echo $(var)
一般来说,我会尝试评估函数的return值,以执行后续的条件设置,例如在 if-stmt 中设置一个新变量。
我的方法有什么问题?
我的意思是,这里几乎所有的东西都有问题:)。您还没有对为什么 尝试做如此复杂的事情给出任何解释,但专家提示:
- 任何时候你在食谱中使用
ifeq
等 make 条件,它很可能不会做你想做的,除非你非常确定你完全理解 makefile 的扩展规则. - 任何时候你在食谱中使用
$(shell ...)
,这几乎总是一个坏主意。 - 任何时候你在食谱中使用
$(eval ...)
,这几乎 100% 绝对是个坏主意。
然而,只处理您眼前的问题:ifeq
在 解析 时处理 makefile。直到整个 makefile 被解析并且 make 决定将哪些目标 运行 之后,食谱才会 运行。因此,当 make 解析 makefile 并查看 ifeq
时,变量 var
尚未设置,因此它的计算结果为空字符串并且永远不会等于 1
.
预计到达时间
在不了解您的要求的情况下,我会说实现此目的的“正确”方法是在配方中使用 shell 操作。看起来像这样:
apply_test:
var=$$(echo 1) ; \
echo $$var; \
if [ $$var = 1 ]; then \
echo "inside the stmt"; \
var=$$(echo 2); \
fi; \
echo $$var