Makefile读取文件为变量列表失败及多Python版本调用方案咨询
问题原因
GNU Make的$(file)函数是Make 4.0及以上版本才新增的特性,CentOS 7.9自带的Make版本为3.82,不支持该函数,因此INSTALLED_PYTHON_VERSIONS变量被赋值为空,导致后续循环执行失效。
针对当前方案的修复
将读取配置文件的语句替换为兼容Make 3.82的写法,使用shell命令读取文件内容:
CONFIGURED_FILE=configured.dat # 用shell的cat命令替代不兼容的$(file)函数 INSTALLED_PYTHON_VERSIONS := $(shell cat $(CONFIGURED_FILE))
该写法在Make 3.82及更高版本中均可正常工作。
多Python版本执行pip的替代方案
方案1:自动探测系统可用Python版本
无需手动维护配置文件,通过shell命令自动扫描系统中已安装的pythonX.Y命令:
# 探测所有python3.x版本,可根据需求调整匹配规则 INSTALLED_PYTHON_VERSIONS := $(shell ls /usr/bin/python3.* 2>/dev/null | grep -E 'python3\.[0-9]+' | xargs basename)
若需包含Python 2.x版本,修改匹配规则为python[23]\.[0-9]+即可。
方案2:通过环境变量指定Python版本
允许用户在执行make时手动指定目标Python版本,灵活性更强:
# 默认使用系统python3,用户可通过PYTHON_VERSIONS覆盖 PYTHON_VERSIONS ?= python3 .PHONY: install install: $(foreach f,$(PYTHON_VERSIONS), echo -e 'installing $(CYAN)$f$(NO_COLOR)'; $f -m pip install $(VERBOSE) $(EDITABLE) .;)
使用示例:
# 使用默认python3安装 make install # 指定多个版本安装 make install PYTHON_VERSIONS="python3.6 python3.8"
方案3:验证版本可用性后执行
避免配置或探测到的版本实际不存在的情况,在循环中先检查命令是否存在:
.PHONY: install install: $(foreach f,$(INSTALLED_PYTHON_VERSIONS), \ if command -v $f >/dev/null 2>&1; then \ echo -e 'installing $(CYAN)$f$(NO_COLOR)'; \ $f -m pip install $(VERBOSE) $(EDITABLE) .; \ else \ echo -e '$(RED)$f not found, skipping$(NO_COLOR)'; \ fi;)
此写法会跳过不存在的Python版本,不会中断整个安装流程。
内容的提问来源于stack exchange,提问作者Trick
相关产品推荐
相关产品推荐

