rpmbuild
ソースからpython3.9をインストールするためのカスタムrpmを作成しています。rpmbuild
説明を通じて、必要と判断される事項に対する依存関係を自動的に生成します。ここ。AutoReqProv: no
の説明に従って、仕様ファイルで設定して完全に無効にすることができます。これ郵便はがき。
私の問題は、私が決定できない理由のためにrpmbuildが/usr/local/lib/python
私が存在したくないファイルへの依存関係を自動的に生成することです。このファイルはソースからPython3.9をビルドしても生成されず、他のrpmがそれをインストールしようとすると不要なファイル競合が発生したくありません。 rpmbuildを具体的に知らせる方法はありますか?いいえこのファイルの依存関係を作成し、ただ他のすべての自動生成依存関係を生成することを許可しながらファイルを生成しますか?
参考用仕様書:
Name: python39
Version: 3.9.0
Release: 1
Summary: Python 3.9
%global _python_bytecompile_errors_terminate_build 0
%define install_dir /usr/local
Source0: Python-3.9.0.tgz
BuildRequires: libffi-devel
%define debug_package %{nil}
%description
%prep
%setup -c -q
%build
umask 022
cd Python-3.9.0
./configure
make
sudo make install
%install
%{__rm} -rf %{buildroot}
%{__mkdir_p} %{buildroot}
%{__cp} -a %{install_dir} %{buildroot}%{install_dir}
%files
%{install_dir}/bin/2to3
%{install_dir}/bin/2to3-3.9
%{install_dir}/bin/easy_install-3.9
%{install_dir}/bin/idle3
%{install_dir}/bin/idle3.9
%{install_dir}/bin/pip3
%{install_dir}/bin/pip3.9
%{install_dir}/bin/pydoc3
%{install_dir}/bin/pydoc3.9
%{install_dir}/bin/python3
%{install_dir}/bin/python3-config
%{install_dir}/bin/python3.9
%{isntall_dir}/bin/python3.9-config
%{install_dir}/include/python3.9
%{install_dir}/lib/libpython3.9.a
%{install_dir}/lib/pkgconfig/python-3.9-embed.pc
%{install_dir}/lib/pkgconfig/python-3.9.pc
%{install_dir}/lib/pkgconfig/python3-embed.pc
%{install_dir}/lib/pkgconfig/python3.pc
%{install_dir}/lib/python3.9
%{install_dir}/share/man/man1/python3.1
%{install_dir}/share/man/man1/python3.9.1
%doc
%post
%postun
%changelog
ベストアンサー1
仕様ファイルに多くの問題があります。
最初にすべきことはいいえパッケージをビルドするときに使用します。
sudo make install
これはパッケージをローカルファイルシステムに直接インストールしますが、これは決して望むものではありません。環境によっては、既存のPythonインストールが破損したり、他の意図しない結果が発生する可能性があります。RPMの基本的なアイデアは、権限のないユーザーとしてパッケージを構築することです。インストールするパック。
ファイルの上部に次の説明が含まれているこのモジュールは、
cgi
誤った依存関係を追加する可能性があります。#! /usr/local/bin/python # NOTE: the above "/usr/local/bin/python" is NOT a mistake. It is # intentionally NOT "/usr/bin/env python". On many systems # (e.g. Solaris), /usr/local/bin is not in $PATH as passed to CGI # scripts, and /usr/local/bin is the default directory where Python is # installed, so /usr/bin/env would be unable to find python. Granted, # binary installations by Linux vendors often install Python in # /usr/bin. So let those vendors patch cgi.py to match their choice # of installation.
RPMはそれを表示し、
#!/usr/local/bin/python
依存関係として追加します。回避策は、コメントの指示に従い、ファイルをパッチして明示的に参照することです/usr/local/bin/python3.9
。cd
ビルドを機能させるためにディレクトリに移動する必要はありません。パラメータを変更すると、%setup
これは不要になります。ただ実行しないでください
make install
。ビルドルートにファイルをインストールしようとしています。 GNU-likeパッケージ(Pythonを含む)の場合は、DESTDIR
インストール中に設定してこれを実行できます。make install DESTDIR=$RPM_BUILD_ROOT
これはあなたの
%install
役割を簡素化します。/usr/bin/python
RPMは、CentOS 7などのシステムでPython 2.7をビルドするとPython 2.7を使用しようとし、/usr/bin/python
多くのファイルで構文エラーが原因で失敗します。_python_bytecompile_errors_terminate_build
に設定してこの問題を解決しようとしたようですが、0
少なくとも私のテスト環境では機能しませんでした。ついについて行きました。このガイドラインインストール後のバイトコンパイルステップが削除されました。
これらすべてが私に提供されます:
%global _python_bytecompile_errors_terminate_build 0
%define install_dir /usr/local
%define debug_package %{nil}
%global __os_install_post %(echo '%{__os_install_post}' | sed -e 's!/usr/lib[^[:space:]]*/brp-python-bytecompile[[:space:]].*$!!g')
Name: python39
Version: 3.9.0
Release: 1
Summary: Python 3.9
License: Python
Source0: Python-3.9.0.tgz
BuildRequires: libffi-devel
BuildRequires: zlib-devel
%description
%prep
%setup -q -n Python-3.9.0
%build
umask 022
./configure --prefix=%{install_dir}
make
%install
make install DESTDIR=$RPM_BUILD_ROOT
# Patch cgi.py as described in its comments
sed -i 's,/usr/local/bin/python,/usr/local/bin/python3.9,' $RPM_BUILD_ROOT%{install_dir}/lib/python3.9/cgi.py
%files
%{install_dir}/bin/2to3
%{install_dir}/bin/2to3-3.9
%{install_dir}/bin/easy_install-3.9
%{install_dir}/bin/idle3
%{install_dir}/bin/idle3.9
%{install_dir}/bin/pip3
%{install_dir}/bin/pip3.9
%{install_dir}/bin/pydoc3
%{install_dir}/bin/pydoc3.9
%{install_dir}/bin/python3
%{install_dir}/bin/python3-config
%{install_dir}/bin/python3.9
%{install_dir}/bin/python3.9-config
%{install_dir}/include/python3.9
%{install_dir}/lib/libpython3.9.a
%{install_dir}/lib/pkgconfig/python-3.9-embed.pc
%{install_dir}/lib/pkgconfig/python-3.9.pc
%{install_dir}/lib/pkgconfig/python3-embed.pc
%{install_dir}/lib/pkgconfig/python3.pc
%{install_dir}/lib/python3.9
%{install_dir}/share/man/man1/python3.1
%{install_dir}/share/man/man1/python3.9.1
%doc
%post
%postun
%changelog
CentOS 7でこのパッケージをビルドするときに生成される依存関係は次のとおりです。
$ rpm -qp --requires RPMS/x86_64/python39-3.9.0-1.x86_64.rpm
/bin/bash
/bin/sh
libcrypt.so.1()(64bit)
libcrypt.so.1(GLIBC_2.2.5)(64bit)
libc.so.6()(64bit)
libc.so.6(GLIBC_2.10)(64bit)
libc.so.6(GLIBC_2.13)(64bit)
libc.so.6(GLIBC_2.14)(64bit)
libc.so.6(GLIBC_2.15)(64bit)
libc.so.6(GLIBC_2.17)(64bit)
libc.so.6(GLIBC_2.2.5)(64bit)
libc.so.6(GLIBC_2.3.2)(64bit)
libc.so.6(GLIBC_2.3.4)(64bit)
libc.so.6(GLIBC_2.3)(64bit)
libc.so.6(GLIBC_2.4)(64bit)
libc.so.6(GLIBC_2.6)(64bit)
libc.so.6(GLIBC_2.7)(64bit)
libc.so.6(GLIBC_2.9)(64bit)
libdl.so.2()(64bit)
libdl.so.2(GLIBC_2.2.5)(64bit)
libffi.so.6()(64bit)
libm.so.6()(64bit)
libm.so.6(GLIBC_2.2.5)(64bit)
libnsl.so.1()(64bit)
libnsl.so.1(GLIBC_2.2.5)(64bit)
libpthread.so.0()(64bit)
libpthread.so.0(GLIBC_2.2.5)(64bit)
libpthread.so.0(GLIBC_2.3.2)(64bit)
libpthread.so.0(GLIBC_2.3.3)(64bit)
librt.so.1()(64bit)
librt.so.1(GLIBC_2.2.5)(64bit)
libutil.so.1()(64bit)
libutil.so.1(GLIBC_2.2.5)(64bit)
libz.so.1()(64bit)
libz.so.1(ZLIB_1.2.0)(64bit)
rpmlib(CompressedFileNames) <= 3.0.4-1
rpmlib(FileDigests) <= 4.6.0-1
rpmlib(PayloadFilesHavePrefix) <= 4.0-1
rpmlib(PayloadIsXz) <= 5.2-1
rtld(GNU_HASH)
/usr/bin/env
/usr/local/bin/python3.9
Fedora 35システムでこれを構築するには、brp-mangle-shebangs
インストール後にプロセスをさらに無効にする必要がありました(誤って交換される可能性があるため/usr/local/bin/python3.9
)。/usr/bin/python3.9
%global __os_install_post %(echo '%{__os_install_post}' | sed -e 's!/usr/lib[^[:space:]]*/brp-python-bytecompile[[:space:]].*$!!g' -e 's!/usr/lib[^[:space:]]*/brp-mangle-shebangs[[:space:]].*$!!g')