4.4. rh-perl524 Software Collection の拡張

本セクションでは、独自の依存する Software Collection を構築して、rh-perl524 Software Collection を拡張する方法を説明します。
重要
本項で説明する例は、rh-perl524 Software Collection を以下のパッケージで拡張する場合にのみ期待どおりに機能します。
  • Perl モジュールを提供しないでください。
  • rh-perl524 Software Collection が提供する Perl モジュールのみに依存します。

4.4.1. h2m144 Software Collection

本セクションは、依存する Software Collection のメタパッケージに関するコメントされた例を説明します。依存する Software Collection は h2m144 という名前で、help2man Perl パッケージバージョン 1.44.1 が含まれています。h2m144 Software Collection は、rh-perl524 Software Collection によって異なります。
h2m144 Software Collection のメタパッケージでは、以下の点に注意してください。
  • h2m144 Software Collection メタパッケージには、以下のビルド依存関係セットがあります。
    BuildRequires: %{scl_prefix_perl}scldevel
    これは、rh-perl524-scldevel に展開されます。
    rh-perl524-scldevel サブパッケージには 2 つの重要なマクロ (%scl_perl および %scl_prefix_perl) が含まれます。Perl 依存関係ジェネレーターも提供します。マクロは、メタパッケージの spec ファイルの上部に定義されていることに注意してください。定義は必須ではありませんが、h2m144 Software Collection が rh-perl524 Software Collection に構築されるように設計されているという視覚的なヒントを提供します。フォールバック値としても機能します。
  • h2m144-build サブパッケージには、以下の依存関係セットがあります。
    Requires: %{scl_prefix_perl}scldevel
    これは、rh-perl524-scldevel に展開されます。この依存関係の目的は、h2m144 Software Collection のパッケージを構築する際にマクロと依存関係ジェネレーターを常に存在させることです。
  • h2m144 Software Collection の enable スクリプトレットには、以下の行が含まれます。
    . scl_source enable %{scl_perl}
    行の先頭にあるドットに注意してください。この行では、h2m144 Software Collection が起動すると Perl Software Collection が暗黙的に起動されます。これにより、ユーザーは scl enable rh-perl524 h2m144 command のかわりに、scl enable h2m144 command だけを実行して Software Collection 環境で command を実行することができます。
  • マクロファイル macros.h2m144-config は Perl 依存関係ジェネレーターと、他のパッケージの spec ファイルで使用される特定の Perl 固有のマクロを呼び出します。
%global scl h2m144
%scl_package %scl

# Default values for the rh-perl524 Software Collection. These
# will be used when rh-perl524-scldevel is not in the build root.
%{!?scl_perl:%global scl_perl rh-perl524}
%{!?scl_prefix_perl:%global scl_prefix_perl %{scl_perl}-}

# Only for this build, override __perl_requires for the automatic dependency
# generator.
%global __perl_requires /usr/lib/rpm/perl.req.stack

Summary: Package that installs %scl
Name:    %scl_name
Version: 1
Release: 1%{?dist}
License: GPLv2+
BuildRequires: scl-utils-build
# Always make sure that there is the rh-perl524-scldevel
# package in the build root.
BuildRequires: %{scl_prefix_perl}scldevel
# Require rh-perl524-perl-macros; you will need macros from that package.
BuildRequires: %{scl_prefix_perl}perl-macros
Requires: %{scl_prefix}help2man

%description
This is the main package for %scl Software Collection.

%package runtime
Summary: Package that handles %scl Software Collection.
Requires: scl-utils
Requires: %{scl_prefix_perl}runtime

%description runtime
Package shipping essential scripts to work with %scl Software Collection.

%package build
Summary: Package shipping basic build configuration
Requires: scl-utils-build
# Require rh-perl524-scldevel so that there is always access to the %%scl_perl
# and %%scl_prefix_perl macros in builds for this Software Collection.
Requires: %{scl_prefix_perl}scldevel

%description build
Package shipping essential configuration macros to build %scl Software Collection.

%prep
%setup -c -T

%build

%install
%scl_install

# Create the enable scriptlet that:
# - Adds an additional load path for the Perl interpreter.
# - Runs scl_source so that you can run:
#     scl enable h2m144 'bash'
#   instead of:
#     scl enable rh-perl524 h2m144 'bash'

cat >> %{buildroot}%{_scl_scripts}/enable << EOF
. scl_source enable %{scl_perl}
export PATH="%{_bindir}:%{_sbindir}\${PATH:+:\${PATH}}"
export MANPATH="%{_mandir}:\${MANPATH:-}"
EOF

cat >> %{buildroot}%{_root_sysconfdir}/rpm/macros.%{scl}-config << EOF
%%scl_package_override() %%{expand:%%global __perl_requires /usr/lib/rpm/perl.req.stack
%%global __perl_provides /usr/lib/rpm/perl.prov.stack
%%global __perl %{_scl_prefix}/%{scl_perl}/root/usr/bin/perl
}
EOF

%files

%files runtime -f filelist
%scl_files

%files build
%{_root_sysconfdir}/rpm/macros.%{scl}-config

%changelog
* Tue Apr 22 2014 John Doe <jdoe@example.com> - 1-1
- Initial package.

4.4.2. help2man パッケージ

以下は、help2man パッケージの spec ファイルのコメントされた例です。spec ファイルでは、以下の点に注意してください。
  • BuildRequires タグの接頭辞は、%{scl_prefix} ではなく、%{?scl_prefix_perl} になります。
%{?scl:%scl_package help2man}
%{!?scl:%global pkg_name %{name}}

# Supported build option:
#
# --with nls ... build this package with --enable-nls 
%bcond_with nls

Name:           %{?scl_prefix}help2man
Summary:        Create simple man pages from --help output
Version:        1.44.1
Release:        1%{?dist}
Group:          Development/Tools
License:        GPLv3+
URL:            http://www.gnu.org/software/help2man
Source:         ftp://ftp.gnu.org/gnu/help2man/help2man-%{version}.tar.xz
%{!?with_nls:BuildArch: noarch}

BuildRequires:  %{?scl_prefix_perl}perl(Getopt::Long)
BuildRequires:  %{?scl_prefix_perl}perl(POSIX)
BuildRequires:  %{?scl_prefix_perl}perl(Text::ParseWords)
BuildRequires:  %{?scl_prefix_perl}perl(Text::Tabs)
BuildRequires:  %{?scl_prefix_perl}perl(strict)
%{?with_nls:BuildRequires: %{?scl_prefix_perl}perl(Locale::gettext) /usr/bin/msgfmt}
%{?with_nls:BuildRequires: %{?scl_prefix_perl}perl(Encode)}
%{?with_nls:BuildRequires: %{?scl_prefix_perl}perl(I18N::Langinfo)}
Requires:   %{?scl_prefix_perl}perl(:MODULE_COMPAT_%(%{?scl:scl enable %{scl_perl} '}eval "`perl -V:version`"; echo $version%{?scl:'}))

Requires(post): /sbin/install-info
Requires(preun): /sbin/install-info

%description
help2man is a script to create simple man pages from the --help and
--version output of programs.

Since most GNU documentation is now in info format, this provides a
way to generate a placeholder man page pointing to that resource while
still providing some useful information.

%prep
%setup -q -n help2man-%{version}

%build
%configure --%{!?with_nls:disable}%{?with_nls:enable}-nls --libdir=%{_libdir}/help2man
%{?scl:scl enable %{scl} "}
make %{?_smp_mflags}
%{?scl:"}

%install
%{?scl:scl enable %{scl} "}
make install_l10n DESTDIR=$RPM_BUILD_ROOT
%{?scl:"}
%{?scl:scl enable %{scl} "}
make install DESTDIR=$RPM_BUILD_ROOT
%{?scl:"}
%find_lang %pkg_name --with-man

%post
/sbin/install-info %{_infodir}/help2man.info %{_infodir}/dir 2>/dev/null || :

%preun
if [ $1 -eq 0 ]; then
  /sbin/install-info --delete %{_infodir}/help2man.info \
    %{_infodir}/dir 2>/dev/null || :
fi

%files -f %pkg_name.lang
%doc README NEWS THANKS COPYING
%{_bindir}/help2man
%{_infodir}/*
%{_mandir}/man1/*

%if %{with nls}
%{_libdir}/help2man
%endif

%changelog
* Tue Apr 22 2014 John Doe <jdoe@example.com> - 1.44.1-1
- Built for h2m144 SCL.

4.4.3. h2m144 Software Collection の構築

h2m144 Software Collection を構築するには、以下を実行します。
  1. perl524 Software Collection に含まれる rh-perl524-scldevel パッケージおよび rh-perl524-perl-macros パッケージをインストールします。
  2. h2m144.spec を構築して、h2m144-runtime パッケージおよび h2m144-build パッケージをインストールします。
  3. help2man のすべてのビルド要件である rh-perl524-perl パッケージ、rh-perl524-perl-Text-ParseWords パッケージ、および rh-perl524-perl-Getopt-Long パッケージをインストールします。
  4. help2man.spec をビルドします。

4.4.4. h2m144 Software Collection のテスト

h2m144 Software Collection をテストするには、以下を実行します。
  1. h2m144-help2man パッケージをインストールします。
  2. 次のコマンドを実行します。
    $ scl enable h2m144 'help2man bash'
  3. 出力が以下の行と類似することが確認されます。
    .\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.44.1.
    .TH BASH, "1" "April 2014" "bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)" "User Commands"
    .SH NAME
    bash, \- manual page for bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
    .SH SYNOPSIS
    .B bash
    [\fIGNU long option\fR] [\fIoption\fR] ...
    .SH DESCRIPTION
    GNU bash, version 4.1.2(1)\-release\-(x86_64\-redhat\-linux\-gnu)
    .IP
    bash [GNU long option] [option] script\-file ...
    .SS "GNU long options:"
    .HP
    \fB\-\-debug\fR