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