在Makefile中查找适当的可执行文件

在Makefile中查找适当的可执行文件,makefile,Makefile,我正在编写一个Makefile,它需要执行通常由操作系统提供的程序foo1。某些操作系统使用不同的名称提供此二进制文件,foo2 我试图找出如何最好地测试正确的可执行文件,如果两者都不存在的话,就存在。我有过一些方法,但它们看起来都很丑陋,我想可能有一种更合适的方法来做到这一点 我试过这个: FOO = $(shell which foo foo2) target: @which $(FOO) > /dev/null $(FOO) 我觉得这不是很优雅,因为如果系统上同时存在

我正在编写一个Makefile,它需要执行通常由操作系统提供的程序
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)