具体的例子是我有很多带有Source0
: 或其他Source
包含宏的行的规范文件。如何在不实际开始构建规范文件或编写自己的解析器的情况下扩展这些宏?
问问题
12419 次
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 回答