在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
相关产品推荐
相关产品推荐

