在Makefile中查找适当的可执行文件
我正在编写一个Makefile,它需要执行通常由操作系统提供的程序在Makefile中查找适当的可执行文件,makefile,Makefile,我正在编写一个Makefile,它需要执行通常由操作系统提供的程序foo1。某些操作系统使用不同的名称提供此二进制文件,foo2 我试图找出如何最好地测试正确的可执行文件,如果两者都不存在的话,就存在。我有过一些方法,但它们看起来都很丑陋,我想可能有一种更合适的方法来做到这一点 我试过这个: FOO = $(shell which foo foo2) target: @which $(FOO) > /dev/null $(FOO) 我觉得这不是很优雅,因为如果系统上同时存在
foo1
。某些操作系统使用不同的名称提供此二进制文件,foo2
我试图找出如何最好地测试正确的可执行文件,如果两者都不存在的话,就存在。我有过一些方法,但它们看起来都很丑陋,我想可能有一种更合适的方法来做到这一点
我试过这个:
FOO = $(shell which foo foo2)
target:
@which $(FOO) > /dev/null
$(FOO)
我觉得这不是很优雅,因为如果系统上同时存在foo
和foo2
,那么将实际返回两行。同样奇怪的是,我调用了两次which
,当我没有将任何内容传递给第二个which
时,我依赖于发出的错误
简言之,有什么更好的方法吗?比如:
FOO := $(firstword $(shell which foo foo1))
ifeq ($(FOO),)
$(error Cannot find foo or foo1)
endif
target:
$(FOO)
或者,如果您不喜欢使用make的error
功能,您可以使用:
target:
@[ -n "$(FOO)" ] || { echo "Cannot find foo or foo1"; exit 1; }
注意:如果您的路径中有任何路径名,且路径名中有空格,则此操作将不起作用。。。但无论如何,这是一个更大的问题要解决。FOO=$(shell哪个FOO-foo2-false | head-1)
?