Portage Overlayとebuildの作り方

投稿者: | 2013年9月16日

15日にPortage Overlayを作って公開してみたので作り方をメモしておきます。

実際にOverlayを作ってみたところ、最低限作らなければならないファイルは、metadata/layout.conf、profiles/repo_nameとlaymanでオーバーレイを追加するためのXMLの3つみたいでした。自分はオーバーレイ追加用XMLの名前はoverlay.xmlにしたので、この記事ではoverlay.xmlと呼ぶことにします。

まず、今回はgitリポジトリ上にOverlayを作成するので適当な場所でgit initしてリポジトリを作成します。

リポジトリを作成したらその中にmetadataディレクトリ、profilesディレクトリを作成します。ディレクトリを作成したらmetadata/layout.confを作成し、masters = gentooと書いておきます。よくわからないけれど、こう書いて置かないといけないみたいです。layout.confを作成したらprofiles/repo_nameも作成してOverlayの名前を書いておきます。layout.confとrepo_nameは書いて置かないとemerge時等に警告みたいなのが出てきます。

overlay.xmlはこんな感じのことを書けばいいと思います。

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE repositories SYSTEM "/dtd/repositories.dtd">
<repositories xmlns="" version="1.0">
    <repo quality="experimental" status="unofficial">
        <name><![CDATA[オーバレイ名]]></name>
        <description lang="en"><![CDATA[オーバーレイの説明]]></description>
        <homepage>オーバーレイのURL</homepage>
        <owner type="person">
            <email>オーバレイ作成者のメールアドレス</email>
            <name><![CDATA[オーバレイ作成者の名前]]></name>
        </owner>
        <source type="git">リポジトリclone用のURL</source>
    </repo>
</repositories>

metadata/layout.conf, profiles/repo_name, overlay.xmlが用意できたらebuildを作成します。

ebuildは/usr/portageと同じようにcategory/packageの形式でリポジトリ上にディレクトリを作成しその下に作成します。app-officeカテゴリの中のlibreoffice-binであれば、app-office/libreoffice-binディレクトリを作成してapp-office/libreoffice-binの中にebuildを配置します。

ebuildの名前はpackage-version[-revision].ebuildの形式で付けます。libreoffice-binのバージョン4.1.1.2であればlibreoffice-bin-4.1.1.2.ebuildで、app-office/libreoffice-bin/libreoffice-bin-4.1.1.2.ebuildにebuildを作成します。revisionはインストール対象のソフトウェアのバージョンは変わっていないけれどebuildの内容を変更した時に-r1,-r2などを付けることでebuildに更新があったことを示します。例えば、LibreOfficeの4.1.1.2のebuildを作成した後ebuild中に不備があることに気づき、それを修正した場合libreoffice-bin-4.1.1.2-r1.ebuildのような名前でebuildを作成することでebuildが更新されたことがわかるようにします。

ファイル名を決めたらebuildを作成します。Gentooでvimを使ってる場合は*.ebuildを作成しようとするとたぶんebuildのテンプレートが初めから書かれています。他のエディタを使っていたり、テンプレートが表示されない場合は/usr/portage/skel.ebuildを元にebuildを書くといいと思います。

テンプレートを元にebuildを書く場合、最初から書かれている変数で最低限何か書く必要があるのはKEYWORDSとSRC_URIくらいだと思います。KEYWORDSにはこのebuildを使用出来るアーキテクチャを書いておき、SRC_URIにはソースのダウンロードURLを書いておきます。複数のソースをダウンロードする必要がある場合は半角スペースで区切ればいいみたいです。USEフラグや依存関係なども記述できますが、今回自分には必要なかったのでどのように記述すればいいのか今のところわかりません。今後必要になった時に書き方についてまた記事を書こうと思います。

変数を設定したら、src_unpack()を書きます。src_unpackの中でunpack ${A}とするとSRC_URIで設定したファイルを展開出来ます。必要であればここでパッチなども適用するみたいです。

src_unpack()を書いたらコンパイルが必要なソフトウェアではsrc_compile()を書くのですが、今回自分が書いたebuildでは必要なかったのでsrc_install()を書きます。Portageでは一度${D}(デフォルトでは$PORTAGE_TMPDIR/category/package/imageらしい)のディレクトリにコピーしたファイルが実際のシステムにインストールされる仕組みになっているので、この関数ではemergeしたときシステムにインストールするファイルを${D}にコピーするコードを書きます。

ebuildが書けたらebuild *.ebuild digestでManifestを生成します。Manifestにはebuild本体とSRC_URIに書かれているファイルのハッシュ値が書かれているみたいです。ebuildのハッシュ値が書かれていることからわかるように、digest以外のコマンドを行うときはebuildのハッシュ値がManifestに書かれているハッシュ値と異なっていないか確認してから処理を行い、違っていたらエラーを出して終了してしまうので、ebuildの作成中はebuildの編集後digestコマンドでManifestを生成してからunpackやinstallなどのコマンドを試すようにします。また、digestコマンドは一般ユーザでも実行出来ますが、unpack, installなどのコマンドはrootになるかportageグループに入ってないと実行できないようです。

Manifestを生成したらebuild *.ebuild unpackでソースを展開してみます。うまくいけば次に進み、うまくいかなければebuildを見直します。前の段落にも書きましたが、ebuildを書き換えたときはManifestを生成しなおします。また、unpackコマンド実行時に$PORTAGE_TMPDIR/portage/category/package-version/.unpackedが作成されるのですが、それがあると一度実行したとみなされてもう一度unpackコマンドを実行しても処理が行われないので、.unpackedを消してからunpackコマンドをやり直します。自分はめんどくさかったし他のディレクトリもなかったので.unpackedではなく$PORTAGE_TMPDIR/portage/categoryごと消してました。

unpackができたらebuild *.ebuild installでインストールを試します。インストールと言っても、ここではあくまでsrc_install()に書かれたファイルを${D}のディレクトリにコピーするという動作が行われるだけで実際のシステムにインストールされることはありません。${D}にインストール対象のファイルがコピーされていることを確認してちゃんとコピーされていればebuildは完成です。

あとはリポジトリをpushして/etc/layman/layman.cfgのoverlaysにoverlay.xmlへのURLを追記してlayman -a (overlay.xmlに書いたオーバレイ名)することでOverlayが使えるようになると思います。

ebuild中の変数の説明などはここを見るとこの記事に書かれていないものも含め色々と載っているので見てみるといいかもしれません。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です