トップ | GentooJPについて | GentooJPの歩き方 | 各種ドキュメント

Gentoo Linux 開発者 Tips

  この文章では、ebuild の開発を円滑に進めるために便利な Tips を紹介します。 ebuild の一般的な記述方法については Gentoo Linux 開発者 HOWTO をご参照下さい。


Contents:
Author, Editor : 渡邊 集

Updated 17 Oct 2003


1.はじめに

開発者 Tips について 

この文章では、Portage システムにおける個々のパッケージのインストール手順書である ebuild を開発する際に知っておくと便利な Tips を紹介していきます。 これから ebuild 開発をやってみようという方や、既に ebuild の開発に関わっている方などにとって有用なものとなり、痒いところに手の届くものになることを目指しています。

Important: この文章は ebuild の一般的な記述方法を知っているという前提のもとに書かれています。 ebuild の一般的な記述方法については、 Gentoo Linux 開発者 HOWTO をご参照下さい。

2.省略可能な記述

ebuild ファイル内において、必要に応じて設定される変数や関数がありますが、いくつかのものについてはデフォルトの値や動作が決まっていて、これらの記述を省略することができます。

冒頭の cd ${S} 

ebuild では通常、ディレクトリ ${S} 上に展開されたソースファイルをコンパイルするなどしてソフトウェアのビルドを行っていくわけですが、普通に考えるとそのディレクトリまで移動してから作業を行わなければならないはずです。 しかしながら ebuild でオーバーライド可能な関数では全てカレントディレクトリが ${S} である状態から始まるため、cd コマンドでディレクトリを移動するというステップを省略することができます。

また、例えば src_unpack で ${S} 以外のディレクトリに移動しても src_compile の冒頭でカレントディレクトリは ${S} に移動されます。 もちろん src_install などの関数においても同様です。

src_unpack 関数 

変数 SRC_URI に示された URI からダウンロードしてきたアーカイブを展開する操作を記述する src_unpack 関数ですが、デフォルト動作

Code listing 2.1
if [ "${A}" != "" ]; then
    unpack ${A}
fi

が設定されており、この動作だけで事足りる場合は src_unpack 関数の記述を省略しても構いません。

Warning: ただし何らかの eclass を継承していた場合、デフォルト動作の挙動が変わる可能性がありますので注意してください。 どの eclass を継承するとデフォルト動作がオーバーライドされるかということについては、 eclass リファレンス を参照してください。

src_compile 関数 

src_unpack 関数で展開したアーカイブに対して configure や make の実行を行う操作などを記述する src_compile 関数ですが、デフォルト動作

Code listing 2.2
if [ -x ./configure ]; then
    econf 
    emake || die "emake failed"
fi

が設定されており、この動作だけで事足りる場合は src_compile 関数の記述を省略しても構いません。

Warning: しつこいようですが、何らかの eclass を継承していた場合、デフォルト動作の挙動が変わる可能性がありますので注意してください。 どの eclass を継承するとデフォルト動作がオーバーライドされるかということについては、 eclass リファレンス を参照してください。

また、ほとんどの場合は問題ないのですが、稀に「configure スクリプトは用意されているが実行する必要はない」などという状況が発生したりします。 そのような場合 src_compile を省略すると、このデフォルト動作によってコンパイルが行われてしまいます。 そんなときでもコンパイルを行わずに src_install タームまで進みたい場合は

Code listing 2.3
src_compile() {
    return
}

などと記述すると良いでしょう。

3.eclass に関連した Tips

Portage システムには、ebuild を記述する際の負担を少しでも軽減するために eclass というものが用意されています。 このセクションでは、この eclass を利用した Tips を紹介していきます。 各 eclass の詳細については eclass リファレンス を参照してください。

Important: eclass についてご存じでない方は、まず eclass HOWTO をご一読下さい。

CFLAGS/CXXFLAGS を操作したい 

あるフラグが CFLAGS や CXXFLAGS に設定されているとコンパイルが通らない、あるいは逆に、あるフラグを設定しないとコンパイルできないなどといった状況が発生した場合、flag-o-matic.eclass を利用すると便利です。

例えば -fPIC を設定しないとコンパイルが通らない、などといった場合は

Code listing 3.1
append-flags -fPIC

例えば SDL 関係のフラグを追加するなら

Code listing 3.2
append-flags `sdl-config --cflags`

-fomit-frame-pointer を取り除きたい場合は

Code listing 3.3
filter-flags -fomit-frame-pointer

-O3 や -O1 などの最適化オプションを全て取り除きたい場合は、

Code listing 3.4
filter-flags -O?

などと記述することができます。また、strip-flags という関数を用いることによって、既知の安全なフラグ以外を全て取り去ることも可能です。 strip-flags には特に引数はありません。

いずれも、コンパイル動作を始める前であればどこに記述しても構いません。

コンパイルに使われる gcc のバージョンを知りたい 

ebuild 化しようとしているソフトウェアが、gcc のあるバージョンではパッチを当てなければコンパイルできない、などといった状況も発生することがあります。 そんなとき、gcc.eclass を継承することによって gcc に関する色々な関数を利用できるようになります。

例えば gcc-3.x を利用している場合にのみ hoge-gcc3.patch を当てたい、という場合、

Code listing 3.5
[ `gcc-major-version` == 3 ] && epatch hoge-gcc3.patch

などと記述すると良いでしょう。 gcc.eclass を継承することによって利用できるようになる gcc-major-version 関数は、gcc のメジャーバージョンを返します。

CVS ツリーから自動的にモジュールを取得してくる ebuild を作成したい 

cvs.eclass を継承して簡単に作成することができます。具体的な利用方法については eclass リファレンス を参照してください。

ファイルの改行コードが CRLF では困る 

Windows 上で作成されたソフトウェアを扱うときなどに、改行コードが CRLF で困る場合も出てくるでしょう。 そんなときは eutils.eclass を継承し、edos2unix という関数を利用することができます。

例えば hoge.c hoge.h foo.java の3つのファイルの改行コードがが CRLF であり、これらのファイルの改行コードを LF のみにしたい場合、

Code listing 3.6
edos2unix hoge.{c,h} foo.java

などと記述することができます。

ユーザにライセンスの確認を行わせたい 

一部のソフトウェアでは配付条件にライセンスの確認を求めるものもあり、インストールするユーザに対してライセンスの確認を行わなければならないことがあります。 そんな場合は eutils.eclass を継承することによって、check_license 関数を利用することができます。

Code listing 3.7
check_license [license file]

この関数を呼ぶと [license file] を ${PAGER} によって表示し、ユーザに承諾するかどうかというプロンプトを出します。 ここでユーザが Y/Yes/y/yes と答えたときにのみ真が返されます。

また、[license file] を省略すると ${PORTDIR}/licenses/${LICENSE} が代わりに表示されます。

4.GNU autotools

autoconf のバージョン 

Gentoo Linux では GNU autoconf の複数のバージョンを利用可能にするために、 /usr/bin/autoconf をラッパースクリプトとし、環境変数によって 2.1 系列と 2.5 系列を使い分けできるようになっています。

デフォルトでは 2.1 系列の autoconf を使うようになっているのですが、ソフトウェアによっては 2.5 系列の autoconf を要求するものがあります。 そのようなソフトウェアの ebuild を作成するときは、

Code listing 4.1
export WANT_AUTOCONF=2.5

としてください。 また、2.1 系列の autoconf を使用することを明示的に知らせるには、

Code listing 4.2
export WANT_AUTOCONF=2.1

とすると良いでしょう。

automake のバージョン 

Gentoo Linux では GNU automake の複数のバージョンを利用可能にするために、 /usr/bin/automake をラッパースクリプトとし、環境変数によって 1.4、1.5、1.6、1.7 の4つの系列を使い分けできるようになっています。

デフォルトでは 1.4 系列の automake を使うようになっているのですが、ソフトウェアによっては他のバージョンの automake を要求するものがあります。 そのようなソフトウェアの ebuild を作成するときは、

Code listing 4.3
export WANT_AUTOMAKE=1.5
// ご想像の通り、値を 1.6 にすれば 1.6 系列の、1.7 にすれば 1.7 系列の automake が利用可能です

などと記述します。もちろん

Code listing 4.4
export WANT_AUTOMAKE=1.4

と、明示的に 1.4 系列を使うことを知らせる事も可能です。

5.その他の Tips

.keep によってディレクトリを保護する 

ebuild 化しようとしているソフトウェアが利用できる形にしておくため、空のディレクトリを作成しておきたい場合があります。 これはソフトウェア側の Makefile などで作成される場合もあれば ebuild 側で作成しておく場合もあります。 しかしながら、空のディレクトリは clean 動作のときに勝手に削除されてしまうことがあり、本当に空のディレクトリを作成しておくだけでは不十分です。

そのような場合に対応するため、.keep というファイルを該当ディレクトリに作成しておくことによってディレクトリを保護することができます。 またそのための関数も用意してあり、dodir と同じ書式で利用することができます。

Code listing 5.1
keepdir <ディレクトリ>...
Copyright© 2002-2004 Gentoo Linux Users Group Japan. ご質問、ご意見などはこちらまで。 Email www@gentoo.gr.jp.