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

时间:2010-12-02 20:16:29

标签: macros packaging rpm rpmbuild rpm-spec

背景

$ 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

由于递归错误而失败

6 个答案:

答案 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}"