1. 查看package目录下文件分类
david@david-VirtualBox:~/Documents/openwrt/package$ ls -l total 48 drwxrwxr-x 3 david david 4096 9月 17 01:23 base-files drwxrwxr-x 28 david david 4096 9月 17 01:23 boot drwxrwxr-x 9 david david 4096 9月 17 01:23 devel drwxrwxr-x 6 david david 4096 9月 17 07:12 feeds drwxrwxr-x 16 david david 4096 9月 17 01:23 firmware drwxrwxr-x 27 david david 4096 9月 17 01:23 kernel drwxrwxr-x 46 david david 4096 9月 17 01:23 libs -rw-rw-r-- 1 david david 3787 9月 17 01:23 Makefile drwxrwxr-x 6 david david 4096 9月 17 01:23 network drwxrwxr-x 17 david david 4096 9月 17 01:23 system drwxrwxr-x 30 david david 4096 9月 17 01:23 utils
2. 在当前根目录下新建目录node && 进入node目录
mkdir node && cd node
3. 新建Makefile文件
touch Makefile
4. 编辑Makefile
# # Copyright (C) 2006-2018 OpenWrt.org # # This is free software, licensed under the GNU General Public License v2. # See /LICENSE for more information. #
# Step 1. 引入rules.mk文件 include $(TOPDIR)/rules.mk
# Step 2. 设置PKG变量 PKG_NAME:=node PKG_VERSION:=v8.12.0 # 填写node支持版本号 PKG_RELEASE:=1 PKG_SOURCE:=node-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=http://nodejs.org/dist/${PKG_VERSION} PKG_MD5SUM:=5690333b77964edf81945fc724f6ea85 # 使用md5sum命令计算 GYP_DEFINES:=v8_use_mips_abi_hard float=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/
# 引入头文件 package.mk include $(INCLUDE_DIR)/package.mk
#定义node节点信息 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/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))
5. Makefile解释
预设变量 PKG_* 的项目的主要作用
(1)检测软件包是否被选中。
(2)软件包如果有需要下载的源代码文件,按PKG_SOURCE_URL进行下载。
(3)检测本地dl目录是否包含了源代码文件PKG_SOURCE
(4)如果需要校验源代码,就执行PKG_MD5SUM
(5) 解压缩源代码
预调的变量 | 作用 |
PKG_NAME | 软件包的名称,在菜单选项中将看见,必须与目录名称一致 |
PKG_VERSION | 软件包版本,如果软件包的源代码是在线下载的,版本号要与服务器上的一致 |
PKG_RELEASE | 软件包的Makefile版本,自己编 |
PKG_BUILD_DIR | 软件包的编译过程目录名字,这个要与源代码解压完以后生成的目录名字一样 |
PKG_SOURCE | 软件包源代码文件的名字 |
PKG_SOURCE_URL | 软件包源代码的下载地址,如果不真就不下载,直接从dl下查找 |
PKG_MD5SUM | 对下载下来的软件包检验 |
PKG_CAT | 指定使用哪个解压工具(zcat, bzcat, unzip) |
PKG_BUILD_DEPENDS | 软件包编译时候依赖哪些其他软件包 |
PKG_SOURCE_PROTO | 通过代码仓库获得代码git, svn |
PKG_REV | 如果是通过svn获得代码,表示svn的版本号 |
Package/ | 软件包描述信息 |
Package/conffiles | 软件包安装的配置文件全路径,每行一个 |
Package/description | 软件包的介绍信息 |
Package/install | 软件包安装什么 |
Package/preinst | 软件包安装之前处理的脚本 |
Package/postinst | 软件包安装之后处理的脚本 |
Build/Prepare | 预处理,在源代码被解压时处理动作 |
Build/Configure | 对执行./configure的时候进行特别处理 |
Build/Compile | 对软件包执行make编译时候特别处理增加一些参数 |
Build/Install | 在编译完成进行安装时的处理,如果不填则执行make install |
6. 开始编译选择
Target System -> x86
Subtarget -> Generic
Target Profile -> Generic
Target Images ->
Build VirtualBox image files
* Build the OpenWrt SDK
* Package the OpenWrt-based Toolchain
Language -> Node.js -> Node.js
make v=99
完成后测试