11

RPM仕様に一種の「include」ディレクティブはありますか?グーグルで答えが見つかりませんでした。

動機:ビルドプロセスがバージョン、リビジョン、およびその他のビルド固有のデータで変更するRPM仕様テンプレートがあります。これはsed現在によって行われています。#include仕様がビルドプロセスによって生成されるビルド固有の定義ファイルであると、よりクリーンになると思います。そのため、仕様を検索して置き換える必要はありません。

ない場合include、この(非常に一般的な、私は信じる)タスクを実行する慣用的な方法はありますか?

4

7 に答える 7

20

十分に最近のバージョンのrpmbuildは、確かに%includeをサポートしています。

%include common.inc

残念ながら、彼らはそれについてあまり賢くはありません-たとえば、要求されたファイルを検索する既知のディレクトリのセットはありません。しかし、それはそこにあり、変数は次のように展開されます。

%include %{_topdir}/Common/common.inc
于 2012-01-18T23:43:14.910 に答える
7

RPMはインクルードをサポートしていません。

m4マクロプロセッサで、または仕様の一部を連結するだけで(「インクルード」が最初にあった場合)、同様の問題を解決しました。

ビルド時にいくつかの変数を渡すだけで、別のファイルの複数の行を含めない場合は、次のコマンドを実行できます。

rpmbuild --define 'myvar SOMEVALUE' -bb myspec.spec

仕様では%myvarを使用できます。

于 2011-06-03T01:18:29.777 に答える
5

私は最近、これと同じ問題に直面しました。類似した複数のサブパッケージを定義したかったのですが、それぞれがわずかに異なりました(言語固有のRPMでした)。サブパッケージごとに同じボイラープレートを繰り返したくありませんでした。

これが私がしたことの一般的なバージョンです:

%define foo_spec() %{expand:%(cat '%{myloc}/main-foo.spec')}
%{foo_spec bar}
%{foo_spec baz}
%{foo_spec qux}

を使用すると、マクロが定義されているときに、が1回だけ実行される%{expand}ことが保証されます。%(cat)その場合、main-foo.specファイルの内容は3回になり%1、main-foo.specファイルの各回はbar、のそれぞれに展開さbazqux、次に、それをテンプレートとして扱うことができます。必要に応じて、これを複数のパラメーターに簡単に拡張できます(私はしませんでした)。

于 2013-05-14T19:59:10.797 に答える
4

根本的な問題については、私が知っているすべてのrpmバージョンに存在する2つの追加の解決策があるかもしれません。

  1. サブパッケージ
  2. macroおよびrpmrcファイル。

サブパッケージ

別の代替手段(そしておそらく「RPMの方法」)は、サブパッケージを使用することです。Maximum RPMには、サブパッケージの情報と例もあります。

問題は、次のような構造を作ろうとしていると思います。

  • 2つのスペックファイル。rpm_debug.specrpm_production.specと言います
  • 両方使用%include common.spec

デバッグ本番環境は、クライアントサーバーなどでもかまいません。変数を再定義する例では、各サブパッケージに独自の変数リストを含めることができます。

制限事項

サブパッケージの主な利点は、ビルドが1つだけ行われることです。これも不利になる可能性があります。デバッグ本番の例でこれが強調される場合があります。これは、stripバリアントを作成するために使用する、異なる出力で2回コンパイルすることで回避できます。おそらくVPATHGnuMakeで使用します)。headers大きなパッケージをコンパイルしてから、静的ライブラリなどの開発者情報の有無などの単純なバリエーションのみを用意する必要があるため、このアプローチを高く評価できます。

マクロとRpmrc

サブパッケージは、 rootfs階層全体、またはRPMのより大きなコレクションに必要な構造定義の問題を解決しません。私たちはこれのために持っています。とを実行するときとを変更することにより、大量の変数マクロを定義できます。ページから、rpmbuild --showrcrpmrcmacrosrpmrpmbuildman

   rpmrc Configuration
       /usr/lib/rpm/rpmrc
       /usr/lib/rpm/redhat/rpmrc
       /etc/rpmrc
       ~/.rpmrc

   Macro Configuration
       /usr/lib/rpm/macros
       /usr/lib/rpm/redhat/macros
       /etc/rpm/macros
       ~/.rpmmacros

これらの2つの機能は、可能なすべての問題を解決できると思います%include。ただし、%includeこれはおなじみの概念であり、rpmをよりフル機能で開発者にとって使いやすいものにするために追加された可能性があります。

于 2013-04-17T16:42:57.953 に答える
3

*.incSOURCESディレクトリ(%_sourcedir)からファイルを含めることができます。

Source1: common.inc

%include %{SOURCE1}

このようにして、それらは自動的にSRPMSに入ります。

于 2012-06-07T13:58:16.970 に答える
3

どのバージョンについて話しているのですか?現在、スペックファイルに%include filename.txtがあり、C#includeディレクティブと同じように機能するようです。

> rpmbuild --version
RPM version 4.8.1
于 2011-08-18T20:15:06.857 に答える
1

スクリプト(お気に入りの名前)を使用してテンプレートを取得し、そこからスペックファイルを作成しました。また、%filesタグは、Pythonなどの別のプロセスによって作成されたファイルをインポートできますbdist-rpm

于 2013-04-17T23:20:24.050 に答える