Hello.
I am working on the RPM pyproject declarative buildsystem.
t;dr it turns this:
BuildSystem: pyproject
into this:
%prep
%autosetup -p1 -C
%generate_buildrequires
%pyproject_buildrequires
%build
%pyproject_wheel
%install
%pyproject_install
%pyproject_save_files ...
%check
%pyproject_check_import
It allows to override options to sections with BuildOption.
For detailed documentation, see
https://src.fedoraproject.org/rpms/pyproject-rpm-macros/pull-request/455 (it
has README changes in it).
---------------------------------
What should be the default for BuildOption(install)? That is, what should be
passed to %pyproject_save_files if the packager does not override it?
1. The safe+hard default: nothing
=================================
The %pyproject_save_files macro currently has no default. It requires at least
one argument. This is to avoid accidentally packaging something we don't want.
Explicit is better than implicit.
For this reason, users of the pyproject declarative buildsystem would be
required to always set BuildOption(install) explicitly.
Why I don't like this option: The declarative buildsystem was invented to make
spec files simpler. Making BuildOption(install) mandatory defeats the purpose.
2. The easy+dangerous default: '*'
==================================
When we pass '*' to %pyproject_save_files by default, we ensure all packages
work without BuildOption(install). This is the easy way. Everything is
automagic, no boilerplate necessary.
Passing '*' to %pyproject_save_files is forbidden by the Fedora packaging
guidelines because it is dangerous. If upstream removes a Python module or
(perhaps accidentally) adds a new one that conflicts with other packages, the
Fedora packager should notice.
Why I don't like this option: The default is forbidden in Fedora and hence it
is only useful elsewhere (e.g. Copr). Defaults should encourage the desired
pattern, defaults should not be forbidden. Packagers will use the default and
the rule will be ignored as not practical.
3. Guess the module name: python-foo -> foo
===========================================
When the package is named somehow, we like the Python modules to be named
identical-ish. We can create a transformation of %{name} and make that the
default. Something like this:
1. Strip python- prefix if found.
2. Strip everything after a dot (including the dot) if found.
3. Convert dashes, dots etc. to underscores.
Some nice examples:
python-requests -> requests
python-zope.interface -> zope
python-flit-core -> flit_core
tomcli -> tomcli
Examples that would need manual BuildOption(install):
python-zope-interface -> zope_interface (we need zope)
python-djangorestframework -> djangorestframework (we need rest_framework)
pytest -> pytest (we need pytest _pytest py)
This would produce a reasonable default that is easy and safe for sane packages
but it is not dangerous for the weird ones.
Option 3a) is to do this in the pyproject declarative buildsytsem macros
implementation. Explicit callers of %pyproject_save_files would not be able to
use this, which only has downsides.
Option 3b) is to make this the behavior of %pyproject_save_files when it has no
arguments. If additional module globs are necessary, all module globs need to
be passed explicitly.
Option 3c) is to make this the behavior of `%pyproject_save_files -n` and make
-n the default BuildOption(install). Users of %pyproject_save_files could
combine -n with explicit module glob list (e.g. `%pyproject_save_files -n
_pytest py` for pytest).
Why I don't like this: Its' heuristics. It smells like guesswork. I prefer
things explicit.
4. Default to %{pypi_name}
==========================
Similarly to option 3, we prefer the PyPI name and the module name to match.
Hence, we could default to %{pypi_name} or %{srcname} like %{pypi_source} does.
There would still need to be some transformations applied, because %{pypi_name}
can contain dashes and dots, etc...
Why I don't like this: %{pypi_name} is not a cardinal part of a package. It's
not part of the Python packaging guidelines and does not have a clearly defined
semantics (is it the project name or the name part of the source tarball?). It
encourages packagers to define the macro and use it everywhere in the spec,
making it harder to read. Moreover, we need to apply text transformations to it
anyway, hence we might as well do them on %{name} directly (which does not have
clear semantics either, but is always there).
---------------------------------
If I had to pick, I'd go with 3c. IMHO it is the most sane option.
What are your thoughts? Do you see other options?
--
Miro Hrončok
--
Phone: +420777974800
Fedora Matrix: mhroncok
--
_______________________________________________
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, report it:
https://pagure.io/fedora-infrastructure/new_issue