【问题标题】:Makefile usage of function with conditionalMakefile 使用条件函数
【发布时间】:2018-10-14 18:44:30
【问题描述】:

我的 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 等于false,则在make 中使用exit

我尝试阅读以下功能 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 中使用一个函数,它从 command 获取 truefalse,如果获取 false 它将 exit 生成过程(即不继续下一个命令,如果为真,则继续该过程)如何完成简单并向前推进

【问题讨论】:

  • 你能画出zmr 命令的输出吗?是带分隔符的字符串吗?

标签: linux bash shell gnu-make gnu


【解决方案1】:

嗯,就风格而言,我会尽量不使用$(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】:

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

    apps := $(shell zmr build app)
    

    现在我想增强这些命令以返回布尔值以表示 true 或 false

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

    如果 isValid 等于 false,则在 make 中使用 exit

    假设您的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会在这条命令失败时自动失败。

    【讨论】:

    • 嗨,$(error app not valid) 是什么,我只想退出以防isValidfalse
    • 谢谢我尝试第一个选项但没有成功...有什么想法吗?
    【解决方案3】:

    您的需求已经太高了,无法仅在 make 文件中进行管理。

    您可以考虑使用 autoconf 之类的工具(请参阅。https://www.gnu.org/software/autoconf/autoconf.html),它可以让您完美地满足您的需求,结果更清晰。

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

    【讨论】:

      猜你喜欢
      • 2022-01-08
      • 2021-06-21
      • 1970-01-01
      • 2011-04-24
      • 1970-01-01
      • 2019-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多