3.5. Software Collection Library のサポート
Software Collection 環境でのみ使用するライブラリー、またはシステムで利用可能なライブラリーに加えて、以下のように、
enable
スクリプトレットの LD_LIBRARY_PATH
環境変数を更新します。
export LD_LIBRARY_PATH="%{_libdir}\${LD_LIBRARY_PATH:+:\${LD_LIBRARY_PATH}}"
この設定は、Software Collection が有効な場合に、システムで利用可能なライブラリーのバージョンよりも、Software Collection のライブラリーのバージョンが推奨されます。
注記
Software Collection でプライベート共有ライブラリーを配布する場合は、
LD_LIBRARY_PATH
環境変数の代わりに DT_RUNPATH
属性を使用して、Software Collection 環境でプライベートの共有ライブラリーにアクセスできるようにすることを検討してください。
3.5.1. Software Collection 以外のライブラリーの使用
Software Collection 環境外で使用するライブラリーを配布する場合は、この目的で
/etc/ld.so.conf.d/
ディレクトリーを使用できます。
警告
システムで利用できるライブラリー
/etc/ld.so.conf.d/
には使用しないでください。/etc/ld.so.conf.d/
を使用すると、Software Collection のライブラリーのバージョンが、ライブラリーのシステムバージョンよりも優先される可能性があるため、システムで利用できないライブラリーにのみの使用が推奨されます。これにより、予期せぬ終了やデータ損失などの、アプリケーションのシステムバージョンの動作が望ましくない可能性があります。
手順3.4 Software Collection のライブラリーに /etc/ld.so.conf.d/ を使用
%{?scl_prefix}libs.conf
という名前のファイルを作成し、spec ファイル設定を適宜調整します。SOURCE2: %{?scl_prefix}libs.conf
%{?scl_prefix}libs.conf
ファイルに、Software Collection に関連付けられたライブラリーのバージョンがあるディレクトリーの一覧を含めます。以下に例を示します。/opt/provider/software_collection_1/root/usr/lib64/
上記の例では、Software Collection software_collection_1 に含まれる/usr/lib64/
ディレクトリーが一覧に含まれます。- 以下のように
%{?scl_prefix}libs.conf
ファイルがインストールされているように、spec ファイルの%install
セクションを編集します。%install install -p -c -m 644 %{SOURCE2} $RPM_BUILD_ROOT%{?scl:%_root_sysconfdir}%{!?scl:%_sysconfdir}/ld.so.conf.d/
3.5.2. Software Collection 名を使用したライブラリーメジャー soname の接頭辞
Software Collection に含まれるライブラリーを使用する場合は、ベースシステムのインストールの一部として、同じメジャー soname を持つライブラリーがすでにシステムで使用できることに注意してください。そのため、Software Collection に含まれるライブラリーに対してアプリケーションを構築する場合は、scl enable コマンドの使用を忘れないでください。これを実行しないと、ライブラリーの誤ったシステムバージョンにリンクされた、誤った環境でアプリケーションが実行される可能性があります。
警告
誤った環境でアプリケーションを実行することや (Software Collection 環境ではなくシステム環境など)、アプリケーションを誤ったライブラリーにリンクすると、予期せぬ終了やデータ損失など、アプリケーションの望ましくない動作が発生する可能性があることに注意してください。
LD_LIBRARY_PATH
環境変数が正しく設定されていない場合でも、アプリケーションが誤ったライブラリーにリンクされていないことを確認するには、Software Collection に含まれるライブラリーのメジャー soname を変更します。メジャーの soname を変更するには、メジャーの soname バージョン番号の前に Software Collection 名を付けることが推奨されます。
以下は、
mysql55-
接頭辞が付いた MySQL クライアントライブラリーの例です。
$
rpm -ql mysql55-mysql-libs | grep 'lib.*so'
/opt/provider/mysql55/root/usr/lib64/mysql/libmysqlclient.so.mysql55-18 /opt/provider/mysql55/root/usr/lib64/mysql/libmysqlclient.so.mysql55-18.0.0
同じシステムでは、MySQL クライアントライブラリーのシステムバージョンを以下に示します。
$ rpm -ql mysql-libs | grep 'lib.*so'
/usr/lib64/mysql/libmysqlclient.so.18
/usr/lib64/mysql/libmysqlclient.so.18.0.0
この rpmbuild ユーティリティーは、バージョン付けされた共有ライブラリーを含むパッケージ用の自動
Provides
タグを生成します。上記のように soname の接尾辞を付けない場合は、mysql パッケージの場合の Provides
の例は libmysqlclient.so.18()(64bit)
となります。この Provides
を使用して、RPM は誤った RPM パッケージを選択することができるため、アプリケーションには要件がなくなります。
上記のように soname の前に付ける場合は、mysql の場合に、生成した
Provides
の例は、libmysqlclient.so.mysql55-18()(64bit)
となります。この Provides
では、RPM で正しい RPM 依存関係が選択され、アプリケーションの要件が適用されます。
通常、Software Collection パッケージは、ベースシステムインストールのパッケージによりすでに提供されているシンボルを提供しないようにしてください。このルールの例外の 1 つは、ベースシステムインストールのパッケージでシンボルを使用する場合です。
3.5.3. Red Hat Enterprise Linux 7 での Software Collection Library のサポート
Red Hat Enterprise Linux 7 の Software Collection を構築する場合は、
%__provides_exclude_from
マクロを使用して、自動的に生成される RPM シンボル用に特定のファイルをスキャンしないようにします。
たとえば、
%{_libdir}
ディレクトリー内の .so
ファイルのスキャンを防ぐには、Software Collection の spec ファイルに、BuildRequires
タグまたは Requires
タグの前に以下の行を追加します。
%if %{?scl:1}%{!?scl:0} # Do not scan .so files in %{_libdir} %global __provides_exclude_from ^%{_libdir}/.*.so.*$ %endif
この機能は、自動の
Provides
および Requires
の RPM サポートの一部です。詳細は「Software Collection の自動 Provides および Requires ならびにフィルタリングサポート」を参照してください。