11

バックグラウンド。

$ rpmbuild --version
RPM バージョン 4.3.3

複数のスクリプトレットでファイルのリストを処理する必要がある仕様ファイルに取り組んでいます。DRY (繰り返さないでください) では、さまざまなヘルパー スクリプトに展開されるマクロとしてリストを 1 回定義する必要があります。すべてのファイルを同じ行に配置しないようにする方法を見たことがないので、リストを維持するのは大変です。

%定義リスト\
\
b

エラーを与える

%define LIST a\
b\

エラーも出ます

%define LIST a
%define LIST %LIST b

再帰エラーで失敗

4

6 に答える 6

5

~/.rpmmacros ファイルでできるように、spec ファイルで複数行のマクロを実際に作成することはできません。ちょっとばかげています。

私のサイト用に作成されたすべてのパッケージで使用される複数行のマクロとして機能するスペック ファイルを含むサブディレクトリ SPECS/inc/ を作成します。としてマクロを使用する代わりに、%foo単に行うことができます%include inc/foo.spec。インクルード構文を避けるためのショートカットを作成することもできます%global foo %include inc/foo.spec。その後、複数行のマクロのように機能します。

これが完全な例です。

inc/env.spec

%global foo %include inc/foo.spec
%global bar %include inc/bar.spec
#Lots of other common things to all packages

inc/foo.spec

a
b
c
d

そして、私のパッケージ仕様ファイル mylib.spec で:

%include inc/env.spec

Name: mylib
Version: X.Y
#etc...

%foo
于 2014-05-08T15:43:02.760 に答える
2

マクロ定義では、行末のバックスラッシュが削除され、マクロ定義が続くことを RPM に伝えるために使用されます。改行文字は削除されません(make ファイルとは異なります)。したがって、複数行のスクリプトを作成する場合、セミコロンは必要ありません。これは、1 つのコマンドを分割する場合は、3 つのバックスラッシュを使用する必要があることも意味します。シェルが認識するバックスラッシュを生成するための 2 つと、マクロの解析を続けるように rpmbuild に指示するための 1 つです。シェルは、表示されたバックスラッシュと改行を削除し、2 行で 1 つのコマンドを生成します。 わあ!!

于 2012-05-14T21:56:07.277 に答える
1

最初の行に値の少なくとも一部が必要です。つまり、次のようになります。

%define LIST a\
b\
c

このマクロ定義は機能します。これらをコマンドとして使用する場合、つまり次のようなもの

%define DOSOMETHING rm file1\
rm file2\
rm file3
...
%build
%DOSOMETHING

これは機能しません。実行可能セクションの行は、最初に別々のコマンドに分割され、次にマクロが展開されます。つまり、マクロの定義は機能しますが、3つの別々のコマンドとして実行することはできません。

3つの別々のコマンドを実行したい場合は、次のように実行する方が簡単です。

%define DOSOMETHING rm file1; rm file2; rm file3
于 2010-12-04T03:04:55.800 に答える
0

もし私があなたなら、リストをソースファイルに保存します。

の内容%{_sourcedir}/LIST:

a
b
c
d

仕様ファイル:

%define process_files() \
    for i in %(cat %{_sourcedir}/LIST)
    do \
        echo "process list of files here" \
    done
于 2013-10-15T19:02:03.143 に答える