gpt4 book ai didi

rpm - 如何编写可扩展为一组附加宏的 RPM 宏?

转载 作者:行者123 更新时间:2023-12-02 01:57:25 27 4
gpt4 key购买 nike

我正在打包一个内部产品,该产品依赖于数十个二级库。理想情况下,这些库本身将作为独立的包进行创建和管理,但我们的遗留构建系统使这变得困难。

相反,我们有一个部署机制(脚本),它选择所需的依赖项并根据需要递归地将它们安装到文件系统中。所以...我们正在通过使用此部署脚本来构建 RPM(这是我们的第一个错误,但不容易解决)。 RPM 规范文件告诉脚本直接安装到 $RPM_BUILD_ROOT 中,然后我们根据需要调整和打包文件。

这让我想到了我的问题:

我有几十个依赖项,每个依赖项都会半频繁地更改。跟踪库版本号经常需要在 .spec 文件的六处地方进行调整。我想做的是编写一个宏,可以将其称为:

%dependency -B libstrutil -M 1 -m 5 -p 0

这将扩展为:

%define libstrutil     libstrutil.so
%define libstrutil_m libstrutil.so.1
%define libstrutil_mm libstrutil.so.1.5
%define libstrutil_mmp libstrutil.so.1.5.0

其中“-B”选项是库基本名称,“-M”选项是主版本号,“-m”是次版本号,“-p”是补丁级别。然后,这些宏可以在整个规范文件中使用,其中可能需要特定版本(特别是在 %files 部分)。

我梳理了 RHEL 6 附带的宏(特别是/usr/lib/rpm/macros),但发现带参数的宏示例非常少。我找到的一个是 %GNUconfigure,考虑到它在定义中使用了大量条件逻辑,它并不完全简单。与当前问题更相关的是,%GNUconfigure 本身并不定义其他宏。

我怀疑我正在尝试做的事情是通过 %{expand:...} 完成的,但我什至还没有接近让这个语法起作用。

最佳答案

我不确定您是否需要自己扩展线路。如果您返回 %define 行,rpm 可能会为您处理该问题。

如果这是真的,那么这可能会起作用:

%dependency(B:M:m:p:) \
%%define %{-B*} %{-B*}.so \
%%define %{-B*}_m %{-B*}.so.%{-M*} \
%%define %{-B*}_mm %{-B*}.so.%{-M*}.%{-m*} \
%%define %{-B*}_mmp %{-B*}.so.%{-M*}.%{-m*}.%{-p*}

如果没有,那么您可能需要:

%dependency(B:M:m:p:) \
%{expand:%%define %{-B*} %{-B*}.so} \
%{expand:%%define %{-B*}_m %{-B*}.so.%{-M*}} \
%{expand:%%define %{-B*}_mm %{-B*}.so.%{-M*}.%{-m*}} \
%{expand:%%define %{-B*}_mmp %{-B*}.so.%{-M*}.%{-m*}.%{-p*}}

其中任何一个可能需要使用 %global 而不是 %define。 (不幸的是,我并不完全清楚它们何时不同。)

关于rpm - 如何编写可扩展为一组附加宏的 RPM 宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28885440/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com