编写Makefile时应使用shell别名调用编译器还是使用完整路径?
Makefile中shell别名的生效规则与最佳实践
1. shell别名默认不会在Makefile中生效
- Make默认调用
/bin/sh执行命令,且运行的是非交互模式的shell,绝大多数shell的非交互模式默认关闭别名展开功能,直接写别名会报错“command not found” - 即便手动修改Makefile的
SHELL变量指定为bash,也需要额外开启expand_aliases选项才能让别名生效,示例如下(仅作原理演示,不推荐使用):
# 强制开启别名展开的反例写法 SHELL := /bin/bash .SHELLFLAGS := -O expand_aliases -c demo: alias myls='ls -alh' myls
2. 即使能配置生效,在Makefile中用别名也属于强烈不推荐的实践
原因主要有三点:
- 可移植性极差:别名是用户自定义的环境配置,你的本地环境配置的别名,在其他编译主机、其他用户的环境里大概率不存在或者指向完全不同的命令,会直接导致构建失败
- 可读性极低:其他维护者无法从Makefile内容判断别名对应的实际命令和参数,大幅提升维护成本
- 行为不可控:如果后续环境中的别名定义被修改,Makefile的构建行为会发生预期外的变化,很难排查问题
3. 关于是否要使用命令完整路径的建议
不需要所有命令都硬写完整路径,可以分场景选择:
- 对于
ls、grep、awk这类POSIX标准定义的通用工具,直接写命令名即可,硬写路径反而可能因为不同发行版的命令存放路径不同(比如部分系统命令在/bin,部分在/usr/bin)导致兼容性问题 - 对于版本差异大、可能存在多版本共存的工具(比如
python、gcc、pkg-config),如果需要固定调用指定版本,建议写完整路径,或者通过Makefile的变量统一声明,比如:
# 推荐的写法:通过变量统一声明特殊命令的调用路径 PYTHON := /usr/local/bin/python3.10 build: $(PYTHON) build.py
内容的提问来源于stack exchange,提问作者roulette01
相关产品推荐
相关产品推荐

