LoginSignup
0
0

More than 5 years have passed since last update.

OpenWrtで既存パッケージを再ビルドする

Last updated at Posted at 2016-02-08

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ディレクトリ以下に配置する必要があります。依存先も更に依存パッケージがあったりするので、大物パッケージだとなかなか大変そうです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0