是否有任何语法或技巧可以创建多行 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 规范文件宏的主要内容,如果未能解决你的问题,请参考以下文章