有时您需要一个 Makefile 才能在不同的目标操作系统上运行,并且如果所需的可执行文件不在 PATH 中,您希望构建尽早失败,而不是在失败之前运行很长时间。
engineerchuan 提供的出色解决方案需要制定一个目标。但是,如果您有许多可执行文件要测试并且您的 Makefile 有许多独立的目标,每个目标都需要测试,那么每个目标都需要测试目标作为依赖项。当您一次制作多个目标时,这会导致大量额外的输入和处理时间。
0xf 提供的解决方案可以在不创建目标的情况下测试可执行文件。当有多个可以单独或一起构建的目标时,这可以节省大量的输入和执行时间。
我对后一种解决方案的改进是使用which 可执行文件(Windows 中的where),而不是依赖于每个可执行文件中有一个--version 选项,直接在GNU Make ifeq 指令中,而不是定义一个新变量,如果所需的可执行文件不在${PATH} 中,则使用 GNU Make error 函数停止构建。例如,测试lzop 可执行文件:
ifeq (, $(shell which lzop))
$(error "No lzop in $(PATH), consider doing apt-get install lzop")
endif
如果您要检查多个可执行文件,那么您可能希望将foreach 函数与which 可执行文件一起使用:
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.