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搜索开源包

猜你喜欢

转载自blog.csdn.net/robothj/article/details/84062442
今日推荐