Thanks for the detailed response!

To start with your final questions:

>   - Why is Python itself not installed in the /app prefix?
>  - Where and how is pip install invoked?

The way that Flatpaks work is that there are *two* filesystem images, one
mounted on /usr and one mounted on /app. The image mounted on /usr is
called the "runtime" and contains libraries and other files shared between
different applications. In Fedora, this is made out of standard
distribution packages - glibc, libjpeg, and so forth. It also contains
Python 3  and some modules.

The filesystem image at /app contains packages specific to a specific
application - the application itself and libraries. In Fedora, we create
the /app filesystem by rebuilding packages inside a module that is
configured to have a special RPM macros package installed in the buildroot
- https://src.fedoraproject.org/rpms/flatpak-rpm-macros/tree/f36 (installed
at /etc/rpm/macros.flatpak so that it has higher priority than the macros
from /usr/lib/rpm)

(The advantage of this split over the docker layer system is that
applications don't need to be rebuilt every time the base layer is updated.)

macros.flatpak redefines %_prefix to /app, and then does various more and
less hacky things to make that actual work within the Fedora RPM ecosystem
- in particular for Python, it overrides
%python3_sitelib and %python3_sitearch. The distutils.cfg I mentioned is
installed from the same package. This combination worked pretty well for
F35 for Python.

pip install is being invoked is by %pyproject_install or %py_install_wheel
out of an RPM build - the particular breakage that triggered this
investigation was the Python bindings for zxing-cpp , but I think it would
apply to pretty much anything that has moved to the %pyproject macros.

On Thu, May 26, 2022 at 4:04 AM Miro Hrončok <mhron...@redhat.com> wrote:
[...]

> To read what changed in Fedora 36, I suggest reading the release notes:
>
>
> https://docs.fedoraproject.org/en-US/fedora/latest/release-notes/developers/Development_Python/#sect-install_scheme
>
> And this email thread:
>
>
> https://lists.fedoraproject.org/archives/list/python-devel@lists.fedoraproject.org/thread/AAGUFQZ4RZDU7KUN4HA43KQJCMSFR3GW/
>
> When we did this, we have dropped sysconfig._PIP_USE_SYSCONFIG in Fedora
> 36+.
>
> The change in our patching also caused a naughty UX-nightmare:
> https://bugzilla.redhat.com/show_bug.cgi?id=2026979
>
> However, when $RPM_BUILD_ROOT is set, this should not matter. As long as
> you
> call `pip install` from the specfile (how *exactly* are you using pip
> install?)
> you should be not impacted (much). I am just mentioning this for
> completeness,
> as I am unaware of how you use pip exactly.
>

The fact that sysconfig behaves differently when $RPM_BUILD_ROOT is set
wasn't something I was expecting, and explains quite a bit :-)


> I have dedicated my time in the upcoming months to try to rework this
> entirely
> for Fedora 37+, as it seems I rather screwed this up in the effort to try
> to
> make it better. The new approach will however also patch sysconfig and not
> distutils. Using distutils for anything has no future.
>
> (My new idea is about distro-customizable default sysconfig installation
> prefix
> value, and I am happy to brag about it more -- we could possibly use it as
> a
> future-proof solution for /app as well, depending on what you want to
> achieve.)
>

Having some standard way to configure a system by environment variable or
drop in file would definitely be nice ... and sounds like something we
could leverage.

Though I'm also wondering now if we could just change %py_install variants
and %pyproject variants to have --prefix %{_prefix} on the install command
line - that should have no effect for standard builds and make Flatpak
builds work?

As a hotfix, you could probably set sysconfig._PIP_USE_SYSCONFIG back to
> False.
> RPM-packaged pip in Fedora 36 is 21.3 so we would need to backport my
> change
> that reads this value to make it work (I have no problem doing that).
>
> Those are the ideas that come to my mind about how to set that attribute:
>
>   - build your own forked Python package that sets this
>   - build your own forked pip package that defaults to this
>

We definitely have the *ability* to use a stream branch for python3 or
python-pip, and build it in the flatpak-runtime package. But I'd really
prefer to avoid that, since that creates a fork we need to maintain every
time that these packages are updated in Fedora 36, and there's a
possibility of missing security updates.


>   - set it via a Python module that is imported from
>        /usr/lib/python3.10/site-packages/_pip_use_sysconfig.pth
>
> However, forcing pip to use distutils is the opposite of future-proof.
> When looking for a permanent solution, you need to avoid distutils
> entirely.
>

A pip with a backported patch (or a rebase) + this approach sounds most
maintainable for Fedora 36. But if we think that the --prefix %{_prefix}
approach actually works, then perhaps we can either:

 A) Just update python-rpm-macros and pygobject-rpm-macros in F36
 B) Build a stream-branch (or even the f37 branch) in the flatpak-runtime
module for F36 and reconverge for F37 - I'm less worried about carrying a
stream branch for macros packages, since they are unlikely to have security
fixes.

What do you think?

- Owen
_______________________________________________
python-devel mailing list -- python-devel@lists.fedoraproject.org
To unsubscribe send an email to python-devel-le...@lists.fedoraproject.org
Fedora Code of Conduct: 
https://docs.fedoraproject.org/en-US/project/code-of-conduct/
List Guidelines: https://fedoraproject.org/wiki/Mailing_list_guidelines
List Archives: 
https://lists.fedoraproject.org/archives/list/python-devel@lists.fedoraproject.org
Do not reply to spam on the list, report it: 
https://pagure.io/fedora-infrastructure

Reply via email to