-
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搜索開源包
openwrt之源碼編譯node
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.