我的gnu make文件中有一些返回true或false的命令
类似的命令
apps := $(shell zmr build app)
...more code
service := $(shell zmr build service)
...
target := $(shell zmr build target)
现在,我想增强那些命令,使其还返回布尔值,表示true为false
apps,isValid := $(shell zmr build app)
...
service,isValid := $(shell zmr build service)
...
target,isValid := $(shell zmr build target)
如果isValie
等于假,何时在制作中使用退出?
我尝试阅读有关以下功能的信息 https://www.gnu.org/software/make/manual/html_node/Conditional-Functions.html#Conditional-Functions
或 https://www.gnu.org/software/make/manual/html_node/Eval-Function.html#Eval-Function
但不确定这是否正确...任何示例如何正确处理都会对我有帮助,我对选项有些失落
我尝试了以下答案,但均未成功,是否知道如何在makefile
中使用它?
更新-
我想在我的GNU MAKE中使用一个从c true
获取false
或ommand
的函数,如果获取false
,它将exit
流程(即,如果继续,则不执行下一个命令,如果为true则继续执行该流程)如何简单并向前推进
答案 0 :(得分:2)
我的gnu make文件中有一些返回true或false的命令
apps := $(shell zmr build app)
现在,我想增强那些命令,使其还返回布尔值,表示true为false
apps,isValid := $(shell zmr build app)
如果
isValid
等于虚假使用,则退出制造商
假设您的zmr build ...
命令输出true
或false
,则可以通过以下方式退出make
ifeq (${apps,isValid},false)
$(error app not valid)
endif
make
不了解数据类型,因此true
和false
只是字符串。
我不知道您的zmr build
的语义,但听起来它会做一些昂贵的事情... $(shell ...)
操作通常仅用于运行时间短的命令,没有副作用。最好将isValid
放在目标中
apps,isValid:
zmr build app
make
将在此命令失败时自动失败。
答案 1 :(得分:2)
嗯,从风格上讲,我会尽量不要使用$(shell …)
并尽可能使用食谱。
话虽如此, 可以按照您的要求做。 我只是假设最后一个词就是状态。
output := $(shell zmr build app && echo t || echo f)
如果命令成功,此处t
将附加到zmr
的输出中。
否则,将附加f
。
现在,我们只需去除最后一个单词即可将状态与命令输出分开。
retcode := $(lastword ${output})
apps := $(words 2,$(words ${output}),x ${output})
$(if $(filter f,${retcode}),$(error apps failed))
答案 2 :(得分:1)
您的需求已经非常先进,无法仅在make文件中进行管理。
您可以考虑使用诸如autoconf之类的工具(请参阅https://www.gnu.org/software/autoconf/autoconf.html),该工具将使您完全满足您的需求,并且更易读。
如果您需要帮助,请告诉我。