読者です 読者をやめる 読者になる 読者になる

解き放たれしソフトウェア

GNU/LinuxなどFLOSSについて書いてみるつもり

【Gentoo】ebuild ファイルを書いてみる 第2回

Gentoo Linux フォント ebuild

前回の記事の続きです。

gnu.hatenablog.com

前回は ebuild ファイルの名称について説明しました。 media-fonts/kazesawa/kazesawa-2015.12.18.ebuild

ようやく内容についてです。

ebuild のマニュアルは、 man 5 ebuild です。 なお、ebuild の書きかたの例は、メインリポジトリPortageツリー)の .skel.ebuildというファイルに詳しく(詳しすぎて難解なほどに)書いてあります。

また、「Gentoo Development Guide: Master Index」(※in English)が必携の手順書です。このマニュアルは、app-doc/devmanual をインストールすることにより、インターネット経由ではなくローカル(/usr/share/doc/devmanual内)でも読めるようになります。

ヘッダ

# Copyright 1999-2015 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Id$

いわゆる著作権表示で、ライセンスが GPLGNU ジェネラル・パブリック・ライセンス)*1のバージョン2であることが表示され、3行目は単に管理用に遣われている部分*2です。

このヘッダ部分は単に引き写すだけですが、来年になったら 1999-2016 になるように、年度のところは換わる点だけは気をつけます。

この後しばらくは、いわゆる変数(variable=可変値)の指定が続きます。

EAPI

EAPI=5

${EAPI}*3 のバージョンによって、有効になる機能が異なります。 詳しくは「Gentoo Development Guide: EAPI Usage and Description」(英語)に書いてあります。

通常は、5を奨めます。 4以前の機能は少なくて不便なことがありますし、そのため冗長に書かないといけない場面が出てきます。

また、6の内容が既に決まりましたので近い将来に6がつかわれ始めるはずですが、最新であるほど良いというわけでもなく、しばらく様子をみたほうがよいと思われます。

eclass の呼び出し

inherit font

eclass というのは、 ebuild の機能を拡張するライブラリ、いわばプラグインのようなものです。 「Gentoo Development Guide: Using Eclasses」参照(もちろんエイゴ)。

eclass の本体ファイル群は、メインリポジトリeclass のディレクトリの中に入っています。

各 eclass の説明は「Gentoo Development Guide: Eclass Reference」にもありますし、同様の内容を app-portage/eclass-manpages をインストールすることで man でも読めるようになります。

また高度なことを言えば、もし特別な eclass をつくりたければ、自作のリポジトリにも eclass ディレクトリをつくって置けばよいのです。しかし当然ながら、自作のリポジトリ(およびそれを「親」にするリポジトリ)からしか呼び出せません。

さて、今回は、 font.eclass を呼び出します。 この eclass は、フォント用の ebuild を書くのに便利な機能を提供する eclass です。 「Gentoo Development Guide: font.eclass」(川島ではなくエイゴ)

DESCRIPTION

DESCRIPTION="Kazesawa Font: M+ with Source Sans Pro"

パッケージの短い(概ね1行以内に収まる)説明です。 今回は、ウェブサイトの記載をコピーしました。

HOMEPAGE

HOMEPAGE="https://kazesawa.github.io/"

そのソフトウェアパッケージのウェブサイトのホームページURIを書きます。

SRC_URI

SRC_URI="https://github.com/${PN}/${PN}/releases/download/alpha-v1/${PN}.zip
    -> ${P}.zip"

ダウンロードすべき(一般的には)アーカイブファイルの URI を記載します。 ここで指定したファイルは ${DISTDIR}(デフォルトでは/usr/portage/distfiles)に保存されます(意図的に消さないかぎり、再インストールに備えて保存され続けます。削除するツールについては 「【Gentoo】インストールすべき必携ツール:gentoolkit、portage-utils、eix - 解き放たれしソフトウェア」 参照)。

ここでは ${PN}${P} を利用していますが、${PN} にはパッケージ名(kazesawa)、${P} にはパッケージ名-バージョン(kazesawa-2015.12.18)が自動的に格納されていますので、これらを利用しています。

また、 -> によって、保存するファイル名の指定が可能です。 kazesawa.zipというファイル名で保存してしまうと今後のバージョンアップの際にファイルが conflict してしまうので、バージョン番号を付加して保存することにしました。

今回のように「変数」の間で途中改行が入っても、改行は SPACE や TAB と同様の区切り文字であって、多くの場合には支障が出ません(だからもちろん、文字列の途中でぶった切ってはいけません)。 1行が長すぎないように、可能ならば適宜改行を入れます。

もう1点、インデントについてです。 ebuild ファイル内のインデントでは、(SPACEではなく)TAB文字を用いることに決められています。このタブは4文字分の幅で表示する設定にすることも前提にされています。この記事では、はてなブログの仕様により SPACE で表示されているかもしれませんが。

LICENSE

LICENSE="OFL-1.1"

kazesawaのライセンスは、 SIL Open Font License 1.1 です。

ライセンスの文面は、メインリポジトリlicenses 内に格納されています。 SIL Open Font License 1.1 は、 OFL-1.1 というファイルに相当しますので、これを ${LICENSE} に指定します。

SLOT

SLOT="0"

スロットに関しては以前の記事に書きました。

gnu.hatenablog.com

マルチスロット化が不要なかぎりは、スロット番号は0にします。

KEYWORDS

KEYWORDS="~amd64 ~x86"

キーワードに関しても、以前の記事に書きました。

gnu.hatenablog.com

IUSE

IUSE=""

${IUSE} には、指定可能な USE フラグを列挙します。今回は無しです。

DEPEND

DEPEND="app-arch/unzip"

インストールのときに必要なパッケージを記載します。build-time dependency です。

今回はアーカイブが zip フォーマットなので、 app-arch/unzip を記載しています。

zip と異なり、targz (gzip)、bz2 (bzip2)、xz (xz-utils)は必ずインストールされている(systemセットに入れられている、Gentooシステムの基礎的パッケージである)ので、記載する必要はありません。*4

RDEPEND

RDEPEND=""

そのパッケージをインストール後に使用する際に必要な run-time dependency を記載します。

今回はとりあえず無しで。

なお、${DEPEND}${RDEPEND に記載しなくても、呼び出している eclass が dependency を追加することがよくあります。

S

${S} というのは、原則としては、パッケージのソースコードが展開されるディレクトリ名を指定します。

デフォルトでは S="${WORKDIR}/${P}" です。この${WORKDIR} は、デフォルトでは /var/tmp/portage/${CATEGORY}/${PF}/work です。*5

S=${WORKDIR}

多くのソフトウェアは、${P} に相当するディレクトリをつくったアーカイブで配布される慣行になっています。 それは、例えば tar xfz foo.tar.gz のようにして展開したときに、カレントディレクトリ内にファイルがそのまま展開されずにディレクトリをつくって展開されるようにするためです。

しかし今回は、 GitHub 経由で配布されているアーカイブですが、こうしたディレクトリは無くいきなりファイルが入っています。

そのため、フォントの入っているディレクトリは、${WORKDIR}/${P} ではなく ${WORKDIR} になりますので、 S=${WORKDIR} にしています。*6

RESTRICT

RESTRICT="binchecks mirror strip"

${RESTRICT} には、パッケージマネージャのデフォルトの機能のうち、無効にしたいものがあれば記載します。

今回はフォントイメージそのものをコピーしてインストールするので、バイナリのチェックは不要ですし、バイナリのストリップも不要です。

また、メインリポジトリPortageツリー)に入っているパッケージなどについては原則として、Gentooはそれらのアーカイブをミラーサーバに置いて配布してダウンロードの便宜を図っています。 しかし今回は、メインリポジトリに入っていないソフトウェアの ebuild を自作していますので、ミラーサーバに入っているわけがありませんから、 mirror も RESTRICT します。

font.eclass に必要な変数

以下は、 font.eclass のためのものです。 このように、 eclass を inherit したときに、その eclass に必要ならば、「変数」を定義しないといけません。

FONT_SUFFIX="ttf"
FONT_S=${S}

${FONT_SUFFIX} には、フォントファイルの、いわゆる「拡張子」を指定します。 今回は TrueType Font の ttf です

${FONT_S} は、(実は今回はデフォルトでかまわないのですけれども、)フォントファイルの入っているディレクトリを指定します。 フォントファイルが入れられているのが ${S} の子ディレクトリということもあるから、この「変数」があります。

DOCS

本当は、 ${DOCS} という「変数」も指定可能です。 しかし今回は、面倒なので省きました。

font.eclass はデフォルトで

    # install common docs
    for commondoc in COPYRIGHT README{,.txt} NEWS AUTHORS BUGS ChangeLog FONTLOG.txt; do
            [[ -s ${commondoc} ]] && dodoc ${commondoc}
    done

と書いてあるので、${S} の中にある

  • COPYRIGHT
  • README
  • README.txt
  • NEWS
  • AUTHORS
  • BUGS
  • ChangeLog
  • FONTLOG.txt

があればインストールします*7

${DOCS}は、そのソフトウェアのドキュメントファイルを指定する「変数」で、/usr/share/doc/${PF}以下にインストールされます。

font.eclass の DOCS の罠

ebuild 自体のデフォルト(ただし EAPI が 4 以上)では、 ${DOCS} は array(「配列」)でもかまいません。*8

ebuild 自体のデフォルトは以下のとおりです。

if ! declare -p DOCS &>/dev/null ; then
    local d
    for d in README* ChangeLog AUTHORS NEWS TODO CHANGES \
        THANKS BUGS FAQ CREDITS CHANGELOG ; do
    [[ -s "${d}" ]] && dodoc "${d}"
    done
elif [[ $(declare -p DOCS) == "declare -a "* ]] ; then
    dodoc "${DOCS[@]}"
else
    dodoc ${DOCS}
fi

しかし、 font.eclass は array 不可です。

    [[ -n ${DOCS} ]] && { dodoc ${DOCS} || die "docs installation failed" ; 

dodoc "$DOCS[@]" とは書いてありません。

次回

かなり詳細に説明してしまいましたが、すぐにすべて解る人はもともと Bash などに詳しい人ですので、すべてをいきなり解らなくても少しずつでよいのです。私自身も、UNIX BSD GNU/Linuxと、何年もかけて使ってきましたので。

さて次回は、この ebuild ファイルが動作するか確かめる方法を書く予定です。


この投稿は qiita.com 21日めの記事です。

いよいよ冬至ですが、暖冬です。真冬日が年内にたぶん来るとは思いますが……

*1:Free Software Foundation の公式の訳では「GNU一般公衆ライセンス」とされていますが、「GNU一般公用条件」のような意味だと思います。

*2:Gentoo が Git ではなく CVS だった頃には、 CVS の管理データが挿入されていました。

*3:${name}の表記は、シェルにおける「変数」の表記方法で、変数を呼び出すときに用います。 ebuild ファイルは Bash スクリプトの一部です。

*4:tar.gz は今でも GNU の標準的なアーカイブ方法です。また、Linuxカーネルソースコードは現在は tar.xzで、以前は tar.bz2 で配布されていました。だから、Gentooには必ず要するので、 tar gzip bzip2 xz-utils はすべて必ずインストールされている仕様です。

*5:${CATEGORY}はパッケージの所属するカテゴリ、${PF}は パッケージ名-バージョン-ebuildファイルのリビジョン、です。

*6:変数に変数そのものを格納するときには、シェルは展開しませんので、クオーテーション無しでも支障がありません。

*7:README{,.txt} の { } は、 Bash のブレース展開機能が使用されています。

*8: DOCS=( README AUTHORS ) みたいに書けます。