Broken cpython libraries when pyproject.toml is used
Hi all.
Recently, i'm starting to migrate to %pyproject* macros when i build petsc4py build inside my RPMs for Fedora (Red Hat bug ticket 2377370).
petsc4py is built and installed from inside src/binding/petsc4py directory calling these macros:
...
%pyproject_wheel
...
%pyproject_installI obtained a correctly compiled and linked PETSc.cpython-313-x86_64-linux-gnu.so file:
$ ldd ./PETSc.cpython-313-x86_64-linux-gnu.so
linux-vdso.so.1 (0x00007f57a3d32000)
libpetsc.so.3.23 => /home/sagitter/rpmbuild/BUILD/petsc-3.23.5-build/petsc-3.23.5/buildopenmpi_dir/x86_64/lib/libpetsc.so.3.23 (0x00007f57a1a00000)
libmpi.so.40 => /usr/lib64/openmpi/lib/libmpi.so.40 (0x00007f57a1600000)
libc.so.6 => /lib64/libc.so.6 (0x00007f57a140f000)
libHYPRE.so.2.1 => /usr/lib64/openmpi/lib/libHYPRE.so.2.1 (0x00007f57a0e00000)
libsuperlu_dist.so.8 => /usr/lib64/openmpi/lib/libsuperlu_dist.so.8 (0x00007f57a0ca2000)
libdmumps-5.7.so => /usr/lib64/openmpi/lib/libdmumps-5.7.so (0x00007f57a0a00000)
libscalapack.so.2 => /usr/lib64/openmpi/lib/libscalapack.so.2 (0x00007f57a0400000)
libflexiblas.so.3 => /lib64/libflexiblas.so.3 (0x00007f57a0000000)
libptscotch.so.7.0 => /usr/lib64/openmpi/lib/libptscotch.so.7.0 (0x00007f57a3584000)
libscotch.so.7.0 => /usr/lib64/openmpi/lib/libscotch.so.7.0 (0x00007f57a34f0000)
libmetis.so.0 => /lib64/libmetis.so.0 (0x00007f57a1992000)
libhdf5.so.310 => /usr/lib64/openmpi/lib/libhdf5.so.310 (0x00007f579fa00000)
libm.so.6 => /lib64/libm.so.6 (0x00007f579ff12000)
libX11.so.6 => /lib64/libX11.so.6 (0x00007f579f8bb000)
libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007f579f600000)
libmpi_mpifh.so.40 => /usr/lib64/openmpi/lib/libmpi_mpifh.so.40 (0x00007f57a13a2000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f57a34c4000)
libpvfs2.so.2.9.7 => /lib64/libpvfs2.so.2.9.7 (0x00007f579f501000)
libpsm2.so.2 => /lib64/libpsm2.so.2 (0x00007f57a0396000)
libopen-pal.so.80 => /usr/lib64/openmpi/lib/libopen-pal.so.80 (0x00007f579f405000)
libfabric.so.1 => /lib64/libfabric.so.1 (0x00007f579ee00000)
libucp.so.0 => /lib64/libucp.so.0 (0x00007f579fe43000)
libucs.so.0 => /lib64/libucs.so.0 (0x00007f579f3a2000)
libucm.so.0 => /lib64/libucm.so.0 (0x00007f57a1385000)
libuct.so.0 => /lib64/libuct.so.0 (0x00007f57a0c67000)
libevent_core-2.1.so.7 => /lib64/libevent_core-2.1.so.7 (0x00007f57a09c7000)
libevent_pthreads-2.1.so.7 => /lib64/libevent_pthreads-2.1.so.7 (0x00007f57a3d1d000)
libhwloc.so.15 => /lib64/libhwloc.so.15 (0x00007f579f33e000)
libpmix.so.2 => /lib64/libpmix.so.2 (0x00007f579ec17000)
/lib64/ld-linux-x86-64.so.2 (0x00007f57a3d34000)
libgomp.so.1 => /lib64/libgomp.so.1 (0x00007f579ebbf000)
libptscotcherr.so.7.0 => /usr/lib64/openmpi/lib/libptscotcherr.so.7.0 (0x00007f57a3d17000)
libptscotcherrexit.so.7.0 => /usr/lib64/openmpi/lib/libptscotcherrexit.so.7.0 (0x00007f57a3d13000)
libcolamd.so.3 => /lib64/libcolamd.so.3 (0x00007f57a34bb000)
libblas.so => /usr/lib64/openmpi/lib/libblas.so (0x00007f57a136b000)
libmumps_common-5.7.so => /usr/lib64/openmpi/lib/libmumps_common-5.7.so (0x00007f579eb52000)
libptscotchparmetisv3.so.7.0 => /usr/lib64/openmpi/lib/libptscotchparmetisv3.so.7.0 (0x00007f57a34b5000)
libpord-5.7.so => /usr/lib64/openmpi/lib/libpord-5.7.so (0x00007f57a09ad000)
libesmumps.so.7.0 => /usr/lib64/openmpi/lib/libesmumps.so.7.0 (0x00007f57a1989000)
libscotcherr.so.7.0 => /usr/lib64/openmpi/lib/libscotcherr.so.7.0 (0x00007f57a34af000)
libptesmumps.so.7.0 => /usr/lib64/openmpi/lib/libptesmumps.so.7.0 (0x00007f57a1980000)
libmpi_usempif08.so.40 => /usr/lib64/openmpi/lib/libmpi_usempif08.so.40 (0x00007f579f87c000)
libmpi_usempi_ignore_tkr.so.40 => /usr/lib64/openmpi/lib/libmpi_usempi_ignore_tkr.so.40 (0x00007f57a0c58000)
libgfortran.so.5 => /lib64/libgfortran.so.5 (0x00007f579e800000)
libquadmath.so.0 => /lib64/libquadmath.so.0 (0x00007f579e7b9000)
libz.so.1 => /lib64/libz.so.1 (0x00007f579e796000)
libbz2.so.1 => /lib64/libbz2.so.1 (0x00007f579fe2e000)
liblzma.so.5 => /lib64/liblzma.so.5 (0x00007f579e761000)
libpcre2-posix.so.3 => /lib64/libpcre2-posix.so.3 (0x00007f57a1367000)
libsz.so.2 => /lib64/libsz.so.2 (0x00007f57a0c4e000)
libxcb.so.1 => /lib64/libxcb.so.1 (0x00007f579e737000)
libcrypto.so.3 => /lib64/libcrypto.so.3 (0x00007f579e200000)
libibverbs.so.1 => /lib64/libibverbs.so.1 (0x00007f579e717000)
libnuma.so.1 => /lib64/libnuma.so.1 (0x00007f57a0388000)
librdmacm.so.1 => /lib64/librdmacm.so.1 (0x00007f579e6fb000)
libefa.so.1 => /lib64/libefa.so.1 (0x00007f579e6ef000)
libnl-3.so.200 => /lib64/libnl-3.so.200 (0x00007f579e6cd000)
libnl-route-3.so.200 => /lib64/libnl-route-3.so.200 (0x00007f579e16b000)
libuuid.so.1 => /lib64/libuuid.so.1 (0x00007f579fe25000)
libudev.so.1 => /lib64/libudev.so.1 (0x00007f579e124000)
libmunge.so.2 => /lib64/libmunge.so.2 (0x00007f579e6c5000)
libsuitesparseconfig.so.7 => /lib64/libsuitesparseconfig.so.7 (0x00007f579f877000)
libpcre2-8.so.0 => /lib64/libpcre2-8.so.0 (0x00007f579e079000)
libXau.so.6 => /lib64/libXau.so.6 (0x00007f579e6bf000)
libcap.so.2 => /lib64/libcap.so.2 (0x00007f579e6b3000)but same file is completely changed after installation by using the macro %pyproject_install:
$ ldd ./PETSc.cpython-313-x86_64-linux-gnu.so
linux-vdso.so.1 (0x00007faf07940000)
libpetsc.so.3.23 => not found
libmpi.so.12 => not found
libc.so.6 => /lib64/libc.so.6 (0x00007faf06fe0000)
/lib64/ld-linux-x86-64.so.2 (0x00007faf07942000)Info: expanding the involved macros the commands are:
$ rpm --eval %pyproject_wheel
\
mkdir -p "/home/sagitter/rpmbuild/BUILD/.pyproject-builddir"
CFLAGS="${CFLAGS:--O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer }" CXXFLAGS="${CXXFLAGS:--O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer }" FFLAGS="${FFLAGS:--O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -I/usr/lib64/gfortran/modules }" FCFLAGS="${FCFLAGS:--O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -mtls-dialect=gnu2 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -I/usr/lib64/gfortran/modules }" VALAFLAGS="${VALAFLAGS:--g}" RUSTFLAGS="${RUSTFLAGS:--Copt-level=3 -Cdebuginfo=2 -Ccodegen-units=1 -Cstrip=none -Cforce-frame-pointers=yes --cap-lints=warn}" LDFLAGS="${LDFLAGS:--Wl,-z,relro -Wl,--as-needed -Wl,-z,pack-relative-relocs -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -Wl,--build-id=sha1 }" LT_SYS_LIBRARY_PATH="${LT_SYS_LIBRARY_PATH:-/usr/lib64:}" CC="${CC:-gcc}" CXX="${CXX:-g++}" \
TMPDIR="/home/sagitter/rpmbuild/BUILD/.pyproject-builddir" \
/usr/bin/python3 -Bs /usr/lib/rpm/redhat/pyproject_wheel.py /home/sagitter/rpmbuild/BUILD/pyproject-wheeldir and
$ rpm --eval %pyproject_install
\
specifier=$(ls /home/sagitter/rpmbuild/BUILD/pyproject-wheeldir/*.whl | xargs basename --multiple | sed -E 's/([^-]+)-([^-]+)-.+\.whl/\1==\2/')
if [ -z "$specifier" ]; then
echo 'ERROR: %pyproject_install found no wheel in %{_pyproject_wheeldir} /home/sagitter/rpmbuild/BUILD/pyproject-wheeldir' >&2
exit 1
fi
TMPDIR="/home/sagitter/rpmbuild/BUILD/.pyproject-builddir" /usr/bin/python3 -m pip install --root %{buildroot} --prefix /usr --no-deps --disable-pip-version-check --progress-bar off --verbose --ignore-installed --no-warn-script-location --no-index --no-cache-dir --find-links /home/sagitter/rpmbuild/BUILD/pyproject-wheeldir $specifier
if [ -d %{buildroot}/usr/bin ]; then
\
if [ -z "sP" ]; then
shebang_flags="-k"
else
shebang_flags="-kasP"
fi
/usr/bin/python3 -B /usr/lib/rpm/redhat/pathfix.py -pni /usr/bin/python3 $shebang_flags %{buildroot}/usr/bin/*
rm -rfv %{buildroot}/usr/bin/__pycache__
fi
rm -f /home/sagitter/rpmbuild/BUILD/%{name}-%{version}-%{release}.x86_64-pyproject-ghost-distinfo
site_dirs=()
# Process /usr/lib/python3.13/site-packages if exists
if [ -d %{buildroot}/usr/lib/python3.13/site-packages ]; then
site_dirs+=( "/usr/lib/python3.13/site-packages" )
fi
# Process /usr/lib64/python3.13/site-packages if exists and does not equal to /usr/lib/python3.13/site-packages
if [ %{buildroot}/usr/lib64/python3.13/site-packages != %{buildroot}/usr/lib/python3.13/site-packages ] && [ -d %{buildroot}/usr/lib64/python3.13/site-packages ]; then
site_dirs+=( "/usr/lib64/python3.13/site-packages" )
fi
# Process all *.dist-info dirs in sitelib/sitearch
for site_dir in ${site_dirs[@]}; do
for distinfo in %{buildroot}$site_dir/*.dist-info; do
echo "%ghost ${distinfo#%{buildroot}}" >> /home/sagitter/rpmbuild/BUILD/%{name}-%{version}-%{release}.x86_64-pyproject-ghost-distinfo
sed -i 's/pip/rpm/' ${distinfo}/INSTALLER
PYTHONPATH=/usr/lib/rpm/redhat \
/usr/bin/python3 -B /usr/lib/rpm/redhat/pyproject_preprocess_record.py \
--buildroot %{buildroot} --record ${distinfo}/RECORD --output /home/sagitter/rpmbuild/BUILD/%{name}-%{version}-%{release}.x86_64-pyproject-record
rm -fv ${distinfo}/RECORD
rm -fv ${distinfo}/REQUESTED
done
done
lines=$(wc -l /home/sagitter/rpmbuild/BUILD/%{name}-%{version}-%{release}.x86_64-pyproject-ghost-distinfo | cut -f1 -d" ")
if [ $lines -ne 1 ]; then
echo -e "\n\nWARNING: %pyproject_extras_subpkg won't work without explicit -i or -F, found $lines dist-info directories.\n\n" >&2
rm /home/sagitter/rpmbuild/BUILD/%{name}-%{version}-%{release}.x86_64-pyproject-ghost-distinfo # any attempt to use this will fail
fi