Build RPM Package of Python

Photo by Brandable Box on Unsplash

Python パッケージの RPM 化といえば bdist_rpm がありますが,この場合依存パッケージも PRM 化する必要があります.
ということで venv でいい感じにパッケージ化するときの spec ファイルの内容をメモ.

ということで下記です.

%define venv_name package_name
%define venv_install_dir /opt/%{venv_name}
%define venv_dir %{buildroot}%{venv_install_dir}
%define venv_bin %{venv_dir}/bin
%define __prelink_undo_cmd %{nil}
%undefine __arch_install_post
%global __os_install_post %(echo '%{__os_install_post}' | sed -e 's!/usr/lib[^[:space:]]*/brp-python-bytecompile[[:space:]].*$!!g')
Name:       package_name
Version:    %{package_version}
Release:    1%{?dist}
Summary:    package_summary
URL:        https://github.com/hoge/huga
Source0:    ./
Requires:   python3%description
long_package_desccription%prep
rm -rf %{buildroot}/*%install
install -d %{buildroot}%{venv_install_dir} %{buildroot}/usr/sbin
python3 -m venv %{venv_dir}
%{venv_bin}/python %{venv_bin}/pip install --upgrade pip
%{venv_bin}/python %{venv_bin}/pip install venvctrl
cd %{_topdir}
%{venv_bin}/python setup.py install
ln -sf %{venv_install_dir}/bin/package_name %{buildroot}/usr/sbin/package_name
find %{buildroot} -name "RECORD" -exec rm -rf {} \;
%{venv_bin}/venvctrl-relocate --source=%{venv_dir} --destination=%{venv_install_dir}
find %{venv_dir}/lib -type f -name "*.so" | xargs -r strip%files
%{venv_install_dir}
/usr/sbin/package_name%clean
rm -rf %{buildroot}

軽く解説を書くと /opt 配下に pip install をやったあと /usr/sbin 配下にシンボリックリンクを張っています.
CUI ツールなどでよくあるパターンかと思います.
Cent6 と Cent7 で動くことは確認しているので大丈夫のはず.

あと当たり前なんですけど venv が activate 状態で rpmbuild すると venv の Python でパッケージが作成されるので注意してください.