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.
55 lines
2.3 KiB
Plaintext
55 lines
2.3 KiB
Plaintext
%python3_sitelib %(%{__python3} -Ic "from distutils.sysconfig import get_python_lib; print(get_python_lib())")
|
|
%python3_sitearch %(%{__python3} -Ic "from distutils.sysconfig import get_python_lib; print(get_python_lib(1))")
|
|
%python3_version %(%{__python3} -Ic "import sys; sys.stdout.write('{0.major}.{0.minor}'.format(sys.version_info))")
|
|
%python3_version_nodots %(%{__python3} -Ic "import sys; sys.stdout.write('{0.major}{0.minor}'.format(sys.version_info))")
|
|
%python3_platform %(%{__python3} -Ic "import sysconfig; print(sysconfig.get_platform())")
|
|
%py3dir %{_builddir}/python3-%{name}-%{version}-%{release}
|
|
|
|
%py3_shbang_opts -s
|
|
|
|
# Use the slashes after expand so that the command starts on the same line as
|
|
# the macro
|
|
%py3_build() %{expand:\\\
|
|
CFLAGS="${CFLAGS:-${RPM_OPT_FLAGS}}" LDFLAGS="${LDFLAGS:-${RPM_LD_FLAGS}}"\\\
|
|
%{__python3} %{py_setup} %{?py_setup_args} build --executable="%{__python3} %{py3_shbang_opts}" %{?*}
|
|
}
|
|
|
|
%py3_build_egg() %{expand:\\\
|
|
CFLAGS="${CFLAGS:-${RPM_OPT_FLAGS}}" LDFLAGS="${LDFLAGS:-${RPM_LD_FLAGS}}"\\\
|
|
%{__python3} %{py_setup} %{?py_setup_args} bdist_egg %{?*}
|
|
}
|
|
|
|
%py3_build_wheel() %{expand:\\\
|
|
CFLAGS="${CFLAGS:-${RPM_OPT_FLAGS}}" LDFLAGS="${LDFLAGS:-${RPM_LD_FLAGS}}"\\\
|
|
%{__python3} %{py_setup} %{?py_setup_args} bdist_wheel %{?*}
|
|
}
|
|
|
|
%py3_install() %{expand:\\\
|
|
CFLAGS="${CFLAGS:-${RPM_OPT_FLAGS}}" LDFLAGS="${LDFLAGS:-${RPM_LD_FLAGS}}"\\\
|
|
%{__python3} %{py_setup} %{?py_setup_args} install -O1 --skip-build --root %{buildroot} %{?*}
|
|
}
|
|
|
|
%py3_install_egg() %{expand:\\\
|
|
mkdir -p %{buildroot}%{python3_sitelib}
|
|
easy_install-%{python3_version} -m --prefix %{buildroot}%{_prefix} -Z dist/*-py%{python3_version}.egg %{?*}
|
|
}
|
|
|
|
%py3_install_wheel() %{expand:\\\
|
|
pip%{python3_version} install -I dist/%{1} --root %{buildroot} --no-deps
|
|
}
|
|
|
|
# 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 "*"
|
|
dirname = path:match("(.*/)")
|
|
modulename = path:match(".*/([^/]+).py")
|
|
print("\\n" .. dirname .. "__pycache__/" .. modulename .. ".cpython-3" .. pyminor .. "{,.opt-?}.pyc")
|
|
end
|
|
}
|