Gentoo Linux 開発者 Tips
|
Author, Editor
:
渡邊 集
Updated 17 Oct 2003 |
開発者 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
|
などと記述します。もちろん
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 <ディレクトリ>...
|
|