我正在打包一个内部产品,它依赖于几十个二级库。理想情况下,这些库本身将作为独立包创建和管理,但我们的遗留构建系统使这很困难。
相反,我们有一个部署机制(脚本),它选择所需的依赖项并根据需要以递归方式将它们安装到文件系统中。所以...我们通过使用这个部署脚本来构建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'是补丁级别。然后,这些宏可以在整个spec文件中使用,在那里可能需要特定的版本(特别是在%files部分)。
我已经梳理了RHEL 6附带的宏(尤其是/ usr / lib / rpm / macros),但很少发现带参数的宏示例。我找到的ONE是%GNUconfigure,并且由于它在定义中使用了很多条件逻辑,因此它并不完全简单。与直接问题更相关的是,%GNUconfigure本身并不定义其他宏。
我怀疑我尝试做的事情是用%{expand:...}来完成的,但我甚至没有接近让这种语法起作用。
答案 0 :(得分:1)
我不确定你是否需要自己扩展线条。如果您返回%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
。 (不幸的是,我不清楚这些不一样的时间。)