为什么想起要把Node.js编译进WRTNode呢,因为最近接触到一个自认为比较好的开源的物联网服务器平台——Coolpy,利用Node.js写成,它的移植性比较高,可以在很多平台上使用,所以我试着把它编译进WRTNode里面哈
我搜索了一些教程,但是在自己动手过程肯定要遇到一些问题,分享给大家
这里我们需要一些为Openwrt系统编译模块的知识
make menuconfig的时候把“build the openwrt SDK toolchain”选中,因为后面编译模块是需要的
为模块node新建一个文件夹,路径为../wrtnode/package/node
然后,我们为加进模块写makefile,内容如下:
=================================
#
# Copyright (C) 2006-2011 OpenWrt.org
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more informa
tion.
#
include $(TOPDIR)/rules.mk
PKG_NAME:=node
#node的版本
PKG_VERSION:=v0.10.28
PKG_RELEASE:=2
PKG_SOURCE:=node-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=http://nodejs.org/dist/${PKG_VERSION}
#更改版本时也要修改
PKG_MD5SUM:=87768be7065d2120e71619948ab4bb2d
GYP_DEFINES:=v8_use_mips_abi_hardfloat=false v8_can_use_fpu_instructions=false
LIBS:=-I$(TOOLCHAIN_DIR)/
mipsel-openwrt-linux-uclibc/include/c++/4.8.3/ -I$(TOOLCHAIN_DIR)/
mipsel-openwrt-linux-uclibc/include/c++/4.8.3/
mipsel-openwrt-linux-uclibc/
include $(INCLUDE_DIR)/package.mk
define Package/node
DEPENDS:=+libpthread +librt +uclibcxx
SECTION:=lang
CATEGORY:=Languages
TITLE:=Node.js is a platform built on Chrome's JavaScript runtime
URL:=http://nodejs.org/
endef
define Package/node/description
Node.js is a platform built on Chrome's JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices.
endef
define Build/Prepare
$(call Build/Prepare/Default)
$(CP) node.patch $(PKG_BUILD_DIR)/
(cd $(PKG_BUILD_DIR);
patch -p1 < node.patch;
);
endef
define Build/Configure
(cd $(PKG_BUILD_DIR);
export LIBS="$(LIBS)";
export CFLAGS="$(TARGET_CFLAGS) $(LIBS)";
export CXXFLAGS="$(TARGET_CXXFLAGS) $(LIBS)";
export GYPFLAGS="$(GYPFLAGS)";
./configure --dest-cpu=
mipsel--dest-os=linux --without-ssl --without-snapshot --with-
ARM-float-abi=soft;
);
endef
define Build/Compile
$(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR) GYP_DEFINES="$(GYP_DEFINES)" CC="$(TARGET_CC)" CXX="$(TARGET_CXX)" CFLAGS="$(TARGET_CFLAGS) $(LIBS)" CXXFLAGS="$(TARGET_CXXFLAGS) $(LIBS) -nostdinc++" LDFLAGS="$(TARGET_LDFLAGS) -nodefaultlibs -luClibc++ -lc -lgcc -lgcc_s -lpthread" || touch $(PKG_BUILD_DIR)/deps/v8/build/common.gypi
$(MAKE) $(PKG_JOBS) -C $(PKG_BUILD_DIR) GYP_DEFINES="$(GYP_DEFINES)" CC="$(TARGET_CC)" CXX="$(TARGET_CXX)" CFLAGS="$(TARGET_CFLAGS) $(LIBS)" CXXFLAGS="$(TARGET_CXXFLAGS) $(LIBS) -nostdinc++" LDFLAGS="$(TARGET_LDFLAGS) -nodefaultlibs -luClibc++ -lc -lgcc -lgcc_s -lpthread"
endef
define Package/node/install
mkdir -p $(1)/usr/bin
$(CP) $(PKG_BUILD_DIR)/out/Release/node $(1)/usr/bin/
ln -s /usr/bin/node $(1)/usr/bin/nodejs
endef
$(eval $(call BuildPackage,node))
===============================
1.编译不同版本的node,只要改动版本号和对应的MD5值就行,我们可以人工下载下来,用软件生成MD5值
2.此makefile大概分为几部分:为openwrt的加node选项;node模块的配置;node模块的编译(这也是为什么要选中编译编译工具的原因,当然也可以直接下载编译链工具);node模块的安装
3.我本来想编译最新版的node,但是似乎这个脚本不支持最新的,只支持v0.10.xx的版本
4.这个makefile本来是为Arduino YUN(基于AR9331)写的,因为WRTNode是MTK的MT7688,所以有所不同
a.如果是RT5350,MT7688的CPU,里面有几处的mipsel
b.如果是ar71xx的CPU要把里面的几处mipsel(标记为红色)替换成mips
c.如果是arm的CPU要把里面的几处mipsel(标记为红色)替换成arm
5.在编译的时候要下载源码包,有时候经常断,所以我们可以帮一把,把需要的源码包放在dl路径下,以加快速度~
写好makefile后,我们会在配置界面的language选项下面见到“node”的选项,“y”选中,为“*”状态
然后就是编译啦,祈祷不要出错啊~
编译完成后,找wrtnode/bin/ramips/packages目录下是否有生成的包
然而并没有,把我呆住了……
在wrtnode/bin/ramips/packages/base目录下找到需要的东西了
此时固件的大小已经从以前的3.5M到现在的4.8M了
同时我们要把编译后安装要用到的ipk包拷贝出来备用
uclibcxx_0.2.4-1_
ramips_24kec.ipk
node_v0.10.28-2_
ramips_24kec.ipk
后面我们会在WRTNode上面跑一下Coolpy服务器平台,看看
0