From 28533465a19c45f066004b98b0006e1daf18b6b9 Mon Sep 17 00:00:00 2001 From: Miro Hrončok Date: Apr 14 2020 16:18:48 +0000 Subject: Add the %pycached macro Usage: %files ... %pycached %{python3_sitelib}/foo.py This will list: /usr/lib/python3.8/site-packages/foo.py /usr/lib/python3.8/site-packages/__pycache__/foo.cpython-38{,.opt-?}.pyc Assuming the Python 3 version is 3.8. The bytecode files are globbed, their presence is not checked. This will fail: %pycached %{python3_sitelib}/foo error: %pycached can only be used with paths explicitly ending with .py And so will any of this: %pycached %{python3_sitelib}/* %pycached %{python3_sitelib}/foo.* %pycached %{python3_sitelib}/foo.p? %pycached %{python3_sitelib}/foo.?y %pycached %{python3_sitelib}/foo.?? But this will work: %pycached %{python3_sitelib}/foo*.py And it will generate the following globs: /usr/lib/python3.8/site-packages/foo*.py /usr/lib/python3.8/site-packages/__pycache__/foo*.cpython-38{,.opt-?}.pyc When used with paths that include Python 3 version, it globs with the version: %pycached /opt/python3.10/foo.py Generates: /opt/python3.10/foo.py /opt/python3.10/__pycache__/foo.cpython-310{,.opt-?}.pyc While paths without version have less strict globs: %pycached /custom/foo.py /custom/foo.py /custom/__pycache__/foo.cpython-3*{,.opt-?}.pyc This will generate a warning in RPM build: warning: File listed twice: /custom/__pycache__/foo.cpython-38.opt-1.pyc However it ensures the optimized bytecode is there. --- diff --git a/epel-rpm-macros.spec b/epel-rpm-macros.spec index 93bdfb4..fa0b3f3 100644 --- a/epel-rpm-macros.spec +++ b/epel-rpm-macros.spec @@ -1,6 +1,6 @@ Name: epel-rpm-macros Version: 7 -Release: 23 +Release: 24 Summary: Extra Packages for Enterprise Linux RPM macros Group: System Environment/Base @@ -52,6 +52,9 @@ install -Dpm 755 %{SOURCE2} \ %changelog +* Sat Dec 28 2019 Miro Hrončok - 7-24 +- Add the %%pycached macro + * Tue Oct 22 2019 Miro Hrončok - 7-23 - Override %%py_build from RHEL not to use %%__python2 but %%__python diff --git a/macros.epel-rpm-macros b/macros.epel-rpm-macros index d79a593..7cf8795 100644 --- a/macros.epel-rpm-macros +++ b/macros.epel-rpm-macros @@ -52,6 +52,25 @@ FCFLAGS="${FCFLAGS:-%{build_fflags}}" ; export FCFLAGS ; \ LDFLAGS="${LDFLAGS:-%{build_ldflags}}" ; export LDFLAGS +# This only supports Python 3.5+ and will never work with Python 2. +# Hence, it has no Python version in the name. +%pycached() %{lua: + path = rpm.expand("%{?1}") + if (string.sub(path, "-3") ~= ".py") then + rpm.expand("%{error:%%pycached can only be used with paths explicitly ending with .py}") + else + print(path) + pyminor = path:match("/python3.(%d+)/") or "*" + if ((pyminor ~= "*") and (tonumber(pyminor) < 5)) then + rpm.expand("%{error:%%pycached does not support Python 3." .. pyminor .. "}") + else + dirname = path:match("(.*/)") + modulename = path:match(".*/([^/]+).py") + print("\\n" .. dirname .. "__pycache__/" .. modulename .. ".cpython-3" .. pyminor .. "{,.opt-?}.pyc") + end + end +} + # gpgverify verifies signed sources. There is documentation in the script. %gpgverify %{_rpmconfigdir}/gpgverify