gpt4 book ai didi

makefile - 当有人运行 `make` 时检测(非)GNU Make

转载 作者:行者123 更新时间:2023-12-04 04:29:32 25 4
gpt4 key购买 nike

我有一个项目,它的 makefile 使用了 GNU Make 独有的功能。遗憾的是,在运行 make 时,有些平台我们必须支持 GNU make 仍然不是默认设置。 .

我的一位同事对此深恶痛绝,当非 GNU make 实现默默地无法正确构建我们的代码时(它将自动变量扩展为空字符串)。我想通过生成显式错误消息来防止这种情况再次发生。

我可以在 Makefile 中写什么区分 GNU make 和非 GNU make,打印一个明确的错误,然后退出?

我已经想出了一个解决方法,将我的真实 makefile 重命名为 GNUmakefile ,并将一个小 stub 放入 Makefile ,但我更喜欢更直接的东西。

Beta 和 Dan Molding 的答案看起来非常好和简单,但在 AIX 6.1 上,make 实现无法处理其中任何一个:

$ cat testmake

foo:
touch foo

ifeq ($(shell $(MAKE) -v | grep GNU),)
$(error this is not GNU Make)
endif

ifeq "${MAKE_VERSION}" ""
$(info GNU Make not detected)
$(error ${MIN_MAKE_VER_MSG})
endif


$ /usr/bin/make -f testmake
"testmake", line 5: make: 1254-055 Dependency line needs colon or double colon operator.
"testmake", line 6: make: 1254-055 Dependency line needs colon or double colon operator.
"testmake", line 7: make: 1254-055 Dependency line needs colon or double colon operator.
"testmake", line 8: make: 1254-055 Dependency line needs colon or double colon operator.
"testmake", line 11: make: 1254-055 Dependency line needs colon or double colon operator.
"testmake", line 12: make: 1254-055 Dependency line needs colon or double colon operator.
"testmake", line 13: make: 1254-055 Dependency line needs colon or double colon operator.
make: 1254-058 Fatal errors encountered -- cannot continue.

我在 Sun 的旧版和现代版(Solaris 8 和 10)上都遇到了类似的问题。那个不那么重要,但会很好管理。

最佳答案

如前所述,GNU make检查 GNUmakefile之前 makefileMakefile ,我使用了你描述的一个简单的修复,一个默认的(诱饵)Makefile导致错误/警告:

default:
@echo "This requires GNU make, run gmake instead"
exit 70

GNU make documentation建议使用 GNUmakefile姓名当 Makefile是 GNU 特定的,所以这是我的首选解决方案。

在 native 的平台上 make更喜欢不同的 Makefile 名称,您可以对此进行更改,例如在 FreeBSD 上,我在 BSDmakefile 中有上述诱饵优先使用 Makefile (从而防止系统 make 破坏我的构建)。 AFAICT AIX 或 Solaris make没有可以以这种方式使用的备用名称。

wrapper 的一个问题 Makefile试图调用 GNU make正在传递所有参数。

一个看似可移植的测试(到目前为止,我发现它可以用于古老的 OSF1、BSD 和 Solaris 系统的混合),您可以使用 SOMETHING=$(shell ...)检测 GNU make正在运行,非 GNU 版本将不会设置 SOMETHING .因为 deferred evaluation of variables ,但您无法像预期的那样轻松地使用它。这依赖于在用 $() 扩展时静默处理带空格的宏名称的实现。 (即,将 $(shell foo) 视为变量/宏名称而不是 function ,即使在该实现中分配给这样的名称会导致错误)。

您可以打印明确错误的唯一可移植方式是使用上述技巧始终运行虚拟目标:
GNUMAKE=$(shell echo GNUMAKE)

default: gnumake all

gnumake:
@[ "$(GNUMAKE)" = "GNUMAKE" ] || { echo GNU make required ; exit 70; }

这假设您有一个 POSIX sh shell 。

(我见过检查 $(MAKE) -v 的测试在 system 和 GNU make 都被称为“ make”时失败,系统 make 密谋反对你并调用 GNU make ......你需要仔细检查环境变量 PATHMAKE 和可能的 SHELL 来处理每种情况。)

关于makefile - 当有人运行 `make` 时检测(非)GNU Make,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3401316/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com