(轉自:http://blog.chinaunix.net/uid-27057175-id-5793181.html)
uci配置管理和ubus通信框架是openwrt系統上非常好的輕量級服務。
以至於,在非openwrt系統上都想用它們來搞事情。
而它們又都是cmake來自動編譯的。
這裏記錄下HOWTO。
sourouce ${你的交叉環境變量}
CC=${CROSS}gcc
CXX=${CROSS}g++
0.先搞定libubox依賴的libjson-c
./autogen.sh # newly configure
install_dir="`pwd`/target_install/"
LIBS=" -ldl "
./configure --build=`sh config.guess` --host=arm-oe-linux-gnueabi --target=arm-oe-linux-gnueabi --prefix="$install_dir"
make clean
make V=s
make install
1. libubox
git clone git://nbd.name/luci2/libubox.git
cmake -DBUILD_LUA=off -DCMAKE_INSTALL_PREFIX=${PWD}/target_install -DCMAKE_SYSTEM_NAME=Linux -DCMAKE_SYSTEM_PROCESSOR=arm
cmake -DCMAKE_C_FLAGS:STRING="$CFLAGS $CPPFLAGS $LDFLAGS $LIBS" --debug-output --trace
# 依賴json-c.so 路徑錯誤,不得其解,沒搞清楚 cmake 自動補上的 LDFLAGS 總是包含 /usr/local/lib 路徑
# 這裏給顯式指定 target json-c.so 的絕對路徑。
# cmake 傳入的所有定義見於CMakeCache.txt
cmake -Djson:FILEPATH="${你的交叉編譯庫路徑}/usr/lib/libjson-c.so"
make V=s
make install
2. uci + libuci.so
git clone git://nbd.name/uci.git
cmake -DBUILD_LUA=off -DCMAKE_INSTALL_PREFIX=${PWD}/target_install -DCMAKE_SYSTEM_NAME=Linux -DCMAKE_SYSTEM_PROCESSOR=arm
cmake -DCMAKE_C_FLAGS:STRING="$CFLAGS $CPPFLAGS $LDFLAGS $LIBS" --debug-output --trace
make V=s
make install
3. ubus + ubusd + libubus.so
git clone git://nbd.name/luci2/ubus.git
cmake -DBUILD_LUA=off -DENABLE_SYSTEMD=off -DCMAKE_INSTALL_PREFIX=${PWD}/target_install -DCMAKE_SYSTEM_NAME=Linux -DCMAKE_SYSTEM_PROCESSOR=arm --debug-output --trace
cmake -DCMAKE_C_FLAGS:STRING="$CFLAGS $CPPFLAGS $LDFLAGS $LIBS" --debug-output --trace
# 同樣 指定json-c.so絕對路徑
make V=s
make install
注意:
ubus可用於兩個進程之間的通信,並以json格式進行數據交互。ubus的常見場景爲:
-
“客戶端-服務器”形式的交互,即進程A註冊一系列的服務,進程B去調用這些服務;
-
ubus支持以“訂閱-通知”的方式進行進程通信,即進程A提供訂閱服務,其它進程可以選擇訂閱或退訂該服務,進程A可以向所有訂閱者發送消息。
由於ubus實現方式的限制,在一些場景中不適宜使用ubus:
-
ubus用於少量數據的傳輸,如果數據量很大或是數據交互很頻繁,則不宜用ubus,當ubus一次傳輸數據量超過60KB,就不能正常工作了;
-
ubus對多線程支持的不好,例如在多個線程中去請求同一個服務,就有可能出現不可預知的結果;
-
不建議遞歸調用ubus,例如進程A去調用進程B的服務,而B的該服務需要調用進程C的服務,之後C將結果返回給B,然後B將結果返回給A。