gmake函数/ ifneq / else / endif

时间:2018-07-17 00:44:01

标签: function gnu-make

我正在尝试创建一个函数,该函数将确定目录是否存在,如果存在,则将目标添加到所有列表中。但是出了点问题。这是Makefile代码段:

define buildMQ  
    $(info ****     Checking to see if the MQ series directory exist     *****)  
    ifneq "$(wildcard $(MQ_DIR) )" ""   
        $(info /opt/mqm was found)  
        MQ_APPS=MQSAPP  
    else  
        $(error $n$n****     ERROR - The MQ Series direcory: "$(MQ_DIR)" does not exist     ******$n$n)
   endif 
endef

ifeq ('$(FN)' , 'TEST')
    TEST_APPS= 
endif

ifeq ('$(FN)' , 'ONSITE_TEST')
   ONSITE_TEST_APPS=  # insert ONSITE_TEST only apps here
   $(call buildMQ)
endif
ifeq ('$(FN)' , 'ACCOUNT')
    ACCOUNT_APPS=  
    $(call buildMQ)
endif
all:$(COMMON_APPS) $(TEST_APPS) $(ONSITE_TEST_APPS) $(ACCOUNT_APPS) $(MQ_APPS) makexit

当我用FN = ONSITE_TEST运行它时:

****     Checking to see if the MQ series directory exist     *****
/opt/mqm was found
Makefile:128: *** 

****     ERROR - The MQ Series direcory: "/opt/mqm" does not exist     ******

如何打印两个打印语句?我想念什么?
目录确实存在

1 个答案:

答案 0 :(得分:1)

这里how call works有很多误解。 call函数采用变量(名称)以及零个或多个参数。它将参数分配给$1$2等,然后扩展变量。

请注意,此处的“扩展”并不是指“将变量值解释为好像是一个makefile”。我们的意思很简单,请遍历变量的值,找到所有make变量和函数,然后将其替换为适当的值。

因此,您调用$(call buildMQ)。因为您没有提供任何参数,所以不会为$1分配任何值:实际上,这与使用$(buildMQ)完全相同; call函数在这里没有影响。

因此make扩展buildMQ变量的值...基本上,它将值当作一个长字符串:

$(info ****     Checking to see if the MQ series directory exist     *****) ifneq "$(wildcard $(MQ_DIR) )" "" $(info /opt/mqm was found) MQ_APPS=MQSAPP else $(error $n$n****     ERROR - The MQ Series direcory: "$(MQ_DIR)" does not exist     ******$n$n) endif

并将其展开。因此,它首先扩展$(info ... Checking ...函数并进行打印。然后,它展开$(wildcard ..)并将其替换。然后,展开$(info /opt/mqm ...)并进行打印。然后,它展开$(error ...)并显示消息并退出。

如果尚未退出,则将出现语法错误,因为call之类的函数无法扩展为多行语句;如上所述,它的评估结果不像一组makefile行。它必须扩展到单个值的makefile行。

如果要让make像解析makefile一样解析变量的内容,则需要使用the eval functioneval不需要变量名,而需要解析字符串,所以它将是:

$(eval $(buildMQ))

但是,由于相同的原因,它不会做您想要的事情:它会扩展buildMQ变量,并导致所有功能首先被扩展,甚至在eval尚未看到它们之前。

一种选择是转义buildMQ中所有引用的变量和函数。但是根据您的情况,一个更简单的解决方案是在eval看到值之前使用the value function来防止扩展:

$(eval $(value buildMQ))