是否有任何语法或技巧可以创建多行 rpm 规范文件宏

Posted

技术标签:

【中文标题】是否有任何语法或技巧可以创建多行 rpm 规范文件宏【英文标题】:Is there any syntax or trick to be able to create a multiline rpm spec file macro 【发布时间】:2011-05-19 08:57:15 【问题描述】:

背景。

$ rpmbuild --version RPM 版本 4.3.3

我正在处理一个规范文件,该文件需要处理多个小脚本中的文件列表。 DRY(不要重复自己)让我将列表定义为一个宏,该宏扩展为各种帮助脚本。维护列表很痛苦,因为我还没有找到避免将所有文件放在同一行的方法。

%定义列表\ 一种 \ b

报错

%定义列表a\ 乙\

也会报错

%定义列表a %定义列表 %列表 b

由于递归错误而失败

【问题讨论】:

【参考方案1】:

你必须在第一行至少有一部分值,即:

%define LIST a\
b\
c

此宏定义将起作用。如果您打算将这些用作命令,例如

%define DOSOMETHING rm file1\
rm file2\
rm file3
...
%build
%DOSOMETHING

这行不通。可执行部分中的行首先拆分为单独的命令,然后扩展宏。 IE。定义宏会起作用,但将其作为三个单独的命令执行则不会。

如果你想执行 3 个单独的命令,这样做更容易

%define DOSOMETHING rm file1; rm file2; rm file3

【讨论】:

上述解决方案对我不起作用,可能适用于其他版本的 rpmbuild。我收到一个错误:错误:第 31 行:未知标签:b\ 编辑问题以反映这一点。【参考方案2】:

既然您详细解释了您的目标,让我们尝试不同的方法。在你的规范文件中试试这个:

Source1:        flist

%expand:%global LIST %(cat %SOURCE1)

这在 Source1 文件中(在本例中为 flist):

a \
b \
c 

我已经使用 rpm 4.4.6 对此进行了测试,因为这是我目前可用的最旧版本。

【讨论】:

这在 CentOS4 上不起作用,CentOS4 已经停产,并且有一个古老的 RPM 版本。不幸的是,这正是 OP 和您真正想要解决的问题。虽然到目前为止,这是最接近解决方案的方法。【参考方案3】:

在宏定义中,行尾反斜杠被删除并用于告诉 RPM 宏定义继续。换行符被 NOT 剥离(与 make 文件不同)。因此,如果您正在构建多行脚本,则不需要分号。这也意味着如果要拆分单个命令,则必须使用 3 反斜杠。两个产生一个 shell 将看到的反斜杠,一个告诉 rpmbuild 继续解析宏。 shell 将删除它看到的反斜杠,加上换行符,这将在两行中产生一个命令。 !!

【讨论】:

%define MAKE make \\\ name=TODO \\\ help \\\【参考方案4】:

如果我是你,我会将列表保存在源文件中。

%_sourcedir/LIST的内容:

a
b
c
d

在规范文件中:

%define process_files() \
    for i in %(cat %_sourcedir/LIST)
    do \
        echo "process list of files here" \
    done

【讨论】:

【参考方案5】:

您不能像在 ~/.rpmmacros 文件中那样在规范文件中创建多行宏。有点傻。

我创建了一个子目录 SPECS/inc/,其中的 spec 文件充当多行宏,供为我的站点创建的所有包使用。您可以使用%include inc/foo.spec,而不是使用宏作为%foo。您还可以创建快捷方式来避免包含语法%global foo %include inc/foo.spec。然后它就像一个多行宏一样工作。

这是一个完整的例子。

inc/env.spec

%global foo %include inc/foo.spec
%global bar %include inc/bar.spec
#Lots of other common things to all packages

inc/foo.spec

a
b
c
d

然后在我的包规范文件中,mylib.spec:

%include inc/env.spec

Name: mylib
Version: X.Y
#etc...

%foo

【讨论】:

这真是个聪明的解决方案!谢谢!!【参考方案6】:

这个例子应该可以工作:

cat file.spec

%define MAKE make \\\
 status=success \\\
 #EOL

%build
$MAKE


cat Makefile

status?=fail
default: 
    echo "status=$status"

【讨论】:

以上是关于是否有任何语法或技巧可以创建多行 rpm 规范文件宏的主要内容,如果未能解决你的问题,请参考以下文章

RPM 规范文件 - 是不是可以动态填充规范文件变量

MySQL的语法规范

Python语法特点如注释规则代码缩进编码规范等

MySQL语法规范

BAT文件语法和技巧(bat文件的编写及使用)

python篇第3天编码规范