PerlモジュールをRPMパッケージ化しようとしたところすんなりいかなかったのでメモしておきます。

大項目中項目
RPMパッケージ化モジュールNet::Netmask
インストール先/usr/local
specファイル名Net-Netmask.spec


とりあえず、ここでは Net::Netmask のPerlモジュールをRPMパッケージ化してみようと思います。
 


 

(1)こんなspecファイルを作成してみる

%define         PREFIX          /usr/local
Name:           Net-Netmask
Version:        1.9016
Release:        1%{?dist}
Summary:        This perl module lookup IP network blocks.

Group:          Development/Libraries
License:        Artistic
URL:            http://search.cpan.org/~muir/Net-Netmask-1.9016/Netmask.pod
Source0:        %{name}-%{version}.tar.gz
BuildRoot:      %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)

BuildRequires:  perl, perl-ExtUtils-MakeMaker, perl-Test-Simple
Requires:       perl

%description
Net::Netmask parses and understands IPv4 CIDR blocks. It's built with an object-oriented interface. Nearly all functions are methods that operate on a Net::Netmask object.

%prep
%setup -q

%build
perl Makefile.PL PREFIX=%{PREFIX}
make
make test

%install
rm -rf %{buildroot}
make -e PREFIX=$RPM_BUILD_ROOT%{PREFIX} install

%clean
rm -rf %{buildroot}

%files
%defattr(-,root,root,-)
%attr(0444, root, root) %{PREFIX}/lib64/perl5/auto/Net/Netmask/.packlist
%attr(0444, root, root) %{PREFIX}/share/man/man3/Net::Netmask.3pm
%attr(0444, root, root) %{PREFIX}/share/perl5/Net/Netmask.pm
%attr(0444, root, root) %{PREFIX}/share/perl5/Net/Netmask.pod

%changelog

 

(2)さぁ、RPMパッケージ化だ!

[root@example SPECS]# rpmbuild -bb Net-Netmask.spec
実行中(%prep): /bin/sh -e /var/tmp/rpm-tmp.m0fz0x
+ umask 022
+ cd /root/rpmbuild/BUILD
+ LANG=C
+ export LANG
+ unset DISPLAY
(snip)
+ /usr/lib/rpm/check-buildroot
/root/rpmbuild/BUILDROOT/Net-Netmask-1.9016-1.el6.x86_64/usr/local/lib64/perl5/perllocal.pod:C<installed into: /root/rpmbuild/BUILDROOT/Net-Netmask-1.9016-1.el6.x86_64/usr/local/share/perl5>
Found '/root/rpmbuild/BUILDROOT/Net-Netmask-1.9016-1.el6.x86_64' in installed files; aborting
エラー: /var/tmp/rpm-tmp.VAkLJj の不正な終了ステータス (%install)

RPM ビルドエラー:
    /var/tmp/rpm-tmp.VAkLJj の不正な終了ステータス (%install)

むむむ、何かエラーが・・・。
よくみると「check-buildroot」処理の部分でエラーが発生しているようなので、そのスクリプトを見てみる。

[root@example SPECS]# cat /usr/lib/rpm/check-buildroot
#! /bin/sh

# Copyright (C) 2004 Enrico Scholz <enrico.scholz@informatik.tu-chemnitz.de>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

test -z "$QA_SKIP_BUILD_ROOT" || exit 0

if [ -z "$RPM_BUILD_ROOT" -o "$RPM_BUILD_ROOT" = "/" ]; then
        exit 0
fi

tmp=$(mktemp /tmp/cbr.XXXXXX)
trap "rm -f $tmp" EXIT

find "$RPM_BUILD_ROOT" \! \( \
    -name '*.pyo' -o -name '*.pyc' -o -name '*.elc' -o -name '.packlist' \
    \) -type f -print0 | \
    LANG=C xargs -0r grep -F "$RPM_BUILD_ROOT" >$tmp

test -s "$tmp" && {
    cat "$tmp"
    echo "Found '$RPM_BUILD_ROOT' in installed files; aborting"
    exit 1
} || :

どうも、ハイライトしている部分でエラーが発生しているようなのでここだけ抜き出したスクリプトを作ってみる。

・check.sh

[root@example SPECS]# vi check.sh
#!/bin/sh
RPM_BUILD_ROOT=/root/rpmbuild/BUILDROOT/Net-Netmask-1.9016-1.el6.x86_64

find "$RPM_BUILD_ROOT" \! \( \
    -name '*.pyo' -o -name '*.pyc' -o -name '*.elc' -o -name '.packlist' \
    \) -type f -print0 | \
    LANG=C xargs -0r grep -F "$RPM_BUILD_ROOT"
[root@example SPECS]# chmod +x check.sh
[root@example SPECS]# ./check.sh
/root/rpmbuild/BUILDROOT/Net-Netmask-1.9016-1.el6.x86_64/usr/local/lib64/perl5/perllocal.pod:C<installed into: /root/rpmbuild/BUILDROOT/Net-Netmask-1.9016-1.el6.x86_64/usr/local/share/perl5>

当たり前だけど、エラーが発生した時と同じ文字列が表示されましたね。
「perllocal.pod」があると条件にマッチしちゃうので以下のようにspecファイルを修正した。

・修正したspecファイル

%define         PREFIX          /usr/local
Name:           Net-Netmask
Version:        1.9016
Release:        1%{?dist}
Summary:        This perl module lookup IP network blocks.

Group:          Development/Libraries
License:        Artistic
URL:            http://search.cpan.org/~muir/Net-Netmask-1.9016/Netmask.pod
Source0:        %{name}-%{version}.tar.gz
BuildRoot:      %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)

BuildRequires:  perl, perl-ExtUtils-MakeMaker, perl-Test-Simple
Requires:       perl

%description
Net::Netmask parses and understands IPv4 CIDR blocks. It's built with an object-oriented interface. Nearly all functions are methods that operate on a Net::Netmask object.


%prep
%setup -q


%build
perl Makefile.PL PREFIX=%{PREFIX}
make
make test


%install
rm -rf %{buildroot}
make -e PREFIX=$RPM_BUILD_ROOT%{PREFIX} install
if [ `uname -m` == x86_64 ] ; then
        rm -f $RPM_BUILD_ROOT%{PREFIX}/lib64/perl5/perllocal.pod
else
        rm -f $RPM_BUILD_ROOT%{PREFIX}/lib/perl5/perllocal.pod
fi



%clean
rm -rf %{buildroot}


%files
%defattr(-,root,root,-)
%attr(0444, root, root) %{PREFIX}/lib64/perl5/auto/Net/Netmask/.packlist
%attr(0444, root, root) %{PREFIX}/share/man/man3/Net::Netmask.3pm
%attr(0444, root, root) %{PREFIX}/share/perl5/Net/Netmask.pm
%attr(0444, root, root) %{PREFIX}/share/perl5/Net/Netmask.pod


%changelog

 

(3)もう一度パッケージ化に挑戦!

[root@example SPECS]# rpmbuild -bb Net-Netmask.spec
(snip)
書き込み完了: /root/rpmbuild/RPMS/x86_64/Net-Netmask-1.9016-1.el6.x86_64.rpm
書き込み完了: /root/rpmbuild/RPMS/x86_64/Net-Netmask-debuginfo-1.9016-1.el6.x86_64.rpm
実行中(%clean): /bin/sh -e /var/tmp/rpm-tmp.YAwRT0
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd Net-Netmask-1.9016
+ rm -rf /root/rpmbuild/BUILDROOT/Net-Netmask-1.9016-1.el6.x86_64
+ exit 0

パッケージ化が完了:)
 

(4)パッケージ化したモジュールをインストール!

[root@example SPECS]# cd ../RPMS/x86_64/
[root@example x86_64]# rpm -ivh Net-Netmask-1.9016-1.el6.x86_64.rpm
準備中...                ########################################### [100%]
   1:Net-Netmask            ########################################### [100%]

インストールできました:)
PerlモジュールをRPMパッケージ化する時は「perllocal.pod」を入れないように注意する必要があるみたいです。
ここではリネームせずにそのままパッケージしてしまいましたが、パッケージ化する時の名前は先頭に「perl-」を付けたほうが分かりやすいと思います。


2月 9, 2013 at 9:10 pm by 黒ぶちメガネ
Category: Linux, Perlスクリプト