Python venv でいい感じの RPM パッケージを作る
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_nameVersion: %{package_version}Release: 1%{?dist}Summary: package_summaryURL: https://github.com/hoge/hugaSource0: ./Requires: python3
%descriptionlong_package_desccription
%preprm -rf %{buildroot}/*%installinstall -d %{buildroot}%{venv_install_dir} %{buildroot}/usr/sbinpython3 -m venv %{venv_dir}%{venv_bin}/python %{venv_bin}/pip install --upgrade pip%{venv_bin}/python %{venv_bin}/pip install venvctrlcd %{_topdir}%{venv_bin}/python setup.py installln -sf %{venv_install_dir}/bin/package_name %{buildroot}/usr/sbin/package_name%{venv_bin}/venvctrl-relocate --source=%{venv_dir} --destination=%{venv_install_dir}
%files%{venv_install_dir}/usr/sbin/package_name
%cleanrm -rf %{buildroot}軽く解説を書くと /opt 配下に pip install をやったあと /usr/sbin 配下にシンボリックリンクを張っています. CUI ツールなどでよくあるパターンかと思います. Cent6 と Cent7 で動くことは確認しているので大丈夫のはず.
あと当たり前なんですけど venv が activate 状態で rpmbuild すると venv の Python でパッケージが作成されるので注意してください.