Compare commits

...

30 Commits
epel9 ... epel8

Author SHA1 Message Date
Miro Hrončok d4a234f1e2 Prepare support for Python 3.12
12 months ago
Orion Poplawski b52ef20b2b Add full %%py3_check_import macro
1 year ago
Miro Hrončok 7761cacd3a Fix spec-comment
2 years ago
Miro Hrončok 6a548935a5 Prepare support for Python 3.11
2 years ago
Maxwell G 7c1824e99a
Backport rpmautospec fallback macros
2 years ago
Maxwell G 59caa90b5f
Stop overriding macros that are now in RHEL 8.7
2 years ago
Jitka Plesnikova 62c9018653 Add boolean operator to perl-generators-epel
2 years ago
Jitka Plesnikova b6dbd20fc7 Add perl-generators-epel to the buildroot
2 years ago
Todd Zullinger 945f3703f2 Backport macros.shell-completions from Fedora
2 years ago
Maxwell G 12d369f153
Fix rpmlint errors
2 years ago
Maxwell G ba3cef50bb
Set %__python3 to /usr/bin/python3.6 by default
2 years ago
Iñaki Úcar 5aa786f208 Backport java_arches macro from Fedora
2 years ago
Maxwell G 73454ac54c
Add explanatory comment and escape changelog macro
2 years ago
Maxwell G fe7e34ff91
Remove %__pythondist_provides from pythondist.attr.
2 years ago
Maxwell G 8ba0536651
Explicitly Require python3-rpm-generators
2 years ago
Miro Hrončok fcd61e6767 Fix a regression in the %pytest definition
2 years ago
Maxwell G e3b1254b4b
Update changelog
3 years ago
Maxwell G 653db1df00
Only pull in python2-rpm-macros when python2-devel is present.
3 years ago
Maxwell G c2cea18f09
Reference bugzillas for modified macros
3 years ago
Maxwell G a8c53aa651
Make %pytest and %py3_dist compatible with alt. pythons
3 years ago
Maxwell G b29f7a38f1
Override %__python3 based on %python3_pkgversion
3 years ago
Maxwell G 5384f530ca
Remove macros that have been added to RHEL itself.
3 years ago
Maxwell G e8644934b9
Update python-rpm-macros specfile comments
3 years ago
Miro Hrončok 0fef179a9d fixup: Use a bigger hammer
3 years ago
Maxwell G 54c1f931b6
Always pull in correct python3X-rpm-macros package
3 years ago
Maxwell G 3d7226a416
Add `Requires: ansible-srpm-macros`
3 years ago
Miro Hrončok 73629be078 Remove %gpgverify and /usr/lib/rpm/gpgverify, it is available in RHEL 8.4+
3 years ago
Pablo Greco d733fbe476 Backport macros.sysusers from Fedora/systemd
3 years ago
Karolina Surma 4ce1a695cf Add -f, -t, -e options to %%py_check_import macros
3 years ago
Tomas Orsava 367f6266ab Define a new macros %python_wheel_dir and %python_wheel_pkg_prefix
3 years ago

@ -1,5 +1,3 @@
addFilter("epel-rpm-macros\.src: W: strange-permission cmake-(build|configure|install) 755")
addFilter("epel-rpm-macros\.src: W: strange-permission gpgverify 755")
addFilter("no-%build-section")
addFilter("no-documentation")
addFilter("only-non-binary-in-usr-lib")

@ -1,22 +1,35 @@
Name: epel-rpm-macros
Version: 8
Release: 24
Release: 41
Summary: Extra Packages for Enterprise Linux RPM macros
Group: System Environment/Base
License: GPLv2
# import_all_modules.py: MIT
License: GPLv2 and MIT
# This is a EPEL maintained package which is specific to
# our distribution. Thus the source is only available from
# within this srpm.
URL: http://download.fedoraproject.org/pub/epel
URL: https://download.fedoraproject.org/pub/epel
Source0: macros.epel-rpm-macros
Source1: macros.zzz-epel-override
Source2: gpgverify
Source3: pythondist.attr
Source9: GPL
# sysusers https://src.fedoraproject.org/rpms/systemd/c/ced9237a14d6775a98e1a2f93880990417b4ae6e
Source21: macros.sysusers
Source22: sysusers.attr
Source23: sysusers.prov
Source24: sysusers.generate-pre.sh
# misc macros
Source150: macros.build-constraints
Source151: https://src.fedoraproject.org/rpms/redhat-rpm-config/raw/rawhide/f/macros.shell-completions
# autochangelog and autorelease fallback macros
%global rpmautospec_commit 52f3c2017e10c5ab5a183fed772e9fe8a86a20fb
Source152: https://pagure.io/fedora-infra/rpmautospec/raw/%{rpmautospec_commit}/f/rpm/macros.d/macros.rpmautospec
# Python code
Source302: import_all_modules.py
BuildArch: noarch
Requires: redhat-release >= %{version}
@ -28,16 +41,43 @@ Requires: lua-srpm-macros
Requires: python-srpm-macros
# Since the RHEL python-devel package doesn't require them, bring them in here
Requires: python-rpm-macros
Requires: python2-rpm-macros
# Make sure EPEL8's Python 3 packages use /usr/bin/python3.6 or python3.8
# instead of /usr/libexec/platform-python
Requires: (python-modular-rpm-macros if python3-devel)
Suggests: python36-rpm-macros
Requires: (python2-rpm-macros if python2-devel)
# Make sure EPEL8's Python 3 packages use /usr/bin/python3.{6,8,9} instead of /usr/libexec/platform-python.
# This will install the python3X-rpm-macros version corresponding to the python3X-devel version installed.
# If multiple versions are installed together, it will prefer python36-rpm-macros, the default Python version.
Requires: (python-modular-rpm-macros if (python36-devel or python38-devel or python39-devel or python3.11-devel or python3.12-devel))
# We use weak dependencies here in order to avoid creating conflicts between
# the different python3X-devel packages.
Recommends: (python36-rpm-macros if python36-devel)
Suggests: (python38-rpm-macros if python38-devel)
Suggests: (python39-rpm-macros if python39-devel)
Suggests: (python3.11-rpm-macros if python3.11-devel)
Suggests: (python3.12-rpm-macros if python3.12-devel)
# # python3-rpm-generators is already pulled in by python3X-devel
# (indirectly through platform-python-devel by python36-devel and directly by the rest),
# but we explictly Require it here, as it's needed by pythondist.attr.
Requires: (python3-rpm-generators if python-modular-rpm-macros)
#systemd additional macros https://pagure.io/epel/issue/77
Requires: (epel-rpm-macros-systemd if systemd-rpm-macros)
Requires: ansible-srpm-macros
# Provides backport from Fedora's perl-generators related to proposal
# https://fedoraproject.org/wiki/Changes/Perl_replace_MODULE_COMPAT_by_generator
Requires: (perl-generators-epel if perl-generators)
%description
This package contains the Extra Packages for Enterprise Linux (EPEL) RPM
macros for building EPEL packages.
%package systemd
Summary: Extra Packages for Enterprise Linux RPM macros (systemd)
Requires: epel-rpm-macros
Requires: systemd-rpm-macros
%description systemd
This package contains the systemd specific Extra Packages for Enterprise
Linux (EPEL) RPM macros for building EPEL packages.
%prep
%setup -cT
install -pm 644 %{SOURCE9} .
@ -50,28 +90,115 @@ install -Dpm 644 %{SOURCE0} \
install -Dpm 644 %{SOURCE1} \
%{buildroot}%{_sysconfdir}/rpm/macros.zzz-epel-override
install -Dpm 755 %{SOURCE2} \
%{buildroot}%{_rpmconfigdir}/gpgverify
install -Dpm 644 %{SOURCE3} \
%{buildroot}%{_fileattrsdir}/pythondist.attr
# sysusers
install -Dpm 0644 %{SOURCE21} \
%{buildroot}%{_rpmmacrodir}/macros.sysusers
install -Dpm 0644 %{SOURCE22} \
%{buildroot}%{_fileattrsdir}//sysusers.attr
install -Dpm 0755 %{SOURCE23} \
%{buildroot}%{_rpmconfigdir}/sysusers.prov
install -Dpm 0755 %{SOURCE24} \
%{buildroot}%{_rpmconfigdir}/sysusers.generate-pre.sh
# misc macros
install -Dpm 644 %{SOURCE150} \
%{buildroot}%{_rpmmacrodir}/macros.build-constraints
install -Dpm 644 %{SOURCE151} \
%{buildroot}%{_rpmmacrodir}/macros.shell-completions
install -Dpm 644 %{SOURCE152} \
%{buildroot}%{_rpmmacrodir}/macros.rpmautospec
# python scripts
mkdir -p %{buildroot}%{_rpmconfigdir}/redhat
install -Dpm 644 %{SOURCE302} %{buildroot}%{_rpmconfigdir}/redhat/
%files
%license GPL
%{_rpmmacrodir}/macros.epel-rpm-macros
%{_rpmmacrodir}/macros.rpmautospec
%{_sysconfdir}/rpm/macros.zzz-epel-override
%{_rpmconfigdir}/gpgverify
%{_fileattrsdir}/pythondist.attr
# misc macros
%{_rpmmacrodir}/macros.build-constraints
%{_rpmmacrodir}/macros.shell-completions
# python scripts
%{_rpmconfigdir}/redhat/import_all_modules.py
%files systemd
# sysusers
%{_rpmconfigdir}/macros.d/macros.sysusers
%{_rpmconfigdir}/fileattrs/sysusers.attr
%{_rpmconfigdir}/sysusers.prov
%{_rpmconfigdir}/sysusers.generate-pre.sh
%changelog
* Wed Jan 03 2024 Miro Hrončok <mhroncok@redhat.com> - 8-41
- Prepare support for Python 3.12
* Fri Oct 06 2023 Orion Poplawski <orion@nwra.com> - 8-40
- Add full %%py3_check_import macro
* Fri Apr 07 2023 Miro Hrončok <mhroncok@redhat.com> - 8-39
- Prepare support for Python 3.11
* Fri Mar 10 2023 Maxwell G <maxwell@gtmx.me> - 8-38
- Backport rpmautospec fallback macros
* Wed Feb 08 2023 Maxwell G <gotmax@e.email> - 8-37
- Stop overriding macros that are now in RHEL 8.7
* Mon Jan 23 2023 Jitka Plesnikova <jplesnik@redhat.com> - 8-36
- Add perl-generators-epel to the buildroot
* Tue Nov 22 2022 Todd Zullinger <tmz@pobox.com> - 8-35
- Backport macros.shell-completions from Fedora
* Tue Nov 08 2022 Maxwell G <gotmax@e.email> - 8-34
- Set %%__python3 to /usr/bin/python3.6 by default
* Wed Aug 24 2022 Iñaki Úcar <iucar@fedoraproject.org> - 8-33
- Backport java_arches macro from Fedora
* Sat Jul 16 2022 Maxwell G <gotmax@e.email> - 8-32
- Explicitly Require python3-rpm-generators
- Remove %%__pythondist_provides from pythondist.attr.
- Ensure that packages built against alternative python stacks do not have
python3dist(x) Provides.
- Related: rhbz#1776941.
* Sat Jul 16 2022 Miro Hrončok <mhroncok@redhat.com> - 8-31
- Fix a regression in the %%pytest definition (/usr/bin/pytest: No such file or directory)
* Tue May 24 2022 Maxwell G <gotmax@e.email> - 8-30
- Pull in appropriate python3X-rpm-macros package for non-default Python
versions
- Ensure the python macros work properly when building against non-default
python interpreters.
- Only pull in python2-rpm-macros when python2-devel is present.
- Remove macros that have been added to RHEL itself.
* Tue May 17 2022 Maxwell G <gotmax@e.email> - 8-29
- Add `Requires: ansible-srpm-macros`
- Backport @churchyard's packaging nitpicks from epel9
* Tue Mar 15 2022 Miro Hrončok <mhroncok@redhat.com> - 8-28
- Remove %%gpgverify and /usr/lib/rpm/gpgverify, it is available in RHEL 8.4+
* Wed Jan 19 2022 Pablo Greco <pgreco@centosproject.org> - 8-27
- Backport systemd sysusers macros from Fedora
* Wed Oct 27 2021 Karolina Surma <ksurma@redhat.com> - 8-26
- Add -t, -f, -e options to %%py_check_import which emit warning when used
* Tue Oct 26 2021 Tomas Orsava <torsava@redhat.com> - 8-25
- Define a new macros %%python_wheel_dir and %%python_wheel_pkg_prefix
* Wed Sep 1 2021 Michel Alexandre Salim <salimma@fedoraproject.org> - 8-24
- Fix macros.build-constraints' %%limit_build
- number of CPUs will never be set to less than 1

@ -1,116 +0,0 @@
#!/bin/bash
# Copyright 2018 B. Persson, Bjorn@Rombobeorn.se
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
function print_help {
cat <<'EOF'
Usage: gpgverify --keyring=<pathname> --signature=<pathname> --data=<pathname>
gpgverify is a wrapper around gpgv designed for easy and safe scripting. It
verifies a file against a detached OpenPGP signature and a keyring. The keyring
shall contain all the keys that are trusted to certify the authenticity of the
file, and must not contain any untrusted keys.
The differences, compared to invoking gpgv directly, are that gpgverify accepts
the keyring in either ASCII-armored or unarmored form, and that it will not
accidentally use a default keyring in addition to the specified one.
Parameters:
--keyring=<pathname> keyring with all the trusted keys and no others
--signature=<pathname> detached signature to verify
--data=<pathname> file to verify against the signature
EOF
}
fatal_error() {
message="$1" # an error message
status=$2 # a number to use as the exit code
echo "gpgverify: $message" >&2
exit $status
}
require_parameter() {
term="$1" # a term for a required parameter
value="$2" # Complain and terminate if this value is empty.
if test -z "${value}" ; then
fatal_error "No ${term} was provided." 2
fi
}
check_status() {
action="$1" # a string that describes the action that was attempted
status=$2 # the exit code of the command
if test $status -ne 0 ; then
fatal_error "$action failed." $status
fi
}
# Parse the command line.
keyring=
signature=
data=
for parameter in "$@" ; do
case "${parameter}" in
(--help)
print_help
exit
;;
(--keyring=*)
keyring="${parameter#*=}"
;;
(--signature=*)
signature="${parameter#*=}"
;;
(--data=*)
data="${parameter#*=}"
;;
(*)
fatal_error "Unknown parameter: \"${parameter}\"" 2
;;
esac
done
require_parameter 'keyring' "${keyring}"
require_parameter 'signature' "${signature}"
require_parameter 'data file' "${data}"
# Make a temporary working directory.
workdir="$(mktemp --directory)"
check_status 'Making a temporary directory' $?
workring="${workdir}/keyring.gpg"
# Decode any ASCII armor on the keyring. This is harmless if the keyring isn't
# ASCII-armored.
gpg2 --homedir="${workdir}" --yes --output="${workring}" --dearmor "${keyring}"
check_status 'Decoding the keyring' $?
# Verify the signature using the decoded keyring.
gpgv2 --homedir="${workdir}" --keyring="${workring}" "${signature}" "${data}"
check_status 'Signature verification' $?
# (--homedir isn't actually necessary. --dearmor processes only the input file,
# and if --keyring is used and contains a slash, then gpgv2 uses only that
# keyring. Thus neither command will look for a default keyring, but --homedir
# makes extra double sure that no default keyring will be touched in case
# another version of GPG works differently.)
# Clean up. (This is not done in case of an error that may need inspection.)
rm --recursive --force ${workdir}

@ -0,0 +1,171 @@
'''Script to perform import of each module given to %%py_check_import
'''
import argparse
import importlib
import fnmatch
import os
import re
import site
import sys
from contextlib import contextmanager
from pathlib import Path
def read_modules_files(file_paths):
'''Read module names from the files (modules must be newline separated).
Return the module names list or, if no files were provided, an empty list.
'''
if not file_paths:
return []
modules = []
for file in file_paths:
file_contents = file.read_text()
modules.extend(file_contents.split())
return modules
def read_modules_from_cli(argv):
'''Read module names from command-line arguments (space or comma separated).
Return the module names list.
'''
if not argv:
return []
# %%py3_check_import allows to separate module list with comma or whitespace,
# we need to unify the output to a list of particular elements
modules_as_str = ' '.join(argv)
modules = re.split(r'[\s,]+', modules_as_str)
# Because of shell expansion in some less typical cases it may happen
# that a trailing space will occur at the end of the list.
# Remove the empty items from the list before passing it further
modules = [m for m in modules if m]
return modules
def filter_top_level_modules_only(modules):
'''Filter out entries with nested modules (containing dot) ie. 'foo.bar'.
Return the list of top-level modules.
'''
return [module for module in modules if '.' not in module]
def any_match(text, globs):
'''Return True if any of given globs fnmatchcase's the given text.'''
return any(fnmatch.fnmatchcase(text, g) for g in globs)
def exclude_unwanted_module_globs(globs, modules):
'''Filter out entries which match the either of the globs given as argv.
Return the list of filtered modules.
'''
return [m for m in modules if not any_match(m, globs)]
def read_modules_from_all_args(args):
'''Return a joined list of modules from all given command-line arguments.
'''
modules = read_modules_files(args.filename)
modules.extend(read_modules_from_cli(args.modules))
if args.exclude:
modules = exclude_unwanted_module_globs(args.exclude, modules)
if args.top_level:
modules = filter_top_level_modules_only(modules)
# Error when someone accidentally managed to filter out everything
if len(modules) == 0:
raise ValueError('No modules to check were left')
return modules
def import_modules(modules):
'''Procedure to perform import check for each module name from the given list of modules.
'''
for module in modules:
print('Check import:', module, file=sys.stderr)
importlib.import_module(module)
def argparser():
parser = argparse.ArgumentParser(
description='Generate list of all importable modules for import check.'
)
parser.add_argument(
'modules', nargs='*',
help=('Add modules to check the import (space or comma separated).'),
)
parser.add_argument(
'-f', '--filename', action='append', type=Path,
help='Add importable module names list from file.',
)
parser.add_argument(
'-t', '--top-level', action='store_true',
help='Check only top-level modules.',
)
parser.add_argument(
'-e', '--exclude', action='append',
help='Provide modules globs to be excluded from the check.',
)
return parser
@contextmanager
def remove_unwanteds_from_sys_path():
'''Remove cwd and this script's parent from sys.path for the import test.
Bring the original contents back after import is done (or failed)
'''
cwd_absolute = Path.cwd().absolute()
this_file_parent = Path(__file__).parent.absolute()
old_sys_path = list(sys.path)
for path in old_sys_path:
if Path(path).absolute() in (cwd_absolute, this_file_parent):
sys.path.remove(path)
try:
yield
finally:
sys.path = old_sys_path
def addsitedirs_from_environ():
'''Load directories from the _PYTHONSITE environment variable (separated by :)
and load the ones already present in sys.path via site.addsitedir()
to handle .pth files in them.
This is needed to properly import old-style namespace packages with nspkg.pth files.
See https://bugzilla.redhat.com/2018551 for a more detailed rationale.'''
for path in os.getenv('_PYTHONSITE', '').split(':'):
if path in sys.path:
site.addsitedir(path)
def main(argv=None):
cli_args = argparser().parse_args(argv)
if not cli_args.modules and not cli_args.filename:
raise ValueError('No modules to check were provided')
modules = read_modules_from_all_args(cli_args)
with remove_unwanteds_from_sys_path():
addsitedirs_from_environ()
import_modules(modules)
if __name__ == '__main__':
main()

@ -7,29 +7,14 @@
%_monodir %{_prefix}/lib/mono
%_monogacdir %{_monodir}/gac
# A directory for rpm macros
%rpmmacrodir /usr/lib/rpm/macros.d
# Upstream RPM has this in Fedora, obsoleting the one above.
%_rpmmacrodir /usr/lib/rpm/macros.d
# Bash completions; not in bash to not intefere with install ordering
%bash_completion_dir /usr/share/bash-completion/completions/
#
# NOTE: This macro is deprecated; point to the preferred macro from
# macros.shell-completions
%bash_completion_dir %{bash_completions_dir}
# Use the non-underscored Python macros to refer to Python in spec, etc.
%python2 %__python2
%python3 %__python3
# Simplified version backported from Fedora
%py_shebang_fix %{expand:/usr/bin/pathfix.py -pni "%{__python} %{py_shbang_opts}"}
%py2_shebang_fix %{expand:/usr/bin/pathfix.py -pni "%{__python2} %{py2_shbang_opts}"}
%py3_shebang_fix %{expand:/usr/bin/pathfix.py -pni "%{__python3} %{py3_shbang_opts}"}
# https://fedoraproject.org/wiki/Changes/Python_Upstream_Architecture_Names
%python_platform_triplet %(%{__python} -Esc "import sysconfig; print(sysconfig.get_config_var('MULTIARCH'))")
%python_ext_suffix %(%{__python} -Esc "import sysconfig; print(sysconfig.get_config_var('EXT_SUFFIX'))")
%python3_platform_triplet %(%{__python3} -Ic "import sysconfig; print(sysconfig.get_config_var('MULTIARCH'))")
%python3_ext_suffix %(%{__python3} -Ic "import sysconfig; print(sysconfig.get_config_var('EXT_SUFFIX'))")
# Users can use %%python only if they redefined %%__python (e.g. to %%__python3)
%python() %{lua:\
@ -41,52 +26,14 @@
end\
}
# 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("%{?*}")
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
}
# This is intended for Python 3 only, hence also no Python version in the name.
%__pytest /usr/bin/pytest-3
%pytest %{expand:\\\
CFLAGS="${CFLAGS:-${RPM_OPT_FLAGS}}" LDFLAGS="${LDFLAGS:-${RPM_LD_FLAGS}}"\\\
PATH="%{buildroot}%{_bindir}:$PATH"\\\
PYTHONPATH="${PYTHONPATH:-%{buildroot}%{python3_sitearch}:%{buildroot}%{python3_sitelib}}"\\\
PYTHONDONTWRITEBYTECODE=1\\\
%__pytest}
%py_provides() %{lua:
local name = rpm.expand('%1')
if name == '%1' then
rpm.expand('%{error:%%py_provides requires at least 1 argument, the name to provide}')
end
local evr = rpm.expand('%2')
if evr == '%2' then
evr = rpm.expand('%{?epoch:%{epoch}:}%{version}-%{release}')
end
print('Provides: ' .. name .. ' = ' .. evr .. '\\n')
-- NB: dash needs to be escaped!
if name:match('^python3%-') then
replaced = name:gsub('^python3%-', 'python-')
print('Provides: ' .. replaced .. ' = ' .. evr .. '\\n')
end
}
# With $PATH and $PYTHONPATH set to the %%buildroot,
# try to import the given Python module(s).
# Useful as a smoke test in %%check when running tests is not feasible.
# Use spaces or commas as separators.
%py_check_import() %{expand:\\\
%py_check_import(e:tf:) %{expand:\\\
%{-e:echo 'WARNING: The -e option of %%%%py_check_import is not currently supported on EPEL.' >&2}
%{-t:echo 'WARNING: The -t option of %%%%py_check_import is not currently supported on EPEL.' >&2}
%{-f:echo 'WARNING: The -f option of %%%%py_check_import is not currently supported on EPEL.' >&2}
(cd %{_topdir} &&\\\
PATH="%{buildroot}%{_bindir}:$PATH"\\\
PYTHONPATH="${PYTHONPATH:-%{buildroot}%{python_sitearch}:%{buildroot}%{python_sitelib}}"\\\
@ -94,7 +41,10 @@
%{__python} -c "import %{lua:local m=rpm.expand('%{?*}'):gsub('[%s,]+', ', ');print(m)}"
)
}
%py2_check_import() %{expand:\\\
%py2_check_import(e:tf:) %{expand:\\\
%{-e:echo 'WARNING: The -e option of %%%%py2_check_import is not currently supported on EPEL.' >&2}
%{-t:echo 'WARNING: The -t option of %%%%py2_check_import is not currently supported on EPEL.' >&2}
%{-f:echo 'WARNING: The -f option of %%%%py2_check_import is not currently supported on EPEL.' >&2}
(cd %{_topdir} &&\\\
PATH="%{buildroot}%{_bindir}:$PATH"\\\
PYTHONPATH="${PYTHONPATH:-%{buildroot}%{python2_sitearch}:%{buildroot}%{python2_sitelib}}"\\\
@ -102,37 +52,58 @@
%{__python2} -c "import %{lua:local m=rpm.expand('%{?*}'):gsub('[%s,]+', ', ');print(m)}"
)
}
%py3_check_import() %{expand:\\\
(cd %{_topdir} &&\\\
# With $PATH and $PYTHONPATH set to the %%buildroot,
# try to import the Python 3 module(s) given as command-line args or read from file (-f).
# Respect the custom values of %%py3_shebang_flags or set nothing if it's undefined.
# Filter and check import on only top-level modules using -t flag.
# Exclude unwanted modules by passing their globs to -e option.
# Useful as a smoke test in %%check when running tests is not feasible.
# Use spaces or commas as separators if providing list directly.
# Use newlines as separators if providing list in a file.
%py3_check_import(e:tf:) %{expand:\\\
PATH="%{buildroot}%{_bindir}:$PATH"\\\
PYTHONPATH="${PYTHONPATH:-%{buildroot}%{python3_sitearch}:%{buildroot}%{python3_sitelib}}"\\\
_PYTHONSITE="%{buildroot}%{python3_sitearch}:%{buildroot}%{python3_sitelib}"\\\
PYTHONDONTWRITEBYTECODE=1\\\
%{__python3} -c "import %{lua:local m=rpm.expand('%{?*}'):gsub('[%s,]+', ', ');print(m)}"
)
%{lua:
local command = "%{__python3} "
if rpm.expand("%{?py3_shebang_flags}") ~= "" then
command = command .. "-%{py3_shebang_flags}"
end
command = command .. " %{_rpmconfigdir}/redhat/import_all_modules.py "
-- handle multiline arguments correctly, see https://bugzilla.redhat.com/2018809
local args=rpm.expand('%{?**}'):gsub("[%s\\\\]*%s+", " ")
print(command .. args)
}
}
# When packagers go against the Packaging Guidelines and disable the runtime
# dependency generator, we want it to fall back to only creating the python(abi)
# Requires instead of none at all.
#
# This macro is EPEL 8 only, as the pythondist dependency generator
# is already disabled by the default in RHEL.
%python_disable_dependency_generator() \
%undefine __pythondist_requires \
%{nil}
# gpgverify verifies signed sources. There is documentation in the script.
%gpgverify(k:s:d:) %{lua:
local script = rpm.expand("%{_rpmconfigdir}/gpgverify ")
local keyring = rpm.expand("%{-k*}")
local signature = rpm.expand("%{-s*}")
local data = rpm.expand("%{-d*}")
print(script)
if keyring ~= "" then
print(rpm.expand("--keyring='%{SOURCE" .. keyring .. "}' "))
end
if signature ~= "" then
print(rpm.expand("--signature='%{SOURCE" .. signature .. "}' "))
end
if data ~= "" then
print(rpm.expand("--data='%{SOURCE" .. data .. "}' "))
end
}
# qt5 macro removed from RHEL8 but needed to ensure qtwebengine, and
# it's dependencies build on supported arches.
# Define where Python wheels will be stored and the prefix of -wheel packages
# - In Fedora we want wheel subpackages named e.g. `python-pip-wheel` that
# install packages into `/usr/share/python-wheels`. Both names are not
# versioned, because they're used by all Python 3 stacks.
# - In RHEL we want wheel packages named e.g. `python3-pip-wheel` and
# `python3.11-pip-wheel` that install packages into similarly versioned
# locations. We want each Python stack in RHEL to have their own wheels,
# because the main python3 wheels (which we can't upgrade) will likely be
# quite old by the time we're adding new alternate Python stacks.
# - In ELN we want to follow Fedora, because builds for ELN and Fedora rawhide
# need to be interoperable.
%python_wheel_pkg_prefix python%{?rhel:%{!?eln:%{python3_pkgversion}}}
%python_wheel_dir %{_datadir}/%{python_wheel_pkg_prefix}-wheels
# qt5 macro removed from RHEL8 but needed to ensure qtwebengine, and
# its dependencies build on supported arches.
%qt5_qtwebengine_arches %{ix86} x86_64 %{arm} aarch64 mips mipsel mips64el
# Arches that OpenJDK and dependent packages run on
%java_arches aarch64 ppc64le s390x x86_64

@ -0,0 +1,16 @@
%autorelease(e:s:pb:n) %{?-p:0.}%{lua:
release_number = tonumber(rpm.expand("%{?_rpmautospec_release_number}%{!?_rpmautospec_release_number:1}"));
base_release_number = tonumber(rpm.expand("%{?-b*}%{!?-b:1}"));
print(release_number + base_release_number - 1);
}%{?-e:.%{-e*}}%{?-s:.%{-s*}}%{!?-n:%{?dist}}
%autochangelog %{lua:
locale = os.setlocale(nil)
os.setlocale("C.utf8")
date = os.date("%a %b %d %Y")
os.setlocale(locale)
packager = rpm.expand("%{?packager}%{!?packager:John Doe <packager@example.com>}")
evr = rpm.expand("%{?epoch:%{epoch}:}%{version}-%{release}")
print("* " .. date .. " " .. packager .. " - " .. evr .. "\\n")
print("- local build")
}

@ -0,0 +1,3 @@
%bash_completions_dir %{_datadir}/bash-completion/completions
%zsh_completions_dir %{_datadir}/zsh/site-functions
%fish_completions_dir %{_datadir}/fish/vendor_completions.d

@ -0,0 +1,10 @@
# RPM macros for packages creating system accounts
#
# Turn a sysusers.d file into macros specified by
# https://docs.fedoraproject.org/en-US/packaging-guidelines/UsersAndGroups/#_dynamic_allocation
%sysusers_requires_compat Requires(pre): shadow-utils
%sysusers_create_compat() \
%(%{_rpmconfigdir}/sysusers.generate-pre.sh %{?*}) \
%{nil}

@ -1,3 +1,27 @@
# This file is used _only_ to override macros which exist in RHEL.
# It should be used very sparingly.
# Override %__python3 here based on %%python3_pkgversion to avoid relying on the finicky
# python3X-rpm-macros packages.
# Backported from https://src.fedoraproject.org/rpms/python-rpm-macros/c/a8b26546eb699afe0dbfcef913a2aa7085fc5afb?branch=rawhide
#
# EPEL specific, RHEL defines this in the python3X-rpm-macros packages
# and the default is /usr/libexec/platform-python.
# Usually, we don't want EPEL packages to use platform-python.
# Packages that want to do that can explicitly override this.
#
# When %%python3_pkgveresion is set to 3 (i.e. the default), we override
# %%__python3 to /usr/bin/python3.6 to ensure that programs are always run with
# python3.6, even if /usr/bin/python3 is a symlink to a different interpreter.
#
# See https://lists.fedoraproject.org/archives/list/epel-devel@lists.fedoraproject.org/thread/RE3PG72B5AX7NTACPDSBGOWCMN7I3OQJ/
%__python3 %{lua:
local bin = "/usr/bin/python"
if rpm.expand("%python3_pkgversion") == "3" then
bin = bin .. "3.6"
else
bin = bin .. rpm.expand("%{_python3_pkgversion_with_dot}")
end
print(bin)
}

@ -1,3 +1,2 @@
%__pythondist_provides %{_rpmconfigdir}/pythondistdeps.py --provides --majorver-provides
%__pythondist_requires %{_rpmconfigdir}/pythondistdeps.py --requires
%__pythondist_path ^/usr/lib(64)?/python[[:digit:]]\\.[[:digit:]]+/site-packages/[^/]+\\.(dist-info|egg-info|egg-link)$

@ -0,0 +1,2 @@
%__sysusers_provides %{_rpmconfigdir}/sysusers.prov
%__sysusers_path ^%{_sysusersdir}/.*\\.conf$

@ -0,0 +1,79 @@
#!/bin/bash
# This script turns sysuser.d files into scriptlets mandated by Fedora
# packaging guidelines. The general idea is to define users using the
# declarative syntax but to turn this into traditional scriptlets.
user() {
user="$1"
uid="$2"
desc="$3"
group="$4"
home="$5"
shell="$6"
[ "$desc" = '-' ] && desc=
{ [ "$home" = '-' ] || [ "$home" = '' ]; } && home=/
{ [ "$shell" = '-' ] || [ "$shell" = '' ]; } && shell=/sbin/nologin
if [ "$uid" = '-' ] || [ "$uid" = '' ]; then
cat <<EOF
getent passwd '$user' >/dev/null || \\
useradd -r -g '$group' -d '$home' -s '$shell' -c '$desc' '$user'
EOF
else
cat <<EOF
if ! getent passwd '$user' >/dev/null ; then
if ! getent passwd '$uid' >/dev/null ; then
useradd -r -u '$uid' -g '$group' -d '$home' -s /sbin/nologin -c '$desc' '$user'
else
useradd -r -g '$group' -d '$home' -s /sbin/nologin -c '$desc' '$user'
fi
fi
EOF
fi
}
group() {
group="$1"
gid="$2"
if [ "$gid" = '-' ]; then
cat <<-EOF
getent group '$group' >/dev/null || groupadd -r '$group'
EOF
else
cat <<-EOF
getent group '$group' >/dev/null || groupadd -f -g '$gid' -r '$group'
EOF
fi
}
parse() {
while read -r line || [ -n "$line" ] ; do
{ [ "${line:0:1}" = '#' ] || [ "${line:0:1}" = ';' ]; } && continue
line="${line## *}"
[ -z "$line" ] && continue
eval "arr=( $line )"
case "${arr[0]}" in
('u')
group "${arr[1]}" "${arr[2]}"
user "${arr[1]}" "${arr[2]}" "${arr[3]}" "${arr[1]}" "${arr[4]}" "${arr[5]}"
# TODO: user:group support
;;
('g')
group "${arr[1]}" "${arr[2]}"
;;
('m')
group "${arr[2]}" "-"
user "${arr[1]}" "-" "" "${arr[2]}"
;;
esac
done
}
for fn in "$@"; do
[ -e "$fn" ] || continue
echo "# generated from $(basename "$fn")"
parse <"$fn"
done

@ -0,0 +1,28 @@
#!/bin/bash
parse() {
while read line; do
[ "${line:0:1}" = '#' -o "${line:0:1}" = ';' ] && continue
line="${line## *}"
[ -z "$line" ] && continue
set -- $line
case "$1" in
('u')
echo "user($2)"
echo "group($2)"
# TODO: user:group support
;;
('g')
echo "group($2)"
;;
('m')
echo "user($2)"
echo "group($3)"
;;
esac
done
}
while read fn; do
parse < "$fn"
done
Loading…
Cancel
Save