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_install

I 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