20

具体的な例としては、Source0:またはSourceマクロを含む他の行を含む多くのスペックファイルがあります。スペックファイルで実際にビルドを開始したり、独自のパーサーを作成したりせずに、これらのマクロを展開するにはどうすればよいですか?

4

5 に答える 5

36

rpm 4.9以降、次のものを使用できます。

rpmspec -P <spec_file>

これにより、拡張されたスペックファイルがstdoutに出力されます

于 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のスクリプトを見ると、それは単なる手の込んだハックであることがわかります。これは、基本的に以下のスクリプトが実行することを実行する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でソース行を取得し、sedでマクロを含む文字列を抽出してから、rpm--eval'string'で評価することができます。これはグローバルマクロのみを展開し、この仕様で定義されているものは展開しないことに注意してください。

それらも拡張するには、おそらくそれらをgrepして、カスタムマクロファイルとしてrpmにフィードする必要があります。

于 2010-09-12T02:11:54.443 に答える