3

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

在以下代码中使用第一个时,我得到“Makefile:11:*缺少分隔符。停止。”

...

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

...

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

谢谢

4

2 回答 2

5

正如 geekosaur 所说,您不能像exit 1makefile 操作那样放置 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 ...)功能,尽管它已经存在了很长时间。

于 2012-04-24T14:09:18.827 回答
0

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

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

PACKAGEDIR := $(if $(flavor PACKAGE),undefined,$(error PACKAGE must be defined!),$(HOME)/$(PACKAGE))
于 2012-04-24T05:28:26.137 回答