From 92427aa895cc9546c1579b614c671986521314b2 Mon Sep 17 00:00:00 2001 From: "Andrew J. Hesford" Date: Wed, 2 Dec 2020 10:30:13 -0500 Subject: [PATCH 1/5] build-style/python3-module: add support for PEP517 build systems --- Manual.md | 9 ++++++++ common/build-style/python3-module.sh | 23 +++++++++++++++++-- .../environment/build-style/python3-module.sh | 4 ++++ 3 files changed, 34 insertions(+), 2 deletions(-) diff --git a/Manual.md b/Manual.md index 7647f957129..8bab006868b 100644 --- a/Manual.md +++ b/Manual.md @@ -1516,6 +1516,15 @@ By default it's set to `2`. This variable is needed for multi-language applications (e.g., the application is written in C while the command is written in Python) or just single Python file ones that live in `/usr/bin`. +- `python_pep517`: valid only for the `python3-module` build style, setting this to any non-empty +value will cause `xbps-src` to build and install Python packages that conform to the PEP517 build +description format. With this enabled, the `xbps-src` build stage produces a Python wheel and the +the install stage installs the wheel to `$DESTDIR`. + +- `python_pep517_wheel`: if necessary, set this to the location of the wheel produced by the build +stage when `python_pep517` is defined. In most circumstances, `xbps-src` will automatically find and +install the correct wheel without requiring that this variable be set. + > NOTE: you need to define it *only* for non-Python modules. Also, a set of useful variables are defined to use in the templates: diff --git a/common/build-style/python3-module.sh b/common/build-style/python3-module.sh index db56feb5e0e..14943d69356 100644 --- a/common/build-style/python3-module.sh +++ b/common/build-style/python3-module.sh @@ -3,7 +3,13 @@ # do_build() { - if [ -n "$CROSS_BUILD" ]; then + if [ -n "$python_pep517" ]; then + # No PEP517 build tool currently supports compiled extensions + # Thus, there is no need to accommodate cross compilation here + mkdir -p build dist + TMPDIR=build python3 -m pip wheel --no-deps \ + --no-build-isolation --no-clean ${make_build_args} . + elif [ -n "$CROSS_BUILD" ]; then PYPREFIX="$XBPS_CROSS_BASE" CFLAGS+=" -I${XBPS_CROSS_BASE}/${py3_inc} -I${XBPS_CROSS_BASE}/usr/include" LDFLAGS+=" -L${XBPS_CROSS_BASE}/${py3_lib} -L${XBPS_CROSS_BASE}/usr/lib" @@ -24,6 +30,11 @@ do_build() { } do_check() { + if [ -n "$python_pep517" ]; then + msg_warn "No standard test exists for PEP517 Python templates" + return 0 + fi + if [ -z "$make_check_target" ]; then if ! python3 setup.py --help test >/dev/null 2>&1; then msg_warn "No command 'test' defined by setup.py.\n" @@ -36,7 +47,15 @@ do_check() { } do_install() { - if [ -n "$CROSS_BUILD" ]; then + if [ -n "$python_pep517" ]; then + # No PEP517 build tool currently supports compiled extensions + # Thus, there is no need to accommodate cross compilation here + : ${python_pep517_wheel:=${pkgname#python3-}-${version}-*-*-*.whl} + + TMPDIR=build python3 -m pip install --prefix /usr \ + --root ${DESTDIR} --no-deps --no-build-isolation \ + --no-clean ${make_install_args} ${python_pep517_wheel} + elif [ -n "$CROSS_BUILD" ]; then PYPREFIX="$XBPS_CROSS_BASE" CFLAGS+=" -I${XBPS_CROSS_BASE}/${py3_inc} -I${XBPS_CROSS_BASE}/usr/include" LDFLAGS+=" -L${XBPS_CROSS_BASE}/${py3_lib} -L${XBPS_CROSS_BASE}/usr/lib" diff --git a/common/environment/build-style/python3-module.sh b/common/environment/build-style/python3-module.sh index 56471fe88bc..9bc04e6811e 100644 --- a/common/environment/build-style/python3-module.sh +++ b/common/environment/build-style/python3-module.sh @@ -1,2 +1,6 @@ lib32disabled=yes makedepends+=" python3" + +if [ -n "$python_pep517" ]; then + hostmakedepends+=" python3-pip" +fi From c31ff9dd2a1ef7d97ed65030a6e695f0bd1dbe9b Mon Sep 17 00:00:00 2001 From: "Andrew J. Hesford" Date: Wed, 2 Dec 2020 08:08:33 -0500 Subject: [PATCH 2/5] New package: python3-flit_core-3.0.0 --- .../python3-flit_core/patches/use_toml.patch | 254 ++++++++++++++++++ srcpkgs/python3-flit_core/template | 24 ++ 2 files changed, 278 insertions(+) create mode 100644 srcpkgs/python3-flit_core/patches/use_toml.patch create mode 100644 srcpkgs/python3-flit_core/template diff --git a/srcpkgs/python3-flit_core/patches/use_toml.patch b/srcpkgs/python3-flit_core/patches/use_toml.patch new file mode 100644 index 00000000000..8a0a668f616 --- /dev/null +++ b/srcpkgs/python3-flit_core/patches/use_toml.patch @@ -0,0 +1,254 @@ +From b81b1da55ef0f2768413669725d2874fcb0c29fb Mon Sep 17 00:00:00 2001 +From: Kale Kundert +Date: Sun, 2 Feb 2020 19:22:34 -0500 +Subject: [PATCH] Replace 'pytoml' with 'toml' + +The pytoml package is deprecated, and doesn't support the most recent +TOML standard (e.g. dotted keys). +--- + doc/development.rst | 2 +- + doc/pyproject_toml.rst | 2 +- + flit/init.py | 2 +- + flit/tomlify.py | 8 ++++---- + flit_core/flit_core/build_thyself.py | 2 +- + flit_core/flit_core/config.py | 2 +- + flit_core/flit_core/sdist.py | 2 +- + flit_core/flit_core/wheel.py | 2 +- + pyproject.toml | 2 +- + tests/test_init.py | 12 ++++++------ + tests/test_tomlify.py | 4 ++-- + tox.ini | 2 +- + 12 files changed, 21 insertions(+), 21 deletions(-) + +diff --git doc/development.rst doc/development.rst +index 9b8dc5e..f714999 100644 +--- doc/development.rst ++++ doc/development.rst +@@ -5,7 +5,7 @@ To get a development installation of Flit itself:: + + git clone https://github.com/takluyver/flit.git + cd flit +- python3 -m pip install docutils requests pytoml ++ python3 -m pip install docutils requests toml + python3 bootstrap_dev.py + + This links Flit into the current Python environment, so you can make changes +diff --git doc/pyproject_toml.rst doc/pyproject_toml.rst +index f9ddc7f..8d38bf9 100644 +--- doc/pyproject_toml.rst ++++ doc/pyproject_toml.rst +@@ -120,7 +120,7 @@ Here's the full metadata section from flit itself: + "flit_core>=2.2.0", + "requests", + "docutils", +- "pytoml", ++ "toml", + "zipfile36; python_version in '3.3 3.4 3.5'", + ] + requires-python=">=3.5" +diff --git flit/init.py flit/init.py +index f7ea93a..b0c77c6 100644 +--- flit/init.py ++++ flit/init.py +@@ -5,7 +5,7 @@ + from pathlib import Path + import re + import sys +-import pytoml as toml ++import toml + + def get_data_dir(): + """Get the directory path for flit user data files. +diff --git flit/tomlify.py flit/tomlify.py +index 0c8db69..a9c9c60 100644 +--- flit/tomlify.py ++++ flit/tomlify.py +@@ -5,7 +5,7 @@ + import configparser + import os + from pathlib import Path +-import pytoml ++import toml + + from .config import metadata_list_fields + from .init import TEMPLATE +@@ -40,11 +40,11 @@ def convert(path): + + written_entrypoints = False + with Path('pyproject.toml').open('w', encoding='utf-8') as f: +- f.write(TEMPLATE.format(metadata=pytoml.dumps(metadata))) ++ f.write(TEMPLATE.format(metadata=toml.dumps(metadata))) + + if scripts: + f.write('\n[tool.flit.scripts]\n') +- pytoml.dump(scripts, f) ++ toml.dump(scripts, f) + + for groupname, group in entrypoints.items(): + if not dict(group): +@@ -53,7 +53,7 @@ def convert(path): + if '.' in groupname: + groupname = '"{}"'.format(groupname) + f.write('\n[tool.flit.entrypoints.{}]\n'.format(groupname)) +- pytoml.dump(OrderedDict(group), f) ++ toml.dump(OrderedDict(group), f) + written_entrypoints = True + + print("Written 'pyproject.toml'") +diff --git flit_core/flit_core/build_thyself.py flit_core/flit_core/build_thyself.py +index 7daf67f..f3aaf7c 100644 +--- flit_core/flit_core/build_thyself.py ++++ flit_core/flit_core/build_thyself.py +@@ -25,7 +25,7 @@ + 'summary': ('Distribution-building parts of Flit. ' + 'See flit package for more information'), + 'requires_dist': [ +- 'pytoml', ++ 'toml', + ], + 'requires_python': '>=3.4', + 'classifiers': [ +diff --git flit_core/flit_core/config.py flit_core/flit_core/config.py +index 0af9c00..6ed20d3 100644 +--- flit_core/flit_core/config.py ++++ flit_core/flit_core/config.py +@@ -3,7 +3,7 @@ + import logging + import os + import os.path as osp +-import pytoml as toml ++import toml + import re + + log = logging.getLogger(__name__) +diff --git flit_core/flit_core/sdist.py flit_core/flit_core/sdist.py +index 1fe5bb4..963b4e5 100644 +--- flit_core/flit_core/sdist.py ++++ flit_core/flit_core/sdist.py +@@ -95,7 +95,7 @@ def __init__(self, module, metadata, cfgdir, reqs_by_extra, entrypoints, + + @classmethod + def from_ini_path(cls, ini_path: Path): +- # Local import so bootstrapping doesn't try to load pytoml ++ # Local import so bootstrapping doesn't try to load toml + from .config import read_flit_config + ini_info = read_flit_config(ini_path) + srcdir = ini_path.parent +diff --git flit_core/flit_core/wheel.py flit_core/flit_core/wheel.py +index 1550846..2bc55e1 100644 +--- flit_core/flit_core/wheel.py ++++ flit_core/flit_core/wheel.py +@@ -83,7 +83,7 @@ def __init__(self, directory, module, metadata, entrypoints, target_fp): + + @classmethod + def from_ini_path(cls, ini_path, target_fp): +- # Local import so bootstrapping doesn't try to load pytoml ++ # Local import so bootstrapping doesn't try to load toml + from .config import read_flit_config + directory = ini_path.parent + ini_info = read_flit_config(ini_path) +diff --git pyproject.toml pyproject.toml +index ac8d001..0af74b2 100644 +--- pyproject.toml ++++ pyproject.toml +@@ -11,7 +11,7 @@ requires=[ + "flit_core>=3.0.0", + "requests", + "docutils", +- "pytoml", ++ "toml", + "zipfile36; python_version in '3.3 3.4 3.5'", + ] + requires-python=">=3.5" +diff --git tests/test_init.py tests/test_init.py +index fb8ad4d..7330ff5 100644 +--- tests/test_init.py ++++ tests/test_init.py +@@ -6,7 +6,7 @@ + from unittest.mock import patch + import pytest + +-import pytoml ++import toml + + from flit import init + +@@ -107,7 +107,7 @@ def test_init(): + generated = Path(td) / 'pyproject.toml' + assert_isfile(generated) + with generated.open() as f: +- data = pytoml.load(f) ++ data = toml.load(f) + assert data['tool']['flit']['metadata'][ + 'author-email'] == "test@example.com" + license = Path(td) / 'LICENSE' +@@ -131,7 +131,7 @@ def test_init_homepage_and_license_are_optional(): + ti = init.TerminalIniter(td) + ti.initialise() + with Path(td, 'pyproject.toml').open() as f: +- data = pytoml.load(f) ++ data = toml.load(f) + assert not Path(td, 'LICENSE').exists() + metadata = data['tool']['flit']['metadata'] + assert metadata == { +@@ -154,7 +154,7 @@ def test_init_homepage_validator(): + ti = init.TerminalIniter(td) + ti.initialise() + with Path(td, 'pyproject.toml').open() as f: +- data = pytoml.load(f) ++ data = toml.load(f) + metadata = data['tool']['flit']['metadata'] + assert metadata == { + 'author': 'Test Author', +@@ -176,7 +176,7 @@ def test_author_email_field_is_optional(): + ti = init.TerminalIniter(td) + ti.initialise() + with Path(td, 'pyproject.toml').open() as f: +- data = pytoml.load(f) ++ data = toml.load(f) + assert not Path(td, 'LICENSE').exists() + metadata = data['tool']['flit']['metadata'] + assert metadata == { +@@ -216,7 +216,7 @@ def test_init_readme_found_yes_choosen(): + ti = init.TerminalIniter(td) + ti.initialise() + with Path(td, 'pyproject.toml').open() as f: +- data = pytoml.load(f) ++ data = toml.load(f) + + metadata = data['tool']['flit']['metadata'] + assert metadata == { +diff --git tests/test_tomlify.py tests/test_tomlify.py +index 2bd75dc..a7b7978 100644 +--- tests/test_tomlify.py ++++ tests/test_tomlify.py +@@ -1,6 +1,6 @@ + import os + from pathlib import Path +-import pytoml ++import toml + from shutil import copy + from testpath import assert_isfile + +@@ -18,7 +18,7 @@ def test_tomlify(copy_sample, monkeypatch): + assert_isfile(pyproject_toml) + + with pyproject_toml.open(encoding='utf-8') as f: +- content = pytoml.load(f) ++ content = toml.load(f) + + assert 'build-system' in content + assert 'tool' in content +diff --git tox.ini tox.ini +index 08ce1bf..d1025e1 100644 +--- tox.ini ++++ tox.ini +@@ -18,7 +18,7 @@ deps = + testpath + responses + docutils +- pytoml ++ toml + pytest>=2.7.3 + pytest-cov + diff --git a/srcpkgs/python3-flit_core/template b/srcpkgs/python3-flit_core/template new file mode 100644 index 00000000000..f08ceb41806 --- /dev/null +++ b/srcpkgs/python3-flit_core/template @@ -0,0 +1,24 @@ +# Template file for 'python3-flit_core' +pkgname=python3-flit_core +version=3.0.0 +revision=1 +wrksrc="flit-${version}" +build_wrksrc="flit_core" +build_style=python3-module +python_pep517="yes" +depends="python3-toml" +short_desc="Simplified packaging of Python modules - PEP 517 build backend" +maintainer="Andrew J. Hesford " +license="BSD-3-Clause" +homepage="https://flit.readthedocs.io" +changelog="https://flit.readthedocs.io/en/latest/history.html" +distfiles="${PYPI_SITE}/f/flit/flit-${version}.tar.gz" +checksum=b4fe0f84a1ffbf125d003e253ec98c0b6e3e31290b31fba3ad22d28588c20893 + +do_check() { + : provides no tests +} + +post_install() { + vlicense ../LICENSE +} From a4c0173c4b14bd204ae430ef611d276a669884b8 Mon Sep 17 00:00:00 2001 From: "Andrew J. Hesford" Date: Wed, 2 Dec 2020 10:28:38 -0500 Subject: [PATCH 3/5] python-packaging: split package New package: python3-packaging-20.7 --- srcpkgs/python-packaging/template | 20 +++++--------------- srcpkgs/python-packaging/update | 1 + srcpkgs/python3-packaging | 1 - srcpkgs/python3-packaging/template | 25 +++++++++++++++++++++++++ 4 files changed, 31 insertions(+), 16 deletions(-) create mode 100644 srcpkgs/python-packaging/update delete mode 120000 srcpkgs/python3-packaging create mode 100644 srcpkgs/python3-packaging/template diff --git a/srcpkgs/python-packaging/template b/srcpkgs/python-packaging/template index e36a04a1540..aa1f64182d7 100644 --- a/srcpkgs/python-packaging/template +++ b/srcpkgs/python-packaging/template @@ -1,29 +1,19 @@ # Template file for 'python-packaging' pkgname=python-packaging version=20.4 -revision=1 +revision=2 wrksrc="packaging-${version}" -build_style=python-module -pycompile_module="packaging" -hostmakedepends="python-setuptools python3-setuptools" -depends="python-attrs python-parsing python-six" +build_style=python2-module +hostmakedepends="python-setuptools" +depends="python-parsing python-six" short_desc="Core utilities for Python packages (Python2)" maintainer="Alessio Sergi " license="Apache-2.0, BSD-2-Clause" homepage="https://github.com/pypa/packaging" +changelog="https://raw.githubusercontent.com/pypa/packaging/master/CHANGELOG.rst" distfiles="${PYPI_SITE}/p/packaging/packaging-${version}.tar.gz" checksum=4357f74f47b9c12db93624a82154e9b120fa8293699949152b22065d556079f8 post_install() { vlicense LICENSE } - -python3-packaging_package() { - pycompile_module="packaging" - depends="python3-attrs python3-parsing python3-six" - short_desc="${short_desc/Python2/Python3}" - pkg_install() { - vmove usr/lib/python3* - vlicense LICENSE - } -} diff --git a/srcpkgs/python-packaging/update b/srcpkgs/python-packaging/update new file mode 100644 index 00000000000..f3300f258a6 --- /dev/null +++ b/srcpkgs/python-packaging/update @@ -0,0 +1 @@ +pattern="packaging-\K20\.4(\.[0-9.]+)?(?=.tar.gz)" diff --git a/srcpkgs/python3-packaging b/srcpkgs/python3-packaging deleted file mode 120000 index 98299fdb1d7..00000000000 --- a/srcpkgs/python3-packaging +++ /dev/null @@ -1 +0,0 @@ -python-packaging \ No newline at end of file diff --git a/srcpkgs/python3-packaging/template b/srcpkgs/python3-packaging/template new file mode 100644 index 00000000000..7be1238d7a2 --- /dev/null +++ b/srcpkgs/python3-packaging/template @@ -0,0 +1,25 @@ +# Template file for 'python3-packaging' +pkgname=python3-packaging +version=20.7 +revision=1 +wrksrc="packaging-${version}" +build_style=python3-module +python_pep517=yes +hostmakedepends="python3-flit_core" +depends="python3-parsing" +checkdepends="python3-pytest" +short_desc="Core utilities for Python packages (Python3)" +maintainer="Andrew J. Hesford " +license="Apache-2.0, BSD-2-Clause" +homepage="https://github.com/pypa/packaging" +checksum=05af3bb85d320377db281cf254ab050e1a7ebcbf5410685a9a407e18a1f81236 +distfiles="${PYPI_SITE}/p/packaging/packaging-${version}.tar.gz" +checksum=05af3bb85d320377db281cf254ab050e1a7ebcbf5410685a9a407e18a1f81236 + +do_check() { + : provides no tests +} + +post_install() { + vlicense LICENSE +} From 8358a9d02a89122fbdb75d695a3bc196cf6b88de Mon Sep 17 00:00:00 2001 From: "Andrew J. Hesford" Date: Wed, 2 Dec 2020 13:58:38 -0500 Subject: [PATCH 4/5] build-style/python3-module: automatically detect pytest in do_check --- common/build-style/python3-module.sh | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/common/build-style/python3-module.sh b/common/build-style/python3-module.sh index 14943d69356..4d9ecd3433b 100644 --- a/common/build-style/python3-module.sh +++ b/common/build-style/python3-module.sh @@ -30,20 +30,23 @@ do_build() { } do_check() { - if [ -n "$python_pep517" ]; then - msg_warn "No standard test exists for PEP517 Python templates" + if python3 -m pytest --help >/dev/null 2>&1; then + python3 -m pytest ${make_check_args} ${make_check_target} + elif [ -n "$python_pep517" ]; then + msg_warn "Unable to determine tests for PEP517 Python templates" return 0 - fi - - if [ -z "$make_check_target" ]; then - if ! python3 setup.py --help test >/dev/null 2>&1; then - msg_warn "No command 'test' defined by setup.py.\n" - return 0 + else + # Fall back to deprecated setup.py test orchestration without pytest + if [ -z "$make_check_target" ]; then + if ! python3 setup.py --help test >/dev/null 2>&1; then + msg_warn "No command 'test' defined by setup.py.\n" + return 0 + fi fi - fi - : ${make_check_target:=test} - python3 setup.py ${make_check_target} ${make_check_args} + : ${make_check_target:=test} + python3 setup.py ${make_check_target} ${make_check_args} + fi } do_install() { From f72fa4e155200b062bea515fa59d0040217106e1 Mon Sep 17 00:00:00 2001 From: "Andrew J. Hesford" Date: Wed, 2 Dec 2020 14:00:31 -0500 Subject: [PATCH 5/5] python3-tifffile: employ improved, automatic do_check --- srcpkgs/python3-tifffile/template | 4 ---- 1 file changed, 4 deletions(-) diff --git a/srcpkgs/python3-tifffile/template b/srcpkgs/python3-tifffile/template index c5bf27a1424..1d6dcb2a522 100644 --- a/srcpkgs/python3-tifffile/template +++ b/srcpkgs/python3-tifffile/template @@ -15,10 +15,6 @@ changelog="https://raw.githubusercontent.com/cgohlke/tifffile/master/CHANGES.rst distfiles="${homepage}/archive/v${version}.tar.gz" checksum=64fc7602330301e910cc343e99bac02f9b453e933c1ee2050f316cbfee725df3 -do_check() { - python3 -m pytest -} - post_install() { vlicense LICENSE }