You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Makefile中自动选择系统可用的可执行文件变体

在Makefile中单行匹配可用的可执行文件

你可以通过一行Shell命令组合实现需求,无需编写多段ifneq判断,同时还能处理别名的情况:

基础版本(包含别名)

如果允许匹配别名,可使用command -v检查:

PROG := $(shell for cmd in foo foo.ruby2.7; do command -v $$cmd >/dev/null 2>&1 && echo $$cmd && break; done)

runit:
	$(PROG) $(OPTIONS)

这段命令会遍历候选命令列表,找到第一个系统中存在的命令(包括别名),将其赋值给PROG变量。

排除别名的版本(仅匹配实际可执行文件)

如果需要跳过别名、Shell函数,只匹配PATH中的实际可执行文件,改用type -P:

PROG := $(shell for cmd in foo foo.ruby2.7; do [ -n "$$(type -P $$cmd)" ] && echo $$cmd && break; done)

runit:
	$(PROG) $(OPTIONS)

type -P会直接返回可执行文件的绝对路径(不存在则返回空),通过判断返回值是否非空,确保只选取真实存在的可执行文件,避免匹配到别名。

对比多段判断的优势

这种单行写法比多段ifneq更简洁,尤其是当候选命令数量较多时,能大幅减少代码量,同时逻辑清晰易维护。

内容的提问来源于stack exchange,提问作者vijayvithal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 10:22:06