具体的な例としては、Source0
:またはSource
マクロを含む他の行を含む多くのスペックファイルがあります。スペックファイルで実際にビルドを開始したり、独自のパーサーを作成したりせずに、これらのマクロを展開するにはどうすればよいですか?
5 に答える
rpm 4.9以降、次のものを使用できます。
rpmspec -P <spec_file>
これにより、拡張されたスペックファイルがstdoutに出力されます
解析が必要なソース行だけがあれば、それ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
/usr/bin/spectool
@mmckinstが話しているrpmdevtoolsのスクリプトを見ると、それは単なる手の込んだハックであることがわかります。これは、基本的に以下のスクリプトが実行することを実行する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"
スクリプトでマクロを展開する
マクロ展開後のRPM内のスクリプトがどのようになるかに興味がある場合は、RPMをビルドしてから、RPMを取得してスクリプトを抽出できます。
rpmbuild -bi my-package.spec
rpm -qp --scripts my-package.rpm
これは、RPMがビルド時にマクロを拡張するために機能します。
grepでソース行を取得し、sedでマクロを含む文字列を抽出してから、rpm--eval'string'で評価することができます。これはグローバルマクロのみを展開し、この仕様で定義されているものは展開しないことに注意してください。
それらも拡張するには、おそらくそれらをgrepして、カスタムマクロファイルとしてrpmにフィードする必要があります。