背景。
$ rpmbuild --version RPM 版本 4.3.3
我正在处理一个规范文件,该文件需要处理多个小脚本中的文件列表。DRY(不要重复自己)让我将列表定义为一个宏,该宏扩展为各种帮助脚本。维护列表很痛苦,因为我还没有看到避免将所有文件放在同一行的方法。
%定义列表\ 一个 \ b
给出错误
%定义列表a\ 乙\
也给出了错误
%定义列表a %定义列表 %列表 b
由于递归错误而失败
您不能像在 ~/.rpmmacros 文件中那样在规范文件中创建多行宏。有点傻。
我创建了一个子目录 SPECS/inc/ ,其中包含作为多行宏的 spec 文件,为我的站点创建的所有包都使用这些宏。而不是使用宏作为%foo
,你可以做%include inc/foo.spec
。您还可以创建快捷方式来避免包含语法%global foo %include inc/foo.spec
。然后它就像一个多行宏一样工作。
这是一个完整的例子。
公司/env.spec
%global foo %include inc/foo.spec
%global bar %include inc/bar.spec
#Lots of other common things to all packages
公司/foo.spec
a
b
c
d
然后在我的包规范文件 mylib.spec 中:
%include inc/env.spec
Name: mylib
Version: X.Y
#etc...
%foo
既然你解释了你的目标多一点,让我们尝试不同的方法。在你的规范文件中试试这个:
Source1: flist
%{expand:%global LIST %(cat %{SOURCE1})}
这在 Source1 文件中(在本例中为 flist):
a \
b \
c
我已经用 rpm 4.4.6 对此进行了测试,因为这是我目前可用的最旧版本。
在宏定义中,行尾反斜杠被删除并用于告诉 RPM 宏定义继续。换行符不会被剥离(与 make 文件不同)。因此,如果您正在构建多行脚本,则不需要分号。这也意味着如果要拆分单个命令,则必须使用3 个反斜杠。两个产生一个 shell 将看到的反斜杠,一个告诉 rpmbuild 继续解析宏。shell 将删除它看到的反斜杠,加上换行符,这将在两行中产生一个命令。 呼!!
你必须在第一行至少有一部分值,即:
%define LIST a\
b\
c
此宏定义将起作用。如果您打算将这些用作命令,例如
%define DOSOMETHING rm file1\
rm file2\
rm file3
...
%build
%DOSOMETHING
这行不通。可执行部分中的行首先拆分为单独的命令,然后扩展宏。即定义宏将起作用,将其作为三个单独的命令执行则不起作用。
如果你想执行 3 个单独的命令,这样做更容易
%define DOSOMETHING rm file1; rm file2; rm file3
如果我是你,我会将列表保存在源文件中。
内容%{_sourcedir}/LIST
:
a
b
c
d
在规范文件中:
%define process_files() \
for i in %(cat %{_sourcedir}/LIST)
do \
echo "process list of files here" \
done
这个例子应该工作:
cat file.spec
%define MAKE make \\\
status=success \\\
#EOL
%build
${MAKE}
cat Makefile
status?=fail
default:
echo "status=${status}"