首页 > 解决方案 > 具有多个语句的 Makefile 函数

问题描述

[HEADS UP]:stackoverflow 上已经存在一些类似的问题,但它们似乎并不能完全解决我的问题。因此,我发布了这个问题。

我正在尝试编写一个 makefile 函数,该函数应该为作为参数传递给函数的变量设置一个值。
所以,我称这个函数为 -

RESULT :=
$(eval $(call myfunction,RESULT,value,res1,res2))

这里'res1'和'res2'是RESULT的两个可能的结果值,参数'value'将用于某些测试条件。

以下是我对 myfunction 定义的尝试。但它似乎不起作用。

define myfunction
TEST1 := $(shell test `mybinary` -ge 5 && printf "TEST")
TEST2 := $(findstring $(2),$(SOME_SHELL_ENV))
$(info "$(TEST1)")
$(info "$(TEST2)")

ifneq "$$(or $(TEST1),$(TEST2)" ""
    LOCAL_RESULT := true
else
    LOCAL_RESULT := false
endif

ifeq($(LOCAL_RESULT),true)
    $(1) = $(3)
else
    $(1) = $(4)
endif
endef

在我看来,局部变量 TEST1 和 TEST2 甚至都没有设置。

有人可以告诉我为什么我的功能无法正常工作以及我必须进行哪些更改才能解决这些问题?

标签: makefilegnu-make

解决方案


引用eval 手册页

eval函数非常特殊:[...]函数的参数eval被扩展,然后该扩展的结果被解析为 makefile 语法。

重要的是要认识到eval论点被扩展了两次;首先由eval函数,然后当它们被解析为 makefile 语法时,再次扩展该扩展的结果。这意味着您可能需要在使用eval.

这发生在$(call)参数被替换之后,所以$1etc 在$(eval)被调用时已经被扩展,并且不需要被$-escaped。

要使变量在 的最后(解析)阶段扩展,请通过将非数字变量加倍来$(eval)转义它们。$

define myfunction
TEST1 := $$(shell test `echo 6` -ge 5 && printf "TEST")
TEST2 := $$(findstring $(2),$$(PATH))
$$(info "$$(TEST1)")
$$(info "$$(TEST2)")

ifneq "$$(or $$(TEST1),$$(TEST2))" ""
    LOCAL_RESULT := true
else
    LOCAL_RESULT := false
endif

ifeq ($$(LOCAL_RESULT), true)
    $(1) = $(3)
else
    $(1) = $(4)
endif
endef

$(eval $(call myfunction,RESULT,value,res1,res2))
test:
    echo "$(LOCAL_RESULT)"

另外,您在$(or).

不清楚res1res2是否是变量名或值;根据这一点,最后两个作业需要或不需要看起来像$(1) := $($(4)).

尝试始终使用急切的赋值::=,以减少惰性变量扩展带来的意外。


推荐阅读