实际上,您可以在不需要 Lua 的情况下做到这一点,并且您可以在 BASH 中使用您在原始问题中提到想要使用的 if [[ ... ]] 构造。
为了说明如何,让我们看一下我使用的tmux RPM 的规范文件的标题部分。它必须在运行 RHEL/CentOS 版本 6、7 和 8(和/或任何其他重建,如 Oracle 的)的任何主机上未经修改地构建。这就是我所拥有的:
%global name tmux
%global version 3.1b
%global release 1%{?dist}
%global _hardened_build 1
Summary: A terminal multiplexer
Name: %{name}
Version: %{version}
Release: %{release}
# Mostly ISC-licensed, but some files in compat/ are 2-/3-clause BSD.
License: ISC/BSD
URL: https://tmux.github.io/
Source0: https://github.com/tmux/%{name}/releases/download/%{version}/%{name}-%{version}.tar.gz
Source1: bash_completion_tmux.sh
BuildRequires: %(/bin/bash -fc 'if [[ %{name} == tmux* ]]; then echo make ; else echo nomake ; fi') %(/bin/bash -fc 'if [[ %{name} == wobble* ]]; then echo wobble ; fi')
BuildRequires: gcc, ncurses-devel, %{expand:%(/bin/bash -c 'if [[ %{?rhel}%{!?rhel:9} -le 6 ]]; then echo libevent2-devel ; else echo libevent-devel ; fi')}
Requires: %{expand:%(/bin/bash -c 'if [[ %{?rhel}%{!?rhel:9} -le 6 ]]; then echo libevent2 ; else echo libevent ; fi')} >= 2.0
这个 RPM 的棘手之处在于 RHEL6 提供了 libevent 包,但它是 1.4.13 版,对于 tmux 来说太旧了,无法成功构建。 (它需要 libevent 2.x。)不过,好消息是 RHEL6 实际上有 both 版本! libevent2 RPM 的版本为 2.0.21,该版本足够新,可用于 tmux。但我不能只列出libevent2-devel 作为我的构建依赖项;该软件包不适用于 RHEL 7 或 8,因为它们的默认 libevent RPM 已经是版本 2。我也不能将libevent-devel 列为构建依赖项,因为虽然libevent 和libevent2 软件包可以并排安装,但libevent-devel 和libevent2-devel RPM 存在冲突。
正如您在上面的规范文件中看到的,我对这个挑战的解决方案是使用 RPM 宏将字符串 libevent-devel 或 libevent2-devel 注入到 BuildRequires: 标头值中,基于 BASH 的比较%{rhel} 宏的值(在 RHEL 6、7 或 8 上,/etc/rpm/macros.dist 分别为其分配了 6、7 或 8 的值)。对于 RHEL6(和以前的,理论上...RHEL5 已死,而 RHEL4 及更早版本是超级死的!),使用后一个值,而前一个值用于 RHEL7 和 RHEL8。
我还添加了几个人为的字符串匹配宏调用,只是为了说明它可以正常工作。我的实际规范文件既不包含第一行 BuildRequires: 也不包含最后一行 Requires: (因为它是不必要的/冗余的);我专门为此练习添加了它们,以证明条件适用于构建时和运行时依赖项。
我怎么知道它们有效?我检查了:
$ rpm -qp --qf '[%|SOURCERPM?{%25{=NEVRA}}:{%21{=NEVR}.src}|.rpm: %{REQUIREFLAGS:deptype}: %{REQUIRENEVRS}\n]' tmux-3.1b-1.el6.x86_64.rpm tmux-3.1b-1.el6.src.rpm tmux-3.1b-1.el8.x86_64.rpm tmux-3.1b-1.el8.src.rpm | fgrep 'manual:'
tmux-3.1b-1.el6.x86_64.rpm: manual: libevent2 >= 2.0
tmux-3.1b-1.el6.src.rpm: manual: make
tmux-3.1b-1.el6.src.rpm: manual: gcc
tmux-3.1b-1.el6.src.rpm: manual: ncurses-devel
tmux-3.1b-1.el6.src.rpm: manual: libevent2-devel
tmux-3.1b-1.el8.x86_64.rpm: manual: libevent >= 2.0
tmux-3.1b-1.el8.src.rpm: manual: gcc
tmux-3.1b-1.el8.src.rpm: manual: libevent-devel
tmux-3.1b-1.el8.src.rpm: manual: make
tmux-3.1b-1.el8.src.rpm: manual: ncurses-devel
请注意,正确的 libevent2 >= 2.0 依赖项(带有 2 在末尾)显示在 RHEL6 RPM 中;另一方面,RHEL8 RPM 显示libevent >= 2.0(没有最后的2),再次完全按照它应该的方式显示。此外,在两个 SRPM 中都显示了对 make 的构建依赖,并且 nomake 和 wobble 都不存在,这证明了 tmux* 和 wobble* 上的模式匹配条件完全可以正常工作。