https://fedoraproject.org/wiki/Changes/PythonMacroError

== Summary ==
The <code>%{__python}</code> RPM macro (currently defined to
<code>/usr/bin/python</code> for backwards compatibility reasons) will be
defined to raise an error when used. Any derived macros
(<code>%{python}</code>, <code>%{python_version}</code>,
<code>%{python_sitleib}</code> etc.) will propagate the error. Packagers
can redefine the macro to any actual value to suppress the error. This is
consistent with RHEL 8 behavior. Using  <code>/usr/bin/python</code> in
Fedora packages remains forbidden.

== Owner ==
* Name: [[User:Churchyard|Miro HronĨok]]
* Email: <mhron...@redhat.com>


== Detailed Description ==
For years, the unversioned <code>/usr/bin/python</code> Python interpreter
MUST not be used when building RPM packages in Fedora. However, for
backwards compatibility reasons, the <code>%{__python}</code> macro was
defined to <code>/usr/bin/python</code>. As a direct consequence, all
derived macros:

* <code>%{python}</code>
* <code>%{python_version}</code>
* <code>%{python_version_nodots}</code>
* <code>%{python_sitelib}</code>
* <code>%{python_sitearch}</code>
* <code>%py_shebang_fix</code>
* <code>%py_build</code> variants
* <code>%py_install</code> variants

used <code>/usr/bin/python</code> as well, unless redefined to custom value
different than <code>/usr/bin/python</code>. Some of the macros
unfortunately evaluated to empty string when <code>/usr/bin/python</code>
was not installed in the buildroot.

We wanted to define <code>%{__python}</code> to an error previously, but
unfortunately, this was not yet possible due to backwards compatibility wrt
automagic byte-compilation. Hence we have done:

* [[Changes/No_more_automagic_Python_bytecompilation]]
* [[Changes/No_more_automagic_Python_bytecompilation_phase_2]]
* [[Changes/No_more_automagic_Python_bytecompilation_phase_3]]

Now, we can define the macro to an error by default. Packagers can still
define it to any custom value.

We will define the macro as follows:

 %__python %{error:attempt to use unversioned python, define %%__python to
%{__python2} or %{__python3} explicitly}

This is technically consistent with RHEL 8.

We will also define <code>%{python}</code> to <code>%{__python}</code> (we
will drop the current Lua logic that is designed to prevent
<code>%{python}</code> usage when <code>%{__python}</code> is
<code>/usr/bin/python</code>).

The default behavior will be an error:

 $ rpm --eval '%__python'
 error: attempt to use unversioned python, define %__python to
/usr/bin/python2 or /usr/bin/python3 explicitly

 $ rpm --eval '%python'
 error: attempt to use unversioned python, define %__python to
/usr/bin/python2 or /usr/bin/python3 explicitly

 $ rpm --eval '%python_version'
 error: attempt to use unversioned python, define %__python to
/usr/bin/python2 or /usr/bin/python3 explicitly

 $ rpm --eval '%python_sitelib'
 error: attempt to use unversioned python, define %__python to
/usr/bin/python2 or /usr/bin/python3 explicitly

As advised, when redefined, the macros continue to work as currently:

 $ rpm --define '__python %__python3' --eval '%python'
 /usr/bin/python3

 $ rpm --define '__python %__python3' --eval '%python_version'
 3.9

Despite the error message not actually promoting this, packagers can even
explicitly define the macro to <code>/usr/bin/python</code> to mimic the
previous behavior. However, this remains forbidden in Fedora.

 $ rpm --define '__python /usr/bin/python' --eval '%python'
 /usr/bin/python

 $ rpm --define '__python /usr/bin/python' --eval '%python_sitelib'
 /usr/lib/python3.9/site-packages

== Feedback ==
* More consistent behavior between RHEL and Fedora.
* Avoids hard to debug mistakes when <code>/usr/bin/python</code> is not
present and macros like <code>%{python_sitelib}</code> are used.
* Doing the wrong thing is not the easiest default any more.

== Scope ==
* Proposal owners:
** Redefine <code>%__python</code> and <code>%python</code>
* Other developers: nothing, AFAIK packages in Fedora already dropped this
construct, however when not, packagers will need to define
<code>%__python</code> in spec to make it work. We believe the error
message is self-explanatory.
* Release engineering: no impact
* Policies and guidelines: Mostly already exist. The [
https://docs.fedoraproject.org/en-US/packaging-guidelines/Python/#_macros
macro definition] will need to be updated in the Python guidelines to match
reality.
* Trademark approval: not needed


== Upgrade/compatibility impact ==
No user impact. Some spec files might start to fail to build with this
change, but the error is self-explanatory.

== How To Test ==
See examples in Detailed Description.

== User Experience ==
No user impact. Some spec files might start to fail to build with this
change, but the error is self-explanatory.

== Dependencies ==
[[Changes/No_more_automagic_Python_bytecompilation_phase_3]]

== Contingency Plan ==
* Contingency mechanism: the change owners can revert the changes
* Contingency deadline: beta freeze
* Blocks release? No

== Documentation ==
This page is the documentation. The updated [
https://docs.fedoraproject.org/en-US/packaging-guidelines/Python/#_macros
macro list] will also serve as documentation.

-- 
Ben Cotton
He / Him / His
Senior Program Manager, Fedora & CentOS Stream
Red Hat
TZ=America/Indiana/Indianapolis
_______________________________________________
devel mailing list -- devel@lists.fedoraproject.org
To unsubscribe send an email to 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/devel@lists.fedoraproject.org

Reply via email to