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