我在 Makefile 中有一个函数,我试图在 ifeq 语句中评估输入参数,如下所示:
define set_target_dts
ifeq ($(1),virgo)
@echo "Building for Virgo"
ifeq ($(2),soc_prototype)
@echo "Building for soc prototype"
DTS_FILE_NAME := virgo_soc_proto.dts
else
@echo "Building for soc"
DTS_FILE_NAME := virgo.dts
endif
else ifeq ($(1),gemini)
@echo "Building for Gemini"
ifeq ($(2),soc_prototype)
DTS_FILE_NAME := gemini_soc_proto.dts
else
DTS_FILE_NAME := gemini.dts
endif
else
$(info Selected Target is:$(1) $(2))
$(error Please select the correct target...)
endif
endef
每当我使用
调用此函数时$(call set_target_dts,virgo,soc_prototype)
它向我抛出了这个错误:
Selected Target is:virgo soc
Makefile:48: *** Please select the correct target.... Stop.
这意味着 ifeq 未正确评估,第二个参数值也未正确检索。
请指导我纠正我的错误。我以前从未制作过Makefile函数。
条件语句未在 Makefile 函数内进行评估
有点。当解析 makefile 时,条件语句会被解析并“立即”执行。因此,出现在函数体内的任何内容都根据解析函数定义时对其条件的评估来控制函数的实际定义。在扩展对函数的任何调用之前,它们已经具有了所有的效果。
这意味着 ifeq 未正确评估,第二个参数值也未正确检索。不,这意味着
ifeq
的工作方式与您想象的不同。更一般地说,GNU
make
functions的工作方式可能与您想象的不同。
make
不是脚本语言。 Makefile 不是脚本。 make
规则不是函数,GNU make
也不是“函数”,真的。 make
函数——尤其是用户定义的函数——可以更好地描述为参数化宏。 特别是...
Makefile 中的一个函数,用于评估 ifeq 语句中的输入参数
...在 GNU 中是不可能的
make
。
不要尝试像编写脚本一样编写 makefile。您最终会得到不惯用的 makefile,并且常常会出现严重的问题。特别是,我觉得建议您根本不要使用用户定义的函数,因为我自己从未发现过这种需要,并且“函数”的想法往往会将人们置于错误的头脑空间中。问题中提供的信息不足,无法建议您在您的情况下应该做什么,但根据函数的形式进行猜测,我想要么在您现在尝试使用一个规则的地方创建多个规则,要么执行某种扩展基于目标名称可能会起作用。