我正在编写一个需要执行程序foo1
的Makefile,它通常由操作系统提供。某些操作系统为此二进制文件提供了不同的名称foo2
。
我正在试图弄清楚如何最好地测试正确的可执行文件,如果两者都不存在则存在。我有一些方法,但它们看起来都很难看,我想可能有更合适的方法来做到这一点。
我试过了:
FOO = $(shell which foo foo2)
target:
@which $(FOO) > /dev/null
$(FOO)
我发现这不是很优雅,因为如果系统中同时存在foo
和foo2
,which
实际上会返回两行。我调用which
两次并且当我没有将任何内容传递给第二个which
时依赖于发出的错误也很奇怪。
简而言之,有什么更好的方式?
答案 0 :(得分:1)
如下:
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; }
请注意,如果您的PATH
中有任何包含空格的路径名,则此功能无效...但无论如何这都是一个要解决的问题。