我可以使用rpm扩展specfile中的宏吗?

时间:2010-09-03 09:56:48

标签: rpm rpm-spec

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

5 个答案:

答案 0 :(得分:30)

从rpm 4.9起,您可以使用:

rpmspec -P <spec_file>

这将在stdout上打印出扩展的spec文件

答案 1 :(得分: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

答案 2 :(得分:2)

如果你看一下@mmckinst谈到的rpmdevtools中的/usr/bin/spectool脚本,你会发现它只是一个精心设计的黑客。它创建一个tmp规范文件,基本上执行下面的脚本。这就是我们用来扩展spec文件然后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"  

答案 3 :(得分:0)

在脚本中展开宏

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

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

这很有效,因为RPM会在构建时扩展宏。

答案 4 :(得分:-3)

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

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