diff --git a/pypy3.9.spec b/pypy3.9.spec index 6336e3d..5829c32 100644 --- a/pypy3.9.spec +++ b/pypy3.9.spec @@ -124,7 +124,6 @@ URL: http://pypy.org/ # Easy way to turn off the selftests: %global run_selftests 1 -%global pypyprefix %{_libdir}/pypy%{pyversion} %global pylibver 3 # We refer to this subdir of the source tree in a few places during the build: @@ -227,6 +226,7 @@ BuildRequires: perl-interpreter %endif BuildRequires: /usr/bin/execstack +BuildRequires: /usr/bin/patchelf # For byte-compiling the JIT-viewing mode: %if %{with_emacs} @@ -518,12 +518,47 @@ BuildPyPy \ %install -mkdir -p %{buildroot}/%{_bindir} -mkdir -p %{buildroot}/%{pypyprefix} +# First, run packaging script, it will prep the installation tree in builddir +%global installation_archive_name pypy%{pyversion}-%{version_} +%global packaging_builddir builddir +%global packaged_prefix %{packaging_builddir}/%{installation_archive_name} +%global soname_version 0.1 +%{bootstrap_python_interp} pypy/tool/release/package.py --archive-name '%{installation_archive_name}' --builddir '%{packaging_builddir}' --no-embedded-dependencies -# Run installing script, archive-name pypy%{pyversion} in %{buildroot}/%{_libdir} == %{pypyprefix} -%{bootstrap_python_interp} pypy/tool/release/package.py --archive-name pypy%{pyversion} --builddir %{buildroot}/%{_libdir} --no-embedded-dependencies +# Mangle some paths to match CPython, +# see https://mail.python.org/pipermail/pypy-dev/2022-January/016310.html and the replies there +# 1. remove the "python" executables, we still want CPython as the python command +rm %{packaged_prefix}/bin/python* +# 2. remove the "pypy" symbolic link, we still want pypy2 to be that for now +rm %{packaged_prefix}/bin/pypy +# 3. remove the "pypy3"symbolic link, if this is not the main pypy3 +%{!?with_main_pypy3:rm %{packaged_prefix}/bin/pypy3} +# 4. move libpypy3.9-c.so to lib(64) and soname version it +# https://docs.fedoraproject.org/en-US/packaging-guidelines/#_downstream_so_name_versioning +mv %{packaged_prefix}/bin/libpypy%{pyversion}-c.so %{packaged_prefix}/%{_lib}/libpypy%{pyversion}-c.so.%{soname_version} +ln -s libpypy%{pyversion}-c.so.%{soname_version} %{packaged_prefix}/%{_lib}/libpypy%{pyversion}-c.so +patchelf --set-soname libpypy%{pyversion}-c.so.%{soname_version} %{packaged_prefix}/%{_lib}/libpypy%{pyversion}-c.so +patchelf --replace-needed libpypy%{pyversion}-c.so libpypy%{pyversion}-c.so.%{soname_version} %{packaged_prefix}/bin/pypy%{pyversion} +# 5. remove stray README +rm %{packaged_prefix}/include/README +# 6. copy the main LICENSE file to pypy's libdir, as does CPython +cp -a LICENSE %{packaged_prefix}/%{_lib}/pypy%{pyversion} + +# Create the prefix and move stuff into it +mkdir -p %{buildroot}%{_prefix} +mv %{packaged_prefix}/bin %{buildroot}%{_bindir} +mv %{packaged_prefix}/include %{buildroot}%{_includedir} +mv %{packaged_prefix}/%{_lib} %{buildroot}%{_libdir} + +# Create directories we want to own +install -d -m 0755 %{buildroot}%{_libdir}/pypy%{pyversion}/site-packages/__pycache__ +%if "%{_lib}" == "lib64" +# The 64-bit version needs to create "site-packages" in /usr/lib/ (for +# pure-Python modules) as well as in /usr/lib64/ (for packages with extension +# modules). +install -d -m 0755 %{buildroot}%{_prefix}/lib/pypy%{pyversion}/site-packages/__pycache__ +%endif # Remove shebang lines from .py files that aren't executable, and @@ -542,8 +577,6 @@ find \ \) \ \) -mkdir -p %{buildroot}/%{pypyprefix}/site-packages - # The generated machine code doesn't need an executable stack, but # one of the assembler files (gcmaptable.s) doesn't have the necessary # metadata to inform gcc of that, and thus gcc pessimistically assumes @@ -553,12 +586,7 @@ mkdir -p %{buildroot}/%{pypyprefix}/site-packages # # I tried various approaches involving fixing the build, but the simplest # approach is to postprocess the ELF file: -execstack --clear-execstack %{buildroot}/%{pypyprefix}/bin/pypy3 - -ln -s %{pypyprefix}/bin/pypy%{pyversion} %{buildroot}%{_bindir}/pypy%{pyversion} -%if %{with main_pypy3} -ln -s pypy%{pyversion} %{buildroot}%{_bindir}/pypy3 -%endif +execstack --clear-execstack %{buildroot}%{_bindir}/pypy%{pyversion} # pypy uses .pyc files by default (--objspace-usepycfiles), but has a slightly # different bytecode format to CPython. It doesn't use .pyo files: the -O flag @@ -610,31 +638,18 @@ ln -s pypy%{pyversion} %{buildroot}%{_bindir}/pypy3 # # Note that some of the test files deliberately contain syntax errors, so # we are running it in subshell, to be able to ignore the failures and not to terminate the build. -(%{py_byte_compile %{buildroot}%{pypyprefix}/bin/pypy3 %{buildroot}%{pypyprefix}}) || : +export LD_LIBRARY_PATH=%{buildroot}%{_libdir} +(%{py_byte_compile %{buildroot}%{_bindir}/pypy%{pyversion} %{buildroot}}) || : +%{buildroot}%{_bindir}/pypy%{pyversion} -c 'import _tkinter' +%{buildroot}%{_bindir}/pypy%{pyversion} -c 'import tkinter' +%{buildroot}%{_bindir}/pypy%{pyversion} -c 'import _sqlite3' +%{buildroot}%{_bindir}/pypy%{pyversion} -c 'import _curses' +%{buildroot}%{_bindir}/pypy%{pyversion} -c 'import curses' +%{buildroot}%{_bindir}/pypy%{pyversion} -c 'import syslog' +%{buildroot}%{_bindir}/pypy%{pyversion} -c 'from _sqlite3 import *' -%{buildroot}%{pypyprefix}/bin/pypy3 -c 'import _tkinter' -%{buildroot}%{pypyprefix}/bin/pypy3 -c 'import tkinter' -%{buildroot}%{pypyprefix}/bin/pypy3 -c 'import _sqlite3' -%{buildroot}%{pypyprefix}/bin/pypy3 -c 'import _curses' -%{buildroot}%{pypyprefix}/bin/pypy3 -c 'import curses' -%{buildroot}%{pypyprefix}/bin/pypy3 -c 'import syslog' -%{buildroot}%{pypyprefix}/bin/pypy3 -c 'from _sqlite3 import *' - -# Header files for C extension modules. -# Upstream's packaging process (pypy/tool/release/package.py) -# creates an "include" subdir and copies all *.h/*.inl from "include" there -# (it also has an apparently out-of-date comment about copying them from -# pypy/_interfaces, but this directory doesn't seem to exist, and it doesn't -# seem to do this as of 2011-01-13) - -# FIXME: arguably these should be instead put into a subdir below /usr/include, -# it's not yet clear to me how upstream plan to deal with the C extension -# interface going forward, so let's just mimic upstream for now. -%global pypy_include_dir %{pypyprefix}/include -mkdir -p %{buildroot}%{pypy_include_dir} -rm -f %{buildroot}%{pypy_include_dir}/README - +unset LD_LIBRARY_PATH # Capture the RPython source code files from the build within the debuginfo # package (rhbz#666975) @@ -692,17 +707,12 @@ cp -a rpython/jit/tool/pypytrace-mode.elc %{buildroot}/%{_emacs_sitelispdir}/pyp install -m0644 -p -D -t %{buildroot}/%{_rpmconfigdir}/macros.d %{SOURCE2} %endif -# Remove files we don't want: -rm -f %{buildroot}%{_libdir}/%{name}.tar.bz2 \ - %{buildroot}%{pypyprefix}/README.rst - # wtf? This is probably masking some bigger problem, but let's do this for now mv -v lib-python/3/test/regrtest.py-new lib-python/3/test/regrtest.py || : # since 5.10.0, the debug binaries are built and shipped, making the # pypy3 package ~350 MiB. let's remove them here for now and TODO figure out why -rm -f %{buildroot}%{pypyprefix}/bin/pypy%{pyversion}.debug -rm -f %{buildroot}%{pypyprefix}/bin/libpypy%{pyversion}-c.so.debug +rm -f %{buildroot}%{_bindir}/*.debug %check @@ -842,31 +852,32 @@ CheckPyPy pypy%{pyversion}-c %files libs %doc README.rst +%license %{_libdir}/pypy%{pyversion}/LICENSE +%license %{_libdir}/pypy%{pyversion}/_cffi_ssl/LICENSE +%license %{_libdir}/pypy%{pyversion}/cffi/_pycparser/ply/LICENSE +%license %{_libdir}/pypy%{pyversion}/hpy.dist-info/LICENSE +%{_libdir}/pypy%{pyversion}/ +%if "%{_lib}" == "lib64" +%{_prefix}/lib/pypy%{pyversion}/ +%endif +%{_libdir}/libpypy%{pyversion}-c.so.%{soname_version} -%dir %{pypyprefix} -%license %{pypyprefix}/LICENSE -%license %{pypyprefix}/%{_lib}/pypy%{pyversion}/_cffi_ssl/LICENSE -%license %{pypyprefix}/%{_lib}/pypy%{pyversion}/cffi/_pycparser/ply/LICENSE -%license %{pypyprefix}/%{_lib}/pypy%{pyversion}/hpy.dist-info/LICENSE -%{pypyprefix}/%{_lib}/pypy%{pyversion}/ -%{pypyprefix}/site-packages/ %if %{with_emacs} %{_emacs_sitelispdir}/pypy%{pyversion}trace-mode.el %{_emacs_sitelispdir}/pypy%{pyversion}trace-mode.elc %endif + %files %doc README.rst -%if %{with main_pypy3} -%{_bindir}/pypy3 -%endif +%{?with_main_pypy3:%{_bindir}/pypy3} %{_bindir}/pypy%{pyversion} -%{pypyprefix}/bin/ + %files devel -%dir %{pypy_include_dir} -%dir %{pypy_include_dir}/pypy%{pyversion} -%{pypy_include_dir}/pypy%{pyversion}/*.h +%dir %{_includedir}/pypy%{pyversion} +%{_includedir}/pypy%{pyversion}/*.h +%{_libdir}/libpypy%{pyversion}-c.so %if %{with main_pypy3} %{_rpmconfigdir}/macros.d/macros.pypy3 %endif @@ -875,6 +886,7 @@ CheckPyPy pypy%{pyversion}-c %changelog * Wed Jan 26 2022 Miro HronĨok - 7.3.8~rc1-1 - Update to 7.3.8rc1 +- Move to a CPython-like installation layout * Fri Jan 21 2022 Fedora Release Engineering - 7.3.7-3 - Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild