我正在尝试创建一个函数,该函数将确定目录是否存在,如果存在,则将目标添加到所有列表中。但是出了点问题。这是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 ******
如何打印两个打印语句?我想念什么?
目录确实存在
答案 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
function。 eval
不需要变量名,而需要解析字符串,所以它将是:
$(eval $(buildMQ))
但是,由于相同的原因,它不会做您想要的事情:它会扩展buildMQ
变量,并导致所有功能首先被扩展,甚至在eval
尚未看到它们之前。
一种选择是转义buildMQ
中所有引用的变量和函数。但是根据您的情况,一个更简单的解决方案是在eval
看到值之前使用the value
function来防止扩展:
$(eval $(value buildMQ))