1. 程式人生 > >openwrt之原始碼編譯node

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搜尋開源包