Makefile赢得';t在函数定义中的'ifeq'语句中分配变量值
当满足条件时,我试图在函数中为Makefile赢得';t在函数定义中的'ifeq'语句中分配变量值,makefile,gnu-make,Makefile,Gnu Make,当满足条件时,我试图在函数中为make中的变量赋值: VARIABLE=true define test_ifeq2 FOO=foo; \ if [ $(VARIABLE) = true ]; then \ FOO=true; else \ FOO=false; \ fi; \ echo $$FOO endef all: $(call test_ifeq2) 在ifeq语句周围没有$(): VARIABLE=true define test_ifeq
make
中的变量赋值:
VARIABLE=true
define test_ifeq2
FOO=foo; \
if [ $(VARIABLE) = true ]; then \
FOO=true; else \
FOO=false; \
fi; \
echo $$FOO
endef
all:
$(call test_ifeq2)
在ifeq
语句周围没有$()
:
VARIABLE=true
define test_ifeq
FOO := foo
ifeq (${VARIABLE}, true)
FOO := true
else
FOO := false
endif
echo "value: ${FOO}"
endef
all:
$(call test_ifeq)
VARIABLE=true
define test_ifeq
$(FOO := foo)
$(ifeq (${VARIABLE}, true)
FOO := true
else
FOO := false
endif)
echo "value: ${FOO}"
endef
all:
$(call test_ifeq)
结果:
FOO := foo
make: FOO: No such file or directory
make: *** [Makefile:15: all] Error 127
echo "value: "
value:
在ifeq
和变量赋值语句周围使用$()
:
VARIABLE=true
define test_ifeq
FOO := foo
ifeq (${VARIABLE}, true)
FOO := true
else
FOO := false
endif
echo "value: ${FOO}"
endef
all:
$(call test_ifeq)
VARIABLE=true
define test_ifeq
$(FOO := foo)
$(ifeq (${VARIABLE}, true)
FOO := true
else
FOO := false
endif)
echo "value: ${FOO}"
endef
all:
$(call test_ifeq)
结果:
FOO := foo
make: FOO: No such file or directory
make: *** [Makefile:15: all] Error 127
echo "value: "
value:
为什么不起作用?当
make
读取makefile
时,会对ifeq
等进行评估,这意味着test\u ifeq
变量的指定值中不存在实际的ifeq
要实现所需功能,您必须使用$(if…
和$(filter…
内置函数以及$(eval…)
它应该是这样的:
VARIABLE=true
define test_ifeq
$(eval FOO := $(if $(filter $(VARIABLE),true), true, false))
echo "value: $(FOO)"
endef
all:
$(call test_ifeq)
注意:我还没有测试过它,只是直接写出来的…要使用Make进行测试:
VARIABLE=true
define test_ifeq
FOO := foo
ifeq (${VARIABLE}, true)
FOO := true
else
FOO := false
endif
$$(info "value: $${FOO}")
endef
$(eval $(call test_ifeq))
要在命令行上执行此操作(假设使用bash):
要在makefile中的规则内执行此操作,请执行以下操作:
all:
VARIABLE=true; \
FOO=foo; \
if [ $$VARIABLE = true ]; then \
FOO=true; else \
FOO=false; \
fi; \
echo $$FOO
要在规则内使用函数执行此操作,请执行以下操作:
VARIABLE=true
define test_ifeq2
FOO=foo; \
if [ $(VARIABLE) = true ]; then \
FOO=true; else \
FOO=false; \
fi; \
echo $$FOO
endef
all:
$(call test_ifeq2)
您似乎混合了Make和shell语法。你想让我做所有这些,还是想把它传给贝壳,放在食谱里?我真的不在乎。我只是想让它发挥作用,但似乎没有办法将字符串与纯make进行比较,或者糟糕的文档没有一个分支和为变量分配不同值的好例子。谢谢!这对我有用。让我重新考虑在长期的构建过程中使用makefile,并转向更像magefile的东西。一旦你超越了hello world的复杂性,Makefile就像是一个邪恶的骗子。我有自己的非递归构建系统,用
GNU make
,检查它的复杂性:)如果你想使用它,有一个很好的教程