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 유사 패키지(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')