【问题标题】:Get exit code 1 on Makefile if statement在 Makefile if 语句中获取退出代码 1
【发布时间】:2012-04-24 05:22:57
【问题描述】:

如果 ifdef 语句不正确,我会尝试获取退出代码,但我尝试使用 exit 1 和 $(call exit 1)

在以下代码中使用第一个时,我得到“Makefile:11: * missing separator. Stop.”

...

ifdef PACKAGE
    PACKAGEDIR = $(HOME)/$(PACKAGE)
else
    exit 1
endif

...

通过使用$(call exit 1),我没有收到任何错误,但makefile 仍然继续执行。 我想要完成的是在 else 上退出 Makefile,错误代码为 1

谢谢

【问题讨论】:

    标签: makefile exit-code


    【解决方案1】:

    正如 geekosaur 所说,您不能将像 exit 1 这样的 shell 命令作为生成文件操作。 Makefile 不是 shell 脚本,尽管它们可以包含 shell 脚本。 Shell 命令只能出现在目标配方中,不能出现在其他任何地方。

    如果你有足够新版本的 GNU make 你可以使用$(error ...) 函数,像这样:

    ifdef PACKAGE
        PACKAGEDIR = $(HOME)/$(PACKAGE)
    else
        $(error You must define the PACKAGE variable)
    endif
    

    还要注意ifdef 将在变量被定义时为真,即使它被定义为空字符串。您可能更喜欢:

    ifneq ($(PACKAGE),)
        PACKAGEDIR = $(HOME)/$(PACKAGE)
    else
        $(error You must define the PACKAGE variable)
    endif
    

    确保变量设置为非空值。

    而且,您的 GNU make 版本可能太旧,无法支持 $(error ...) 函数,尽管它已经存在了很长时间。

    【讨论】:

      【解决方案2】:

      您不能简单地将裸代码粘贴在 Makefile 中的某个位置;代码(例如exit 1)总是与某种构建规则相关联。

      在这种情况下,您需要$(error) function。但是,将它放在else 中可能还不够,原因与exit 1 本身不能在那里工作的原因相同;您可能需要将整件事改写为

      PACKAGEDIR := $(if $(flavor PACKAGE),undefined,$(error PACKAGE must be defined!),$(HOME)/$(PACKAGE))
      

      【讨论】:

      • 仍然不退出错误它继续并将包设置为未定义 - 未定义/来源仅供参考,代码不在目标内
      • 改写后的那个实际上需要在某个地方使用才能触发(对于make,这通常是正确的)。你的“fyi”很困惑;变量定义确实不是目标的一部分,我试图告诉您,您退出的尝试需要处于目标中。表达你想要的内容实际上有些困难,因为你实际上需要在某处强制扩展以触发make 函数(甚至是$(error))。使用:=,因为我已经编辑了答案以提供可能帮助。
      • @Gerardo, $(error )else 分支中为我工作。注意) 之前的空格。您使用的是哪个版本的 Make?
      猜你喜欢
      • 2013-11-26
      • 1970-01-01
      • 1970-01-01
      • 2018-11-23
      • 2016-10-20
      • 2015-03-06
      • 1970-01-01
      • 2015-12-08
      • 1970-01-01
      相关资源
      最近更新 更多