検索

2.10. 従来の spec ファイルの変換

download PDF
本項では、変換した spec ファイルが、従来のパッケージと Software Collection の両方で使用できるようにするため、従来の spec ファイルを Software Collection の spec ファイルに変換する方法を説明します。

2.10.1. 変換スペックファイルの例

従来の spec ファイルと変換された spec ファイルの比較は、以下の例を参照してください。
--- a/less.spec
+++ b/less.spec
@@ -1,10 +1,14 @@
+%{?scl:%global _scl_prefix /opt/provider}
+%{?scl:%scl_package less}
+%{!?scl:%global pkg_name %{name}}
+
 Summary: A text file browser similar to more, but better
-Name: less
+Name: %{?scl_prefix}less
 Version: 444
 Release: 7%{?dist}
 License: GPLv3+
 Group: Applications/Text
-Source: http://www.greenwoodsoftware.com/less/%{name}-%{version}.tar.gz
+Source: http://www.greenwoodsoftware.com/less/%{pkg_name}-%{version}.tar.gz
 Source1: lesspipe.sh
 Source2: less.sh
 Source3: less.csh
@@ -19,6 +22,7 @@ URL: http://www.greenwoodsoftware.com/less/
 Requires: groff
 BuildRequires: ncurses-devel
 BuildRequires: autoconf automake libtool
-Obsoletes: lesspipe < 1.0
+Obsoletes: %{?scl_prefix}lesspipe < 1.0
+%{?scl:Requires: %scl_runtime}
 
 %description
 The less utility is a text file browser that resembles more, but has
@@ -31,7 +35,7 @@ You should install less because it is a basic utility for viewing text
 files, and you'll use it frequently.
 
 %prep
-%setup -q
+%setup -q -n %{pkg_name}-%{version}
 %patch1 -p1 -b .Foption
 %patch2 -p1 -b .search
 %patch4 -p1 -b .time
@@ -51,16 +55,16 @@ make CC="gcc $RPM_OPT_FLAGS -D_GNU_SOURCE -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOU
 %install
 rm -rf $RPM_BUILD_ROOT
 make DESTDIR=$RPM_BUILD_ROOT install
-mkdir -p $RPM_BUILD_ROOT/etc/profile.d
+mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/profile.d
 install -p -c -m 755 %{SOURCE1} $RPM_BUILD_ROOT/%{_bindir}
-install -p -c -m 644 %{SOURCE2} $RPM_BUILD_ROOT/etc/profile.d
-install -p -c -m 644 %{SOURCE3} $RPM_BUILD_ROOT/etc/profile.d
-ls -la $RPM_BUILD_ROOT/etc/profile.d
+install -p -c -m 644 %{SOURCE2} $RPM_BUILD_ROOT%{_sysconfdir}/profile.d
+install -p -c -m 644 %{SOURCE3} $RPM_BUILD_ROOT%{_sysconfdir}/profile.d
+ls -la $RPM_BUILD_ROOT%{_sysconfdir}/profile.d
 
 %files
 %defattr(-,root,root,-)
 %doc LICENSE
-/etc/profile.d/*
+%{_sysconfdir}/profile.d/*
 %{_bindir}/*
 %{_mandir}/man1/*

2.10.2. タグおよびマクロ定義の変換

以下の手順では、従来のスペックファイルのタグおよびマクロ定義を Software Collection の spec ファイルに変換する方法を説明します。

手順2.1 タグおよびマクロ定義の変換

  1. %_scl_prefix の上に %scl_package macro マクロを定義することで、root ディレクトリーの場所を変更できます。
    %{?scl:%global _scl_prefix /opt/provider}
  2. %scl_package マクロを spec ファイルに追加します。次のように、スペックファイルのプリアンブルの前にマクロを配置します。
    %{?scl:%scl_package package_name}
  3. Software Collection 用にパッケージを構築していない場合は、spec ファイルのプリアンブルで %pkg_name マクロを定義することが推奨されます。
    %{!?scl:%global pkg_name %{name}}
    したがって、%pkg_name マクロを使用して、従来のパッケージと Software Collection の両方を構築するのに使用できるスペックファイルで、パッケージの元の名前を定義することができます。
  4. spec ファイルの Preamble で Name タグを以下のように変更します。
    Name: %{?scl_prefix}package_name
  5. 他の Software Collection パッケージを構築したり、リンクしたりする場合は、以下のように Requires タグおよび BuildRequires タグにある パッケージの名前に %{?scl_prefix} を付けます。
    Requires: %{?scl_prefix}ifconfig
    パッケージのシステムバージョンによっては、バージョン管理 Requires または BuildRequires を使用しないでください。システムで更新できるパッケージに依存する必要がある場合は、Software Collection にそのパッケージを含めるか、システムパッケージの更新時に Software Collection を再ビルドすることを忘れないようにしてください。
  6. Software Collection の基本的なパッケージがすべてメインのメタパッケージの依存関係であることを確認するには、spec ファイルの BuildRequires タグまたは Requires タグの後に以下のマクロを追加します。
    %{?scl:Requires: %scl_runtime}
  7. ObsoletesConflicts および BuildConflicts タグの前に %{?scl_prefix} を付けます。これは、たとえば、ベースシステムのインストールから Obsolete 削除されるなどして、Software Collection を使用して、古いシステムに新しいパッケージをデプロイできるようにします。以下に例を示します。
    Obsoletes: %{?scl_prefix}lesspipe < 1.0
  8. 以下の例のように、Provides タグの前に %{?scl_prefix} を付けます。
    Provides: %{?scl_prefix}more

2.10.3. サブパッケージの変換

-n オプションで名前を定義するサブパッケージの場合は、以下の例のようにその名前の前に %{?scl_prefix} を付けます。
%package -n %{?scl_prefix}more
接頭辞は %package マクロだけでなく、%description および %files に対しても適用されます。以下に例を示します。
%description -n %{?scl_prefix}rubygems
RubyGems is the Ruby standard for publishing and managing third party
libraries.
サブパッケージにメインパッケージが必要な場合は、タグが %{?scl_prefix}%{pkg_name} を使用するようにサブパッケージの Requires タグも調整してください。以下に例を示します。
Requires: %{?scl_prefix}%{pkg_name} = %{version}-%{release}

2.10.4. RPM スクリプトの変換

本セクションでは、従来の spec ファイルの %prep%build%install%check%pre、および %post セクションで頻繁に検索できる RPM スクリプトを変換する一般的なルールを説明します。
  • %name はすべて %pkg_name に置き換えます。最も重要な点として、これには %setup マクロの調整が含まれます。
    • スペックファイルの %prep セクションで %setup マクロを調整し、そのマクロが Software Collection 環境で異なるパッケージ名を処理できるようにします。
      %setup -q -n %{pkg_name}-%{version}
      %setup マクロが必要なため、Software Collection を正常に構築するには -n オプションとともにマクロを使用する必要があります。
  • %_root_ マクロのいずれかを使用してシステムファイルシステム階層を参照する場合は、これらのマクロに条件を使用する必要があります。これにより、従来のパッケージと Software Collection の両方を構築するために spec ファイルを使用することができます。以下の例のようにマクロを編集します。
    mkdir -p %{?scl:%_root_sysconfdir}%{?!scl:%_sysconfdir}
  • 他の Software Collection パッケージに依存する Software Collection パッケージを構築する場合は、scl enable 機能リンクを正しく実行したり、適切なバイナリーを実行することが重要になることがよくあります。これが必要な例は、Software Collection ライブラリーに対してコンパイルするか、Software Collection でインタープリターを使用してインタープリターを実行する例です。
    以下の例のように、%{?scl: 接頭辞を使用してスクリプトをラップします。
    %{?scl:scl enable %scl - << \EOF}
     set -e
     ruby example.rb
     RUBYOPT="-Ilib" ruby bar.rb
     # The rest of the script contents goes here.
    %{?scl:EOF}
    スクリプトで set -e を指定することが重要です。これにより、スクリプトが rpm シェルまたは scl 環境で実行されるかどうかに関わらず、スクリプトの動作が一貫性を保つことが重要です。
  • Software Collection パッケージのインストール時に実行されるスクリプトに注意してください。以下に例を示します。
    • %pretrans%pre
    • %post%postun%posttrans
    • %triggerin%triggerun、および %triggerpostun
    このスクリプトの scl enable 機能を使用する場合は、ベースシステムのインストールとの意図しない競合を避けるために、空の環境から開始することが推奨されます。
    これを行うには、以下の例のように、Software Collection を有効にする前に env -i - を使用します。
    %posttrans
    %{?scl:env -i - scl enable %{scl} - << \EOF}
    %vagrant_plugin_register %{vagrant_plugin_name}
    %{?scl:EOF}
  • RPM スクリプトで見つかったハードコーディングされたパスはすべて適切なマクロに置き換える必要があります。たとえば、すべての /usr/share%{_datadir} で置き換えます。これは、$RPM_BUILD_ROOT 変数と %{build_root} マクロが scl マクロで移動しないため、必要です 。

2.10.5. Software Collection の自動 Provides および Requires ならびにフィルタリングサポート

重要
このセクションで説明する機能は、Red Hat Enterprise Linux 6 では利用できません。
Red Hat Enterprise Linux 7 の RPM は Provides、自動 Requires およびフィルタリングをサポートします。たとえば、すべての Python ライブラリーでは、RPM は自動的に以下の Requires を追加します。
Requires: python(abi) = (version)
「従来の spec ファイルの変換」の説明にあるように、従来の RPM パッケージを変換する際に、Requires の前に %{?scl_prefix} を付ける必要があります。
Requires: %{?scl_prefix}python(abi) = (version))
元の RPM スクリプトは拡張できないため、これらの依存関係を検索するスクリプトを Software Collection に対して書き換える必要があるため、場合によってはフィルタリングを使用することができません。たとえば、Python の ProvidesRequires の自動書き込みを行い、macros.%{scl}-config マクロファイルに以下の行を追加します。
%__python_provides /usr/lib/rpm/pythondeps-scl.sh --provides %{_scl_root} %{scl_prefix}
%__python_requires /usr/lib/rpm/pythondeps-scl.sh --requires %{_scl_root} %{scl_prefix}
/usr/lib/rpm/pythondeps-scl.sh ファイルは、従来のパッケージの pythondeps.sh ファイルをベースとしており、検索パスを調整します。
pkg_config Provides など、調整が必要な Provides または Requires がある場合には、2 つの方法があります。
  • Software Collection のすべてのパッケージに適用されるように、macros.%{scl}-config マクロファイルに次の行を追加します。
    %_use_internal_dependency_generator 0
    %__deploop() while read FILE; do /usr/lib/rpm/rpmdeps -%{1} ${FILE}; done | /bin/sort -u
    %__find_provides /bin/sh -c "%{?__filter_prov_cmd} %{__deploop P} %{?__filter_from_prov}"
    %__find_requires /bin/sh -c "%{?__filter_req_cmd}  %{__deploop R} %{?__filter_from_req}"
    
    # Handle pkgconfig's virtual Provides and Requires
    %__filter_from_req | %{__sed} -e 's|pkgconfig|%{?scl_prefix}pkgconfig|g'
    %__filter_from_prov | %{__sed} -e 's|pkgconfig|%{?scl_prefix}pkgconfig|g'
  • Provides または Requires にフィルター処理を行うすべての spec ファイルのタグ定義の後に以下の行を追加します。
    %{?scl:%filter_from_provides s|pkgconfig|%{?scl_prefix}pkgconfig|g}
    %{?scl:%filter_from_requires s|pkgconfig|%{?scl_prefix}pkgconfig|g}
    %{?scl:%filter_setup}
重要
フィルターを使用する場合は、変更する自動依存関係に注意する必要があります。たとえば、従来のパッケージに含まれるのが Requires: pkgconfig(package_1) および Requires: pkgconfig(package_2) であり、package_2 は Software Collection に含まれる場合は、package_1Requires タグにフィルターを適用しないようにしてください 。

2.10.6. Software Collection マクロファイルのサポート

場合によっては、Software Collection パッケージでマクロファイルを配信しないといけない場合があります。これらは %{?scl:%{_root_sysconfdir}}%{!?scl:%{_sysconfdir}}/rpm/ ディレクトリーにあります。これは、従来のパッケージの /etc/rpm/ ディレクトリーに対応します。マクロファイルを読み込む際には、以下を確認します。
  • .%{scl} を名前に追加してマクロファイルの名前を変更する場合は、ベースシステムインストールのファイルと競合しないようにします。
  • マクロファイル内のマクロは、以下の例のように、拡張されていないか、条件を使用しているかのいずれかになります。
    %__python2 %{_bindir}/python
    %python2_sitelib %(%{?scl:scl enable %scl '}%{__python2} -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())"%{?scl:'})
別の例として、Software Collection python26 に依存する Software Collection mypython を作成する必要がある場合もあります。python26 Software Collection は上記のサンプルのように %{__python2} マクロを定義します。このマクロは /opt/provider/mypython/root/usr/bin/python2 に評価されますが、python2 バイナリーは python26 Software Collection (/opt/provider/python26/root/usr/bin/python2) でのみ利用できます。
mypython Software Collection 環境でソフトウェアを構築するには、以下を確認します。
  • python26-python-devel パッケージの一部である macros.python.python26 マクロファイルには、以下の行が含まれます。
    %__python26_python2 /opt/provider/python26/root/usr/bin/python2
  • また、python26-build サブパッケージ内のマクロファイルと、Software Collection の build サブパッケージには、以下の行が含まれます。
    %scl_package_override() {%global __python2 %__python26_python2}
    
これにより、対応する Software Collection のビルドサブパッケージが存在する場合にのみ %{__python2} マクロが再定義されます。これは通常、その Software Collection のソフトウェアを構築することを意味します。

2.10.7. Software Collection シバンのサポート

シバンは、インタープリターディレクティブとして使用されるスクリプトの最初の文字のシーケンスです。シバンは自動依存関係ジェネレーターによって処理され、場合によってはシステムの root ファイルシステム内の特定の場所を参照します。
自動依存関係ジェネレーターがシバンを処理すると、それが参照するインタープリターに応じて依存関係が追加されます。Software Collection の観点からは、以下の 2 種類のシバンがあります。
#!/usr/bin/env example
このシバンは、/usr/bin/env プログラムにインタープリターの実行を指示します。
自動依存関係ジェネレーターは、予想通りに /usr/bin/env プログラムに依存関係を作成します。
enable スクリプトレットで $PATH 環境変数が適切に再定義された場合、example インタープリターは期待通りに Software Collection ファイルシステム階層にあります。
Software Collection パッケージでシバンを書き直し、シバンが Software Collection ファイルシステム階層にあるインタープリターへの完全パスを指定することが推奨されます。
#!/usr/bin/example
このシバンはインタープリターへの直接パスを指定します。
自動依存関係ジェネレーターは、Software Collection ファイルシステム階層外にある /usr/bin/example インタープリターの依存関係を作成します。ただし、Software Collection のパッケージを構築する場合は、多くの場合、Software Collection ファイルシステム階層にある %{?_scl_root}/usr/bin/example インタープリターに依存します。
$PATH 環境変数を適切に再定義しても、インタープリターが使用されるものには影響しないことに注意してください。Software Collection ファイルシステム階層外にあるインタープリターのシステムバージョンは常に使用されます。大半の場合、これは望ましくありません。
このタイプのシバンを使用していて、シバンが Software Collection パッケージの構築時に Software Collection ファイルシステム階層を参照するようにするには、以下のようなコマンドを使用します。
find %{buildroot} -type f | \
  xargs sed -i -e '1 s"^#!/usr/bin/example"#!%{?_scl_root}/usr/bin/example"'
/usr/bin/example は、使用するインタープリターになります。

2.10.8. Software Collection を別の Software Collection に依存させる

Software Collection を別の Software Collection のパッケージに依存するようにするには、これらのタグが依存関係を適切に定義できるように、依存する Software Collection のスペックファイルの BuildRequires タグおよび Requires タグを調整する必要があります。
たとえば、software_collection_1software_collection_2 という名前の 2 つの Software Collections の依存関係を定義するには、以下の 3 つの行をアプリケーションの spec ファイルに追加します。
BuildRequires: scl-utils-build
Requires: %scl_require software_collection_1
Requires: %scl_require software_collection_2
以下のように、spec ファイルの Preamble の前に %scl_package マクロも含まれていることを確認してください。
%{?scl:%scl_package less}
%scl_package マクロは、Software Collection の spec ファイルに含める必要があることに注意してください。
%scl_require_package マクロを使用して、以下の例にあるように、特定の Software Collection から特定のパッケージの依存関係を定義することもできます。
BuildRequires: scl-utils-build
Requires: %scl_require_package software_collection_1 package_name
Red Hat logoGithubRedditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

© 2024 Red Hat, Inc.