openwrt之原始碼編譯node
-
openwrt原始碼檔案目錄說明
- tools和toolchain:包含一些通用命令, 用來生成韌體, 編譯器, 和C庫
- build_dir/host:臨時目錄, 用來儲存不依賴於目標平臺的工具
- build_dir/toolchain:儲存依賴於指定平臺的編譯鏈
- build_dir/target:儲存依賴於指定平臺的軟體包的編譯檔案, 其中包括linux核心, u-boot, packages
- staging_dir:編譯目標的最終安裝位置, 其中包括rootfs, package, toolchain
- package:軟體包的下載編譯規則, 在OpenWrt韌體中, 幾乎所有東西都是.ipk
- target:目標系統指嵌入式裝置, 針對不同的平臺有不同的特性, 針對這些特性, "target/linux"目錄下按照平臺進行目錄劃分, 裡面包括了針對標準核心的補丁, 特殊配置等
- bin:編譯完OpenWrt的二進位制檔案生成目錄, 其中包括sdk, uImage, u-boot, dts, rootfs構建一個嵌入式系統完整的二進位制檔案
- config:存放著整個系統的的配置檔案
- docs:裡面不斷包含了整個宿主機的檔案原始碼的介紹, 裡面還有Makefile為目標系統生成docs
- include:裡面包括了整個系統的編譯需要的標頭檔案, 但是是以Make進行連線的
- feeds:擴充套件軟體包索引目錄
- feeds/packages:為執行./scripts/feeds install 之後的package
- scripts:組織編譯整個OpenWrt的規則
- tmp:編譯資料夾, 一般情況為空
- dl:所有軟體的下載目錄, 包括u-boot, kernel
- logs:如果編譯出錯, 可以在這裡找到編譯出錯的log
-
三種方法編譯openwrt定製韌體
make menuconfig時選擇
-
Build the OpenWrt Image Builder
-
Build the OpenWrt SDK
-
Build the OpenWrt based Toolchain
make後會在bin目錄下生成ImageBuilder,Toolchain和SDK工具包
-
用ImageBuilder編譯,用於靈活選擇package。畢竟壓縮的只讀檔案系統squashfs比可寫的JFFS能省不少地方,可以用來把玩更多的package
-
用SDK編譯,用於編譯package倉庫中沒有的軟體包,另外其中有配套的核心原始碼及標頭檔案,編譯缺失的核心模組也很方便
-
從原始碼編譯,因為要重新編譯cross-compile toolchians,下載核心和軟體包的原始碼編譯,導致這個過程比較耗時,用於上述兩種情況搞不定的情況
openwrt只編譯某一項示例:
# In ar71xx platform as an example tar xjf OpenWrt-SDK-ar71xx-for-linux-x86_64-gcc-4.8-linaro_uClibc-0.9.33.2.tar.bz2 cd OpenWrt-SDK-ar71xx-* # Create package directories mkdir package/utils # Clone Makefile git clone https://github.com/qianguozheng/nodejs-openwrt4 package/utils/nodejs5 # Select the package to be compiled Utilities -> nodejs # also chose any advanced options for compilation make menuconfig # Compile Package make package/nodejs5/{clean,compile} V=99
-
-
openwrt編譯node庫
-
勾選widora的language->node,編譯過程中總是遇到這樣或那樣的錯誤,特別是libuv庫無法編譯通過。而一旦添加了node,便會自動新增libraries->libuv庫(畢竟libuv就是nodejs的核心依賴庫)
-
更新node原始碼包,刪除原有的node包,使用github中原始碼包openwrt-node-packages
該原始碼包雖然指定的平臺版本是
for trunk/openwrt-18.06/lede-17.01
,而widora是15.01
卻依舊能編譯通過,反而其中給定的for15.05原始碼包,其補丁編譯補過不了;該包不需要依賴libuv,因此也不會自動新增libraries->libuv庫,因此能編譯成功 -
注意事項:在嘗試使用mt7688平臺時,按照以上node原始碼安裝說明,並不需要勾選[*] MIPS FPU Emulator選項,但是在實際測試中,沒有勾選這個選項後會出現
Illegal instruction
錯誤,令人百思不得其解。後搜到這篇大神的部落格openwrt 編譯node.js功能(解決Illegal instruction錯誤),試了一下加入 MIPS FPU Emulator選項,問題解決!這篇部落格大神的問題分析思路很是值得學習,小白只會瞎折騰。
-
-
openwrt安裝homebridge
node編譯通過後,將韌體刷入widora,使用npm install -g homebridge時,又出現如下錯誤:
npm ERR! Linux 3.18.29
npm ERR! argv “/usr/bin/node” “/usr/bin/npm” “install” “homebridge”
npm ERR! node v6.14.4
npm ERR! npm v3.10.10
npm ERR! path /root/.npm/homebridge/0.4.45/package.tgz.3471964756
npm ERR! code ENOSPC
npm ERR! errno -28
npm ERR! syscall open
npm ERR! nospc ENOSPC: no space left on device, open ‘/root/.npm/homebridge/0.4.45/package.tgz.3471964756’
npm ERR! nospc This is most likely not a problem with npm itself
npm ERR! nospc and is related to insufficient space on your system.
npm ERR! Linux 3.18.29
npm ERR! argv “/usr/bin/node” “/usr/bin/npm” “install” “homebridge”
npm ERR! node v6.14.4
npm ERR! npm v3.10.10
npm ERR! path npm-debug.log.1631127116
npm ERR! code ENOSPC
npm ERR! errno -28
npm ERR! syscall open
npm ERR! nospc ENOSPC: no space left on device, open ‘npm-debug.log.1631127116’
npm ERR! nospc This is most likely not a problem with npm itself
npm ERR! nospc and is related to insufficient space on your system.
npm ERR! Please include the following file with any support request:
npm ERR! /root/npm-debug.log-
看這bug估計是核心版本太低支援不了這麼高版本的node以及安裝所需空間不夠,只能強行在pc上連homebridge一起編譯
-
編譯homebridge時,建議勾選的其他項:node + node-npm libavahi-compat-libdnssd + network->mosquitto
-
設定開機執行
chmod +x /etc/init.d/homebridge /etc/init.d/homebridge enable /etc/init.d/homebridge start
-
-
openwrt在Ubuntu與Mac環境下原始碼編譯的差異
在MacOS上更容易爆出Bug,一般都是各種包不相容的錯誤,而Ubuntu的相容性非常好,因此強烈建議Ubuntu環境;在Mac上只能編譯出node以及node-npm,無法編譯homebridge,在Mac上折騰一週後,換Ubuntu一晚上就編譯好了;在編譯過程中的log中可以看出對linux核心有升級補丁
-
參考連結
-
總結
- 韌體編譯起來非常費時間,一旦出現依賴庫不相容的問題很難解決,建議make menuconfig增添了某項功能編譯通過後,打包成壓縮包,然後再去添另外的功能,一旦編譯錯誤無法解決還可以回滾,如果利用git工具應該會更方便
- 學會看編譯錯誤結果,硬著頭皮先去分析錯誤,通過google去解決,不要被大量的log嚇到
- 學會使用github搜尋開源包