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內核有升級補丁

  • 參考鏈接

    Homebridge on LEDE/OpenWRT routers

    從0開始的Homekit試玩

    自制 HomeKit 兼容 LED 燈條和溫溼計

    路由器就是開發板

  • 總結

    • 固件編譯起來非常費時間,一旦出現依賴庫不兼容的問題很難解決,建議make menuconfig增添了某項功能編譯通過後,打包成壓縮包,然後再去添另外的功能,一旦編譯錯誤無法解決還可以回滾,如果利用git工具應該會更方便
    • 學會看編譯錯誤結果,硬着頭皮先去分析錯誤,通過google去解決,不要被大量的log嚇到
    • 學會使用github搜索開源包
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章