【问题标题】:RPM spec file condition based on availability of a dependency基于依赖项可用性的 RPM 规范文件条件
【发布时间】:2021-07-27 13:30:22
【问题描述】:

我想为捆绑某个库的应用程序创建一个cross-distribution RPM spec file。应用程序默认使用这个捆绑的库,但也提供了一个构建时选项来使用系统中安装的库版本。如果 RPM 可用,我希望 RPM 将应用程序链接到系统库(因为这会使程序包更小,并且因为系统库比与应用程序捆绑的版本更频繁地获取安全补丁),如果没有,则回退到(默认)捆绑版本。有没有办法在规范文件中编写条件来实现这一点?

例如,我想做类似的事情

%if available(libfoo-devel >= 1.0)
BuildRequires: libfoo-devel >= 1.0
%endif
 
%prep
cat << EOF > build_config_file
%if available(libfoo-devel >= 1.0)
ac_add_options --with-system-foo
%endif
EOF

现在我正在使用条件来检查由特定版本的操作系统定义的宏,我已经知道打包了正确的库,但这相当脆弱和复杂。 (也就是说,我需要手动检查每个目标发行版,看它是否打包了正确版本的库,然后在该发行版的规范文件中写一个条件;此外,我需要定期重复这个过程,以防万一该库的版本可用于以前未打包的发行版。)如果我可以直接测试依赖项的可用性会更简单。

【问题讨论】:

    标签: rpmbuild rpm-spec


    【解决方案1】:

    您必须在创建 rpm 之前决定如何创建它。编译发生在创建目标 rpm 之前,而不是在安装时。

    在我看来,您可能会考虑创建两个 rpm:

    • 用 libfoo-devel 编译的一个
    • 一个没有

    然后我会建议按照以下方式编写规范文件:

    Name: package
    ...
    
    %package libfoo
    Summary:  %{name} build with libfoo
    BuildRequires: libfoo-devel >= 1.0
    Requires: libfoo >= 1.0
    
    %build
    build --without-libfoo --target "${RPM_BUILD_ROOT}/usr/bin/without-libfoo"
    build --with-libfoo --target "${RPM_BUILD_ROOT}/usr/bin/with-libfoo"
    
    %install
    /usr/bin/without-libfoo
    
    %install libfoo
    /usr/bin/with-libfoo
    

    注意事项:

    • 是的,这意味着编译两次:一次使用 libfoo,一次不使用 libfoo
    • 构建此规范文件将创建两个包:“package.rpm”和“package-libfoo.rpm”

    【讨论】:

    • 我不清楚这个答案如何解决这个问题。使用此设置,在不提供 libfoo-devel 的系统上尝试构建 RPM 不会失败吗?
    • 确实如此,但我认为您对“构建机器”和“要安装 rpm 的机器”之间的区别感到困惑。您的规范文件不应适应构建机器,但您可以创建不同的 rpm 以针对要安装软件包的不同类型的机器。
    • 我正在尝试编写一个cross-distribution spec fileOBS 实例可以使用它有条件地为各种 GNU/Linux 发行版(或同一发行版的不同版本)生成 RPM。这样的规范文件完全可以考虑不同的构建环境。这样做的重点是避免在每个发行版中维护单独但几乎相同的规范文件(以及相关的构建服务项目)。
    • 好吧,但我认为你应该改变你的要求:不是“如果 libfoo-devel 在系统上”,而是“如果我在 centos>=7 那么 BuildRequires libfoo-devel”。您应该事先定义是否要使用 libfoo-devel 构建,而不是基于它是否存在于系统上,这会导致随机构建结果。
    • 这就是我现在正在做的事情,但缺点是我需要手动检查我想要构建的每个发行版是否存在 libfoo-devel > 1.0,然后对该发行版进行硬编码信息到规范文件中的条件。我需要定期重复这个过程,以防 libfoo-devel > 1.0 可用于以前没有它的发行版。
    猜你喜欢
    • 2018-12-04
    • 1970-01-01
    • 1970-01-01
    • 2019-07-01
    • 1970-01-01
    • 2020-06-21
    • 1970-01-01
    • 1970-01-01
    • 2021-02-02
    相关资源
    最近更新 更多