检查Makefile中是否存在程序

我怎样才能检查一个程序是否可以从Makefile中调用?

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

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

例如像这个问题,但没有假设底层外壳是POSIX兼容的。


我将@kenorb和@ 0xF的解决方案混合在一起,并得到了以下结果:

DOT := $(shell command -v dot 2> /dev/null)

all:
ifndef DOT
    $(error "dot is not available please install graphviz")
endif
    dot -Tpdf -o pres.pdf pres.dot 

它的工作原理非常好,因为如果可执行文件不可用,“command -v”不会打印任何内容,所以变量DOT永远不会被定义,您可以随时在代码中检查它。 在这个例子中,我抛出了一个错误,但是如果你愿意,你可以做一些更有用的事情。

如果变量可用,“command -v”执行打印命令路径的廉价操作,定义DOT变量。


这是你做的吗?

check: PYTHON-exists
PYTHON-exists: ; @which python > /dev/null
mytarget: check
.PHONY: check PYTHON-exists

信贷给我的同事。


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

工程师提供的优秀解决方案需要制定目标 。 但是,如果您有许多可执行文件需要测试,并且makefile有许多独立目标,而每个目标都需要测试,那么每个目标都需要测试目标作为依赖项。 当您一次制作多个目标时,这会导致大量额外的打字以及处理时间。

由0xf提供的解决方案可以测试可执行文件而无需创建目标。 这样可以节省大量的打字和执行时间,当有多个目标可以单独构建或一起构建时。

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

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

如果您有几个可执行文件需要检查,那么您可能需要使用which可执行文件使用foreach函数:

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.
链接地址: http://www.djcxy.com/p/57059.html

上一篇: Check if a program exists from a Makefile

下一篇: Clean way to launch the web browser from shell script?