[prev in list] [next in list] [prev in thread] [next in thread]
List: opensuse-packaging
Subject: Re: [opensuse-packaging] singlespec RFC: python3-only builds, %have_python, %skip_python
From: Todd Rme <toddrme2178 () gmail ! com>
Date: 2017-06-14 16:14:17
Message-ID: CADb7s=sDKrbJgiDAiRPY7Q_AU44a2fJ7TZB1o1Kut_KMbBPKMA () mail ! gmail ! com
[Download RAW message or body]
On Tue, Jun 13, 2017 at 10:52 AM, jan matejek <jmatejek@suse.com> wrote:
> Fellow Python packagers,
>
> while trying to solve the issues surrounding python3-only singlespec builds, I \
> finally figured out that the OBS is not *at all* doing what I thought it was doing, \
> and everything is now lost forever
> and now seriously.
> For various technical reasons that I will discuss at the end of this e-mail, using
> "%undefine have_python2" for removing python2 from the build set is not viable. I \
> will have to redesign the macros that are present in prjconf and use some other \
> method to accomplish the same.
> The current WIP solution is as follows:
>
> 1. %pythons macro will contain the build set, i.e., list of all flavors that we \
> build for. in Factory, "%pythons" will expand to "python2 python3".
>
> 2. contents of %pythons will be conditional on %skip_python macros.
> If you "%define skip_python2 1" in the spec file, python2 will be removed from \
> %pythons. the "%skip_python" symbols should not be defined ANYWHERE ELSE BUT the \
> current spec file. For prjconf, it is more suitable to change contents of %pythons.
>
> 3. %python_module will iterate over %pythons, through a crazy convoluted scheme \
> that Ruby is also using.
> So for the end packager:
>
> * if you want to build everything by distro defaults, nothing changes
> * if you want to *exclude* a particular flavor from the build, you "%define \
> skip_$flavor 1"
> * if you want to list build flavors explicitly, you can redefine %pythons \
> themselves: %define pythons python2 jython2 pypy3
> * you can BuildRequire: %pythons, because %pythons will come from prjconf
>
> For prjconf, we need:
>
> * %pythons python2 python3
> (This is an opportunity to mess things up, because the *last* item in %pythons \
> actually specifies, through a side effect, the "default" python that overwrites \
> conflicting files. If you specify "python3 python2" and then "%python3_only \
> /usr/bin/foo", the /usr/bin/foo will actually be a python2 version.
> OTOH, this allows per-package customization of the default, and python-rpm-macros \
> will contain the canonical order.)
> * the set of python_module expanders
>
> Installed Python packages will still define %have_$flavor macros, so you can switch \
> build options based on which pythons are present. However, this is no longer tied \
> to the build set: especially in a local build, you could get %have_python2 true but \
> not actually build it for Python2. That shouldn't matter in practice.
>
> comments, questions, thoughts?
>
> regards
> m.
>
> -----
>
> p.s.: For those interested, here are the technical details.
>
> The original intention was that if you wanted to skip a particular build \
> requirement, you could do: %undefine have_python2
> This would remove "python2" from the build set and you wouldn't get any \
> python2-related wording in the spec file.
>
> One problem with this approach is that definitions in RPM are placed on a stack and \
> so you need to %undefine as many times as you %defined. Hence the current bug where \
> you need to %undefine have_python2 twice (at least).
>
> Another is that OBS doesn't understand %undefine at all! So this declaration \
> actually doesn't do anything, and your %python_modules still install *all* python \
> versions. The double-%undefine is then needed because you get one have_python2 from \
> prjconf and another from the installed python2 package.
> The new solution doesn't rely on undefines, and redefinitions work about as well as \
> we would expect.
Overall this seems good.
The only issue with the current approach from what I can see is that
it seems you can only add new pythons by completely replacing the
default set. There doesn't seem to be a way to add individual
non-default pythons while otherwise keeping the project defaults.
This would be important for pypy or jython, where I think we would
want to keep it disabled by default and only explicitly turn it on in
a per-package basis. So perhaps a "%add_python foo" macro that adds
"foo" to "%pythons" if it isn't already there. Perhaps by default it
adds it to the beginning of the list if it isn't already there, while
"%add_python foo 1" will always add it to the end of the list
(promoting it to being the "primary" python version, even if it is
already in "%pythons" at a different position).
--
To unsubscribe, e-mail: opensuse-packaging+unsubscribe@opensuse.org
To contact the owner, e-mail: opensuse-packaging+owner@opensuse.org
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic