带条件的功能的Makefile用法

时间:2018-10-14 18:44:30

标签: linux bash shell gnu-make gnu

我的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获取falseommand的函数,如果获取false,它将exit流程(即,如果继续,则不执行下一个命令,如果为true则继续执行该流程)如何简单并向前推进

3 个答案:

答案 0 :(得分:2)

  

我的gnu make文件中有一些返回true或false的命令

apps := $(shell zmr build app)
     

现在,我想增强那些命令,使其还返回布尔值,表示true为false

apps,isValid := $(shell zmr build app)
     

如果isValid等于虚假使用,则退出制造商

假设您的zmr build ...命令输出truefalse,则可以通过以下方式退出make

ifeq (${apps,isValid},false)
$(error app not valid)
endif

make不了解数据类型,因此truefalse只是字符串。

我不知道您的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),该工具将使您完全满足您的需求,并且更易读。

如果您需要帮助,请告诉我。