20

具体的例子是我有很多带有Source0: 或其他Source包含宏的行的规范文件。如何在不实际开始构建规范文件或编写自己的解析器的情况下扩展这些宏?

4

5 回答 5

36

从 rpm 4.9 开始,您可以使用:

rpmspec -P <spec_file>

这将在标准输出上打印出扩展的规范文件

于 2011-10-26T10:19:36.917 回答
12

如果它只是您需要解析的源代码行,spectool将为您执行此操作。它是 Fedora 的rpmdevtools的一部分。

$ spectool ./mg.spec 
Source0: http://homepage.boetes.org/software/mg/mg-20110120.tar.gz
$ 

这是它的帮助屏幕

Usage: spectool [<options>] <specfile>
Options:
operating mode:
-l, --lf, --list-files        lists the expanded sources/patches (default)
-g, --gf, --get-files         gets the sources/patches that are listed with
                              a URL
-h, --help                    display this help screen

files on which to operate:
-A, --all                     all files, sources and patches (default)
-S, --sources                 all sources
-P, --patches                 all patches
-s, --source x[,y[,...]]      specified sources
-p, --patch a[,b[,...]]       specified patches

misc:
-d, --define 'macro value'    defines RPM macro 'macro' to be 'value'
-C, --directory dir           download into specified directory (default '.')
-R, --sourcedir               download into rpm's %{_sourcedir}
-n, --dryrun, --dry-run       don't download anything, just show what would be
                              done
-D, --debug                   output debug info, don't clean up when done
于 2011-04-18T01:14:48.917 回答
2

如果您查看/usr/bin/spectool@mmckinst 谈论的 rpmdevtools 中的脚本,您会发现它只是一个精心设计的 hack。它创建了一个 tmp 规范文件,该文件基本上执行以下脚本的操作。这就是我们用来扩展规范文件的内容,然后使用 grep 查找我们需要的文件部分。在我们的案例中,我们想要的不仅仅是源代码和补丁。

这是一个模拟此行为的示例 bash 脚本。它将通过该%prep部分向上扩展所有宏。

#!/bin/bash
spec_file="$1" # pass in the path to the spec file as the first argument
tmp_spec="/tmp/eval-$$.spec"
cat "$spec_file" | sed '/^%prep/,$d' > "$tmp_spec"
echo '%prep' >> "$tmp_spec"
echo 'cat<<__EOF__' >> $tmp_spec
cat "$spec_file" | sed '/^%prep/,$d' >> "$tmp_spec"
echo '__EOF__' >> "$tmp_spec"
rpmbuild -bp "$tmp_spec" 2>/dev/null
rm -f "$tmp_spec"  
于 2012-06-23T02:35:14.440 回答
1

在脚本中展开宏

如果您对宏扩展后 RPM 中的脚本的外观感兴趣,您可以构建 RPM,然后获取 RPM 来提取脚本:

rpmbuild -bi my-package.spec
rpm -qp --scripts my-package.rpm

这是因为 RPM 在构建时扩展了宏。

于 2011-09-19T13:41:24.463 回答
-4

您可以 grep 获取 Source 行, sed 提取包含宏的字符串,然后 rpm --eval 'string' 对其进行评估。请注意,这只会扩展全局宏,而不是本规范中定义的宏。

要扩展它们,您可能需要对它们进行 grep 并将它们作为您的自定义宏文件提供给 rpm。

于 2010-09-12T02:11:54.443 回答