11

背景。

$ rpmbuild --version
RPM 版本 4.3.3

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

%定义列表\
一个 \
b

给出错误

%定义列表a\
乙\

也给出了错误

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

由于递归错误而失败

4

6 回答 6

5

您不能像在 ~/.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
于 2014-05-08T15:43:02.760 回答
2

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

Source1:        flist

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

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

a \
b \
c 

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

于 2012-04-28T19:16:42.423 回答
2

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

于 2012-05-14T21:56:07.277 回答
1

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

%define LIST a\
b\
c

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

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

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

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

%define DOSOMETHING rm file1; rm file2; rm file3
于 2010-12-04T03:04:55.800 回答
0

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

内容%{_sourcedir}/LIST

a
b
c
d

在规范文件中:

%define process_files() \
    for i in %(cat %{_sourcedir}/LIST)
    do \
        echo "process list of files here" \
    done
于 2013-10-15T19:02:03.143 回答
0

这个例子应该工作:

cat file.spec

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

%build
${MAKE}


cat Makefile

status?=fail
default: 
    echo "status=${status}"
于 2017-11-22T21:29:53.623 回答