检查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