rpmbuildが自動的に生成する個々の依存関係を除外できますか?

rpmbuildが自動的に生成する個々の依存関係を除外できますか?

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

仕様ファイルに多くの問題があります。

  1. 最初にすべきことはいいえパッケージをビルドするときに使用します。sudo make installこれはパッケージをローカルファイルシステムに直接インストールしますが、これは決して望むものではありません。環境によっては、既存のPythonインストールが破損したり、他の意図しない結果が発生する可能性があります。

    RPMの基本的なアイデアは、権限のないユーザーとしてパッケージを構築することです。インストールするパック。

  2. ファイルの上部に次の説明が含まれているこのモジュールは、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

  3. cdビルドを機能させるためにディレクトリに移動する必要はありません。パラメータを変更すると、%setupこれは不要になります。

  4. ただ実行しないでくださいmake install。ビルドルートにファイルをインストールしようとしています。 GNU-likeパッケージ(Pythonを含む)の場合は、DESTDIRインストール中に設定してこれを実行できます。

    make install DESTDIR=$RPM_BUILD_ROOT
    

    これはあなたの%install役割を簡素化します。

  5. /usr/bin/pythonRPMは、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')

おすすめ記事