因為 project 需要, 要將 IPOP 的 controller 以 C 重寫過跑在 OpenWRT 上. 但 configure IPOP 要通過 socket 有延遲問題, 狀態的通知也是通過 socket, 直接使用會有一定的複雜度, 所以給上層使用的界面能被簡化的話是再好不過的.
幸運的是, OpenWRT 上己經有了完整的支持機制!
libubox 是 OpenWRT project 中的 message loop 機制, 在 Linux 上以 epoll 等待 event.
ubus 是 OpenWRT project 上類似 dbus 的 message bus, 輕量, 提供 C programmer friendly APIs.
不過很可惜的是 Debian 上沒有 pre-built binary, 只好自行從 source code 開始 build.
首先, download source code
$ git clone git://git.openwrt.org/project/libubox.git
$ git clone git://git.openwrt.org/project/ubus.git
兩個 project 都是使用 cmake build, 並使用到 json, 裝上相依
$ apt-get install cmake libjson-c-dev pkg-config
將下來, build & install libubox.
$ mkdir libubox_build && cd libubox_build
$ cmake -DCMAKE_INSTALL_PREFIX=/usr -DBUILD_LUA=off ../libubox
$ make -j4
# sudo make install
接下來 build ubus
$ cd ..
$ mkdir ubus_build && cd ubus_build
$ cmake -DCMAKE_INSTALL_PREFIX=/usr -DBUILD_LUA=OFF ../ubus
$ make -j4
$ sudo make install
-DCMAKE_INSTALL_PREFIX=/usr
告訴 cmake 安裝檔案時路徑加上 /usr
做為 prefix.
-DBUILD_LUA=OFF
則是關掉兩者對 lua 的 support, 因為是以 C 開發, 所以用不到這塊.
最後, 要注意的是, 我的開發環境是以 systemd-nspawn 跟桌面環境隔離的, 所以很直接的就以 make install
將檔案裝到系統中了. 如果不想讓系統亂七八糟沒法管理, 可以將這些檔案集中放置到一個目錄下, 並以 -I
及 -L
告知 compiler & linker 去哪找 headers 及 libraries, 安裝指令修改如下
$ make DESTDIR=$HOME/Local install
路徑請自行修改.