gpt4 book ai didi

makefile - 从 Makefile 检查程序是否存在

转载 作者:行者123 更新时间:2023-12-03 04:55:33 24 4
gpt4 key购买 nike

如何检查程序是否可从 Makefile 调用?

(也就是说,程序应该存在于路径中或者以其他方式可调用。)

例如,它可用于检查安装了哪个编译器。

例如类似 this question ,但不假设底层 shell 与 POSIX 兼容。

最佳答案

有时,您需要一个 Makefile 才能在不同的目标操作系统上运行,并且如果所需的可执行文件不在 PATH 中,您希望构建尽早失败。而不是在失败之前运行可能很长时间。

engineerchuan提供的优秀解决方案需要制定一个目标。但是,如果您有许多可执行文件要测试,并且您的 Makefile 有许多独立的目标,每个目标都需要测试,那么每个目标都需要测试目标作为依赖项。当您一次创建多个目标时,这会导致大量额外的输入和处理时间。

0xf提供的解决方案可以在不创建目标的情况下测试可执行文件。当有多个目标可以单独或一起构建时,这可以节省大量的输入和执行时间。

我对后一种解决方案的改进是使用which可执行文件(where 在 Windows 中),而不是依赖于 --version每个可执行文件中的选项,直接在 GNU Make ifeq 中指令,而不是定义一个新变量,并使用 GNU Make error如果所需的可执行文件不在 ${PATH} 中,则停止构建的函数。例如,要测试 lzop可执行文件:

 ifeq (, $(shell which lzop))
$(error "No lzop in $(PATH), consider doing apt-get install lzop")
endif

如果您有多个可执行文件需要检查,那么您可能需要使用 foreach功能与 which可执行文件:

EXECUTABLES = ls dd dudu lxop
K := $(foreach exec,$(EXECUTABLES),\
$(if $(shell which $(exec)),some string,$(error "No $(exec) in PATH")))

注意 := 的使用强制立即计算 RHS 表达式所需的赋值运算符。如果您的 Makefile 更改了 PATH ,那么您将需要:

,而不是上面的最后一行
        $(if $(shell PATH=$(PATH) which $(exec)),some string,$(error "No $(exec) in PATH")))

这应该为您提供类似于以下内容的输出:

ads$ make
Makefile:5: *** "No dudu in PATH. Stop.

关于makefile - 从 Makefile 检查程序是否存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5618615/

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