条件语句未在 Makefile 函数内进行评估

问题描述 投票:0回答:1

我在 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函数。

function makefile conditional-statements
1个回答
0
投票

条件语句未在 Makefile 函数内进行评估

有点。当解析 makefile 时,条件语句会被解析并“立即”执行。因此,出现在函数体内的任何内容都根据解析函数定义时对其条件的评估来控制函数的实际定义。在扩展对函数的任何调用之前,它们已经具有了所有的效果。

这意味着 ifeq 未正确评估,第二个参数值也未正确检索。

不,这意味着
ifeq

的工作方式与您想象的不同。更一般地说,GNU

make
functions
的工作方式可能与您想象的不同。 make 不是脚本语言。 Makefile 不是脚本。
make
规则不是函数,GNU
make
也不是“函数”,真的。
make
函数——尤其是用户定义的函数——可以更好地描述为参数化
特别是...

Makefile 中的一个函数,用于评估 ifeq 语句中的输入参数

...在 GNU 中是不可能的
make

不要尝试像编写脚本一样编写 makefile。您最终会得到不惯用的 makefile,并且常常会出现严重的问题。特别是,我觉得建议您根本不要使用用户定义的函数

,因为我自己从未发现过这种需要,并且“函数”的想法往往会将人们置于错误的头脑空间中。

问题中提供的信息不足,无法建议您在您的情况下应该做什么,但根据函数的形式进行猜测,我想要么在您现在尝试使用一个规则的地方创建多个规则,要么执行某种扩展基于目标名称可能会起作用。

© www.soinside.com 2019 - 2024. All rights reserved.