OpenWrtでipkパッケージを自前ビルドする際の手順を紹介します。
OpenWrt Wikiの「Using the SDK」とほぼ重複する内容です。
OpenWrt SDKの準備
OpenWrt SDKというのはOpenWrt用クロスコンパイル環境一式のことです。自分でビルドすることもできますが、Linux環境であればビルド済みのOpenWrt SDKを拾ってきて展開するのが一番ラクでしょう。
OpenWrt SDKのパッケージはバージョンごと・アーキテクチャごとに提供されています。たとえば、15.05のar71xx用のOpenWrt SDKは次のURLからダウンロードできます。
これを展開するとipkファイルのビルド環境が手に入ります。
$ cd $HOME/work
$ wget https://downloads.openwrt.org/chaos_calmer/15.05/ar71xx/generic/OpenWrt-SDK-15.05-ar71xx-generic_gcc-4.8-linaro_uClibc-0.9.33.2.Linux-x86_64.tar.bz2
$ tar xvjf OpenWrt-SDK-15.05-ar71xx-generic_gcc-4.8-linaro_uClibc-0.9.33.2.Linux-x86_64.tar.bz2
ソースコードしか提供されていないパッケージを自前ビルドする
OpenWrt 15.05になって、メンテナ不在のためバイナリ提供されなくなったパッケージがチラホラあるようです。しかし、実はそうしたパッケージでもソースコードは残っていて、簡単にビルドできたりします。今回は15.05からバイナリ提供されなくなったnetstat-natを自前ビルドしてみましょう。
$ cd $HOME/work
$ git clone git://git.openwrt.org/packages.git openwrt-trunk-packages
$ cd OpenWrt-SDK-15.05-ar71xx-generic_gcc-4.8-linaro_uClibc-0.9.33.2.Linux-x86_64/package
$ ln -sn ../../openwrt-trunk-packages/net/netstat-nat
$ cd ..
$ make package/netstat-nat/{clean,compile} V=s
packagesリポジトリのtrunkを取得した上で、必要なディレクトリだけをSDKのpackageディレクトリ以下にシンボリックリンクしてmake package/[パッケージ名]/{clean,compile}
すればビルドが走ります。
バイナリパッケージはbin/ar71xx/packages/base/netstat-nat_1.4.10-1_ar71xx.ipk
のような場所に作られます。
標準インストールされているパッケージを再ビルドする
第二の例として、dnsmasqを自前ビルドしてみましょう。dnsmasqはpackagesリポジトリではなく本体リポジトリで管理されていますが、それ以外はnetstat-natと変わりません。
$ cd $HOME/work
$ git clone git://git.openwrt.org/openwrt.git openwrt-trunk
$ cd OpenWrt-SDK-15.05-ar71xx-generic_gcc-4.8-linaro_uClibc-0.9.33.2.Linux-x86_64/package
$ ln -snf ../../openwrt-trunk/package/network/services/dnsmasq ./
上記のように、本体リポジトリの適切な場所からSDKのpackageディレクトリにシンボリックリンクを作ります。このあと先ほどと同様にmake
すればパッケージが作られるはずですが、その前に依存関係を確認しておきましょう。
$ grep -C2 DEPENDS dnsmasq/Makefile
PKG_INSTALL:=1
PKG_BUILD_PARALLEL:=1
PKG_CONFIG_DEPENDS:=CONFIG_PACKAGE_dnsmasq_$(BUILD_VARIANT)_dhcpv6 \
CONFIG_PACKAGE_dnsmasq_$(BUILD_VARIANT)_dnssec \
CONFIG_PACKAGE_dnsmasq_$(BUILD_VARIANT)_auth \
--
$(call Package/dnsmasq/Default)
TITLE += (with DHCPv6 support)
DEPENDS:=@IPV6
VARIANT:=dhcpv6
endef
--
$(call Package/dnsmasq/Default)
TITLE += (with DNSSEC, DHCPv6, Auth DNS, IPset enabled by default)
DEPENDS:=+PACKAGE_dnsmasq_full_dnssec:libnettle \
+PACKAGE_dnsmasq_full_ipset:kmod-ipt-ipset
VARIANT:=full
依存パッケージがある場合はDEPENDS:=
以下に書かれているので、ビルド前に毎回調べる必要があります。
上記のgrep結果を見ると、PACKAGE_dnsmasq_full_dnssec
を作るためにはlibnettleパッケージが、PACKAGE_dnsmasq_full_ipset
を作るためにはkmod-ipt-ipsetパッケージがそれぞれ必要だとわかります。このように依存関係がある場合、それらのパッケージもpackageディレクトリ以下に配置する必要があります。依存先も更に依存パッケージがあったりするので、大物パッケージだとなかなか大変そうです。