openwrt增加软件包及内核模块总结.docx
- 文档编号:7280158
- 上传时间:2023-05-11
- 格式:DOCX
- 页数:8
- 大小:262.66KB
openwrt增加软件包及内核模块总结.docx
《openwrt增加软件包及内核模块总结.docx》由会员分享,可在线阅读,更多相关《openwrt增加软件包及内核模块总结.docx(8页珍藏版)》请在冰点文库上搜索。
openwrt增加软件包及内核模块总结
openwrt增加软件包及内核模块总结
------byflb2016.8.17
一、openwrt的目录结构
上图为openwrt的目录结构,其中第一行为原始目录,第二行是编译过程中生成的目录。
各目录的作用如下:
tools:
编译时需要一些工具,tools里包含了获取和编译这些工具的命令。
里面是一些Makefile,有的可能还有patch。
每个Makefile里都有一句 $(eval$(callHostBuild)),表示编译这个工具是为了在主机上使用的。
toolchain:
包含一些命令去获取kernelheaders,Clibrary,bin-utils,compiler,debugger。
target:
各平台在这个目录里定义了firmware和kernel的编译过程。
package:
包含针对各个软件包的Makefile。
openwrt定义了一套Makefile模板,各软件参照这个模板定义了自己的信息,如软件包的版本、下载地址、编译方式、安装地址等,用户可在该目录下增加自己的软件包。
include:
openwrt的Makefile,mk都存放在这里。
scripts:
一些per脚本,用于软件包管理。
dl:
软件包下载后都放到这个目录里。
build_dir:
软件包都解压到build_dir中,然后在此编译。
staging_dir:
最终安装目录。
tools,toolchain被安装到这里,rootfs也会放在这里。
feeds:
bin:
编译完成后,firmware和各ipk会放到此目录下。
2、增加应用层软件模块软件包
加入的软件包可以是网上下载的开源软件或自行开发的软件。
若需增加一个应用层软件,则需要在package目录下创建一个目录,以包含软件包的各种信息和与openwrt建立联系文件。
openwrt有其Makefile模版,使之能方便的增加软件包;建立一个软件包不需要太多工作,大部分工作都隐藏在其它的makefile中,编写工作被抽象成对几个变量的赋值。
编写的规则如下。
1、引入文件
openwrt使用三个makefile的子文件,分别为:
include$(TOPDIR)/rules.mk
include$(INCLUDE_DIR)/kernel.mk
include$(INCLUDE_DIR)/package.mk
由这些makefile子文件确立软件包加入openwrt的方式和方法及一些变量的定义。
rules.mk一般在Makefile的开头,kernel.mk对于软件包为内核时不可缺少,package.mk一般在软件包的基本信息完成后再引入。
2、编写软件包的基本信息
软件包的信息均以PKG_开头,意思和作用如下:
PKG_NAME:
表示软件包名称,将在menuconfig和ipkg可以看到。
PKG_VERSION:
表示软件版本号。
PKG_RELEASE:
表示Makefile的版本号
PKG_SOURCE:
表示源代码的文件名。
PKG_SOURCE_URL:
表示源代码的下载网站位置。
@SF表示在sourceforge网站,@GNU表示GNU网站。
获取方式可以为:
git、svn等。
有关下载方法可参考$(INCLUDE_DIR)/download.mk和$(SCRIPT_DIR)/download.pl。
PKG_MD5SUM:
表示源代码文件的效验码。
用于核对软件包是否正确下载。
PKG_CAT:
表示源代码文件的解压方法。
包括zcat,bzcat,unzip等。
PKG_BUILD_DIR:
表示软件包编译目录。
它的父目录为$(BUILD_DIR)。
如果不指定,默认为$(BUILD_DIR)/$(PKG_NAME)$(PKG_VERSION)。
还有一些有开源代码的定义。
PKG_SOURCE_SUBDIR
PKG_SOURCE_PROTO
PKG_SOURCE_MIRROR
PKG_MIRROR_MD5SUM
PKG_SOURCE_VERSION
3、用户程序编译包定义
用户程序软件包使用Package定义,内核模块使用KernelPackage定义。
用户程序的编译包以Package/开头,在Package定义中的软件名可以与软件包名不一样。
下文中的$(PKG_NAME)为一变量标识,并非直使用$(PKG_NAME)。
a)Package/$(PKG_NAME)
SECTION-软件包类型(尚未使用)
CATEGORY-menuconfig中软件包所属的一级目录,如Network
SUBMENU-menuconfig中软件包所属的二级目录,如dial-in
TITLE-软件包标题
DESCRIPTION-软件包的详细说明(已放弃使用,使用会出错)
URL -软件的原始位置,一般是软件作者的主页
MAINTAINER-(optional)软件包维护人员
DEPENDS-(optional)依赖项,运行本软件依赖的其他包,如果存在多个依赖,则每个依赖需用空格分开。
依赖前若使用+号表示默认显示,即依赖对像没有选中也会显示,使用@则默认不显示,即当依赖对象选中后才显示。
在用户态的软件包没有内核模块的AUTOLOAD参数。
如果软件需要在boot时自动运行,则需要在/etc/init.d(package/base-files/files中)增加相应的脚本文件。
写法可参照/etc/init.d下的其它文件。
b)Package/$(PKG_NAME)/conffiles#(可选)
软件包需要复制的配置文件列表,一个文件占一行。
如果文件结尾使用/,则表示为目录。
用于备份配置文件说明,在sysupgrade命令执行时将会用到。
c)Package/$(PKG_NAME)/description
软件包的详细描述。
d)Build/Prepare
编译准备方法,对于网上下载的软件包不需要再描述。
对于自行开发的软件包必须说明编译准备方法。
按openwrt的习惯,一般把自己设计程序全部放在src目录下,故一般准备方法为:
defineBuild/Prepare
mkdir-p$(PKG_BUILD_DIR)
$(CP)./src/*$(PKG_BUILD_DIR)/
endef
e)Build/Configure
在Automake中需要进行./configure,所以本配置方法主要针对需要配置的软件包而设计,一般自行开发的软件包可以不在这里说明。
需要使用本定义的情况,可参考dropbear。
f)Build/Compile
编译方法,可参考下面的定义:
defineBuild/$(PKG_NAME)/compile
$(MAKE)-C"$(PKG_BUILD_DIR)"\
CROSS_COMPILE="$(TARGET_CROSS)"\
ARCH="$(LINUX_KARCH)"\
SUBDIRS="$(PKG_BUILD_DIR)"\
EXTRA_CFLAGS="$(BUILDFLAGS)"
endef
g)Package/$(PKG_NAME)/install
软件包的安装方法,包括一系列拷贝编译发的文件到指定位置。
调用时会带一参数,就是嵌入系统的镜像文件系统目录,因此$
(1)表示嵌入系统的镜像目录。
一般采用下面的方法:
definePackage/$(PKG_NAME)/install
$(INSTALL_DIR)$
(1)/sbin
$(INSTALL_BIN)$(PKG_BUILD_DIR)/$(PKG_NAME)$
(1)/sbin/
$(INSTALL_DIR)$
(1)/etc/init.d
$(INSTALL_BIN)./files/$(PKG_NAME).init$
(1)/etc/init.d/$(PKG_NAME)
endef
如果用户层软件在boot时要自动运行,则需要在安装方法说明中增加自动运行的脚本文件安装。
一般安装文件放在files目录下。
写法参见上蓝色部分。
INSTALL_DIR等在rules.mk文件中定义。
以下几个未使用过,具体用法不清楚。
Package/$(PKG_NAME)/preinst
软件包安装前处理方法,使用脚本语言,因此定义的第一行需要下面的格式
#!
/bin/sh
调用時带入的参数为嵌入式系統的镜像目录。
Package/$(PKG_NAME)/postinst
软件包安装后处理方法,使用脚本语言。
Package/$(PKG_NAME)/prerm
软件包删除前处理方法,使用脚本语言
Package/$(PKG_NAME)/postrm
软件包删除后处理方法,使用脚本语言
4)使用定义
完成前面的定义后,必须使用eval函数实现各种定义。
格式为
用户层软件包:
$(eval$(callBuildPackage,$(PKG_NAME)))
内核层软件包:
$(eval$(callKernelPackage,$(PKG_NAME)))
三、增加内核模块软件包
内核模块的Makefile与用户层模块大致相同,以下只叙述其不同的地方。
1)内核模块使用KernelPackage定义;
a)KernelPackage/$(PKG_NAME)
SUBMENU表示子菜单位置,kernel.mk对内核模块定义了CATEGORY为kernelmodules,所以内核模块在menuconfig中的主菜单为kernelmodules,然后有下一级子菜单$(SUBMENU)。
在子菜单下可以看到以kmod-$(PKG_NAME)项目。
AUTOLOAD表示自动装入内核,一般表示方法为:
AUTOLOAD:
=$(callAutoLoad,$(PRIORITY),$(AUTOLOAD_MODS))
AutoLoad的第一个参数$(PRIORITY)为优先级,01为最优先,99为最后装载。
有关自动装载可以在/etc/modules.d目录下看到,第二个参数$(AUTOLOAD_MODS)模块名,每个模块名以空格符分隔。
即可同时装载多个内核模块。
4、编译
通过makemenuconfig可找到所增加的软件包。
makepackage/$(PKG_NAME)/compileV=99即可编译相应的模块。
编译后的文件存在于
用户层:
./build_dir/target_xxx/$(PKG_NAME)/中
内核层:
./build_dir/target_xxx/linux_xxx/$(PKG_NAME)/中
五、用户层与内核层实例
1、用户层软件包实例
a)目录结构
b)user_module中的Makefile
c)src中的Makefile,该Makefile写法跟普通makefile一样。
可随意。
源文件:
2、内核模块软件包实例
a)目录结构
b)kernel_module中的Makefile
c)src中的Makefile
d)src中的Kconfig
源文件:
(声明:
以上资料大部分来源于网络。
)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- openwrt 增加 软件包 内核 模块 总结
![提示](https://static.bingdoc.com/images/bang_tan.gif)