makefile - 具有多个语句的 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 甚至都没有设置。
有人可以告诉我为什么我的功能无法正常工作以及我必须进行哪些更改才能解决这些问题?
解决方案
引用eval 手册页:
该
eval
函数非常特殊:[...]函数的参数eval
被扩展,然后该扩展的结果被解析为 makefile 语法。重要的是要认识到
eval
论点被扩展了两次;首先由eval
函数,然后当它们被解析为 makefile 语法时,再次扩展该扩展的结果。这意味着您可能需要在使用eval
.
这发生在$(call)
参数被替换之后,所以$1
etc 在$(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)
.
不清楚res1
和res2
是否是变量名或值;根据这一点,最后两个作业需要或不需要看起来像$(1) := $($(4))
.
尝试始终使用急切的赋值::=
,以减少惰性变量扩展带来的意外。
推荐阅读
- php - 如何在sql中获取两个给定日期之间的日期
- ruby-on-rails - 为什么捆绑器在寻找 mysql2 -v '0.4.4' --source 'https://rubygems.org/'
- java - java中的泛型方法来总结给定列表中的所有值,无论它是String,int,double
- r - r - 按数据框中的数值过滤字母数字因子列
- spring - Spring MVC 中最好的 HandlerMapping 是什么?
- jquery - fancybox V3 + isotope 排序依据
- vba - 将多个文本框值传输到数组
- php - 替换 HTML 标记内外的文本
- sqlalchemy - 在 Alembic + SQLAlchemy 中使用反射表进行自动迁移
- python - 如何从列表列表和另一个列表创建字典?