前に書いたMXEのメモの続き。
MXEが用意しているレシピ、ディストロが配布しているビルド済みパッケージだけだと足りなくなった時のために、自分でMXEのレシピを書いてみた。ざっくりとだが調べたことや書いた事のメモを書いておく。
準備
MXEのGitリポジトリをクローンしてくる。
git clone https://github.com/mxe/mxe.git
cd mxe
レシピのビルドに必要なパッケージは場合によりけりなので、必要なら都度インストールする事にする。(多分MXEにレシピにそこ含めて書く方法があると思うが、今回は割愛)
今回書いたレシピ
とりあえず簡単に書けそうだったのでLV2のレシピを書いてみた。
MXEのレシピは、src配下の.mkファイル群として存在しているので、今回の例ではsrc/lv2.mkを作成した。
PKG := lv2
$(PKG)_WEBSITE := http://lv2plug.in/
$(PKG)_IGNORE :=
$(PKG)_VERSION := 1.18.2
$(PKG)_CHECKSUM := 4e891fbc744c05855beb5dfa82e822b14917dd66e98f82b8230dbd1c7ab2e05e
$(PKG)_SUBDIR := $(PKG)-$($(PKG)_VERSION)
$(PKG)_FILE := $(PKG)-$($(PKG)_VERSION).tar.bz2
$(PKG)_URL := $($PKG)_WEBSITE)/spec/$($(PKG)_FILE)
$(PKG)_DEPS := gcc
define $(PKG)_UPDATE
echo $($(PKG)_VERSION)
endef
define $(PKG)_BUILD
cd '$(SOURCE_DIR)' && ./waf configure --prefix=$(PREFIX)/$(TARGET) && ./waf && ./waf install
endef
レシピの解説
レシピファイルは主に以下のセクションからなっているようだ。
- パッケージ情報
- アップデート確認
- ビルド
パッケージ情報セクション
PKG
: パッケージ名。make <パッケージ名>でレシピをビルドする。$(PKG)_WEBSITE
: パッケージのウェブサイト。$(PKG)_IGNORE
: 後述の$(PKG)_UPDATE
で無視されるバージョンを列挙するらしい。$(PKG)_VERSION
: パッケージのバージョン$(PKG)_CHECKSUM
: パッケージのsha256チェックサム。$(PKG)_SUBDIR
:$(PKG)_URL
内部(アーカイブ展開後の事?)のサブディレクトリらしい。$(PKG)_FILE
: ソースコードのアーカイブファイル名。$(PKG)_URL
: アーカイブファイルのURL。ビルド時にこのファイルがダウンロードされる。$(PKG)_DEPS
: 依存しているレシピ。
アップデート確認セクション
define $(PKG)_UPDATE
~endef
の中に記述する。
上記のサンプルでは固定値を返しているが、他のレシピを見るとダウンロードページをスクレイピングしてパッケージバージョンを切り出し、アップデートがあるかどうかを確認しているようだ。
ビルドセクション
define $(PKG)_BUILD
~ebdef
の間にビルド手順を書いていく。いつものconfigureしてからmakeというレシピもあれば、もっと複雑なレシピもある。
ビルドセクションでは色々なマクロが使えるが、以下はその一例。
- $(SOURCE_DIR): ソースコードの展開先。
- $(PREFIX): usrディレクトリ。
- $(TARGET): x86_64-w64-mingw32.sharedなどビルドのターゲット。
通常は$(PREFIX)/$(TARGET)
がインストール先のディレクトリなので、上記の例ではスースコードの展開先に移動した後、waf configureでインストール先ディレクトリをprefixに指定し、ビルドとインストールをそのまま行っている。
ビルドとその結果
settings.mkでビルドのターゲットを指定できる。今回はWindows向けのクロスコンパイル環境が欲しいので、settings.mkに下記の記述を追加する。
MXE_TARGETS := x86_64-w64-mingw32.static x86_64-w64-mingw32.shared
後はmake lv2
を実行すれば、usr/配下にパッケージがビルドされる。