如何编写可同时适配RHEL7、RHEL8的Python程序RPM spec文件
问题1:依赖条件判断方案有效性
你当前编写的条件判断逻辑完全适用于RHEL7和RHEL8的适配场景:
0%{?rhel}的写法可以规避%rhel宏未定义时的语法报错,RHEL7的%rhel值为7,RHEL8的%rhel值为8,判断分支可以正确命中- RHEL7官方源中的Python2依赖包确实使用无版本前缀命名,RHEL8默认取消Python2支持,所有Python3依赖包均带
python3-前缀,依赖声明完全符合两个版本的官方包命名规则
问题2:
%__python宏报错解决方案 RHEL8开始默认移除了无版本指向的%__python宏定义,需要在条件分支中主动声明该宏的指向,无需修改后续%build、%install阶段的代码即可完成适配。
适配后的完整spec片段
# 前置版本判断:统一宏定义+依赖声明 %if 0%{?rhel} <= 7 # 重定义__python指向Python2 %define __python %{__python2} ### 运行依赖 ### Requires: python python-jinja2 python-markupsafe python-sqlalchemy ### 构建依赖 ### BuildRequires: python-setuptools %else # 重定义__python指向Python3 %define __python %{__python3} ### 运行依赖 ### Requires: python3 python3-jinja2 python3-markupsafe python3-sqlalchemy ### 构建依赖 ### BuildRequires: python3-setuptools %endif # 后续构建、安装逻辑无需修改 %build %{__python} setup.py build %install %{__python} setup.py install --skip-build --root $RPM_BUILD_ROOT
额外注意事项
- 需分别在RHEL7、RHEL8的原生构建环境中生成对应版本的RPM包,不可跨版本构建
- 如果你的自研程序已经完成Python3全适配,也可以将RHEL7分支的依赖统一改为
python3-前缀的包,实现两个版本运行环境的Python版本统一
内容的提问来源于stack exchange,提问作者danidar
相关产品推荐
相关产品推荐

