1、openwrt增加软件包及内核模块总结openwrt增加软件包及内核模块总结- by flb 2016.8.17一、openwrt的目录结构上图为openwrt的目录结构,其中第一行为原始目录,第二行是编译过程中生成的目录。各目录的作用如下:tools:编译时需要一些工具, tools里包含了获取和编译这些工具的命令。里 面是一些Makefile,有的可能还有patch。每个Makefile里都有一 句$(eval $(call HostBuild),表示编译这个工具是为了在主机上使用 的。toolchain:包含一些命令去获取kernel headers, C library, bin-ut
2、ils, compiler, debugger。target:各平台在这个目录里定义了firmware和kernel的编译过程。package:包含针对各个软件包的Makefile。openwrt定义了一套Makefile模板, 各软件参照这个模板定义了自己的信息,如软件包的版本、下载地址、编译 方式、安装地址等,用户可在该目录下增加自己的软件包。include:openwrt的Makefile,mk都存放在这里。scripts:一些per脚本,用于软件包管理。dl:软件包下载后都放到这个目录里。build_dir:软件包都解压到build_dir中,然后在此编译。staging_dir:最终
3、安装目录。tools,toolchain被安装到这里,rootfs也会放 在这里。feeds:bin:编译完成后,firmware和各ipk会放到此目录下。2、增加应用层软件模块软件包加入的软件包可以是网上下载的开源软件或自行开发的软件。若需增加一个应用层软件,则需要在package目录下创建一个目录,以包含软件包的各种信息和与openwrt建立联系文件。openwrt有其Makefile模版,使之能方便的增加软件包;建立一个软件包不需要太多工作,大部分工作都隐藏在其它的makefile中,编写工作被抽象成对几个变量的赋值。编写的规则如下。1、引入文件openwrt使用三个makefile的子
4、文件,分别为:include $(TOPDIR)/rules.mkinclude $(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_VERS
5、ION:表示软件版本号。 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:表示
6、软件包编译目录。它的父目录为$(BUILD_DIR)。如果 不指定,默认为$(BUILD_DIR)/$( PKG_NAME)$( PKG_VERSION)。还有一些有开源代码的定义。 PKG_SOURCE_SUBDIR PKG_SOURCE_PROTO PKG_SOURCE_MIRROR PKG_MIRROR_MD5SUM PKG_SOURCE_VERSION3、用户程序编译包定义用户程序软件包使用Package定义,内核模块使用KernelPackage定义。用户程序的编译包以Package/开头,在Package定义中的软件名可以与软件包名不一样。下文中的$(PKG_NAME)为一变量标识
7、,并非直使用$(PKG_NAME)。a) Package/$(PKG_NAME)SECTION - 软件包类型 (尚未使用)CATEGORY - menuconfig中软件包所属的一级目录,如NetworkSUBMENU - menuconfig中软件包所属的二级目录,如dial-inTITLE - 软件包标题DESCRIPTION - 软件包的详细说明(已放弃使用,使用会出错)URL- 软件的原始位置,一般是软件作者的主页MAINTAINER - (optional) 软件包维护人员DEPENDS - (optional) 依赖项,运行本软件依赖的其他包,如果存在多个 依赖,则每个依赖需用空
8、格分开。依赖前若使用+号表示默认显示,即依赖 对像没有选中也会显示,使用则默认不显示,即当依赖对象选中后才显示。在用户态的软件包没有内核模块的AUTOLOAD参数。如果软件需要在boot时自动运行,则需要在/etc/init.d(package/base-files/files中)增加相应的脚本文件。写法可参照/etc/init.d下的其它文件。b)Package/$(PKG_NAME)/conffiles #(可选)软件包需要复制的配置文件列表,一个文件占一行。如果文件结尾使用/,则表示为目录。用于备份配置文件说明,在sysupgrade命令执行时将会用到。c)Package/$(PKG_N
9、AME)/description软件包的详细描述。d)Build/Prepare编译准备方法,对于网上下载的软件包不需要再描述。对于自行开发的软件包必须说明编译准备方法。按openwrt的习惯,一般把自己设计程序全部放在src目录下,故一般准备方法为:define Build/Prepare mkdir -p $(PKG_BUILD_DIR) $(CP) ./src/* $(PKG_BUILD_DIR)/endefe)Build/Configure在Automake中需要进行./configure,所以本配置方法主要针对需要配置的软件包而设计,一般自行开发的软件包可以不在这里说明。需要使用本定
10、义的情况,可参考dropbear。f)Build/Compile编译方法,可参考下面的定义:define Build/$(PKG_NAME)/compile $(MAKE) -C $(PKG_BUILD_DIR) CROSS_COMPILE=$(TARGET_CROSS) ARCH=$(LINUX_KARCH) SUBDIRS=$(PKG_BUILD_DIR) EXTRA_CFLAGS=$(BUILDFLAGS)endefg)Package/$(PKG_NAME)/install软件包的安装方法,包括一系列拷贝编译发的文件到指定位置。调用时会带一参数,就是嵌入系统的镜像文件系统目录,因此$(1
11、)表示嵌入系统的镜像目录。一般采用下面的方法:define Package/$(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目录下
12、。写法参见上蓝色部分。INSTALL_DIR等在rules.mk文件中定义。以下几个未使用过,具体用法不清楚。Package/$(PKG_NAME)/preinst软件包安装前处理方法,使用脚本语言,因此定义的第一行需要下面的格式#!/bin/sh调用時带入的参数为嵌入式系統的镜像目录。Package/$(PKG_NAME)/postinst软件包安装后处理方法,使用脚本语言。Package/$(PKG_NAME)/prerm软件包删除前处理方法,使用脚本语言Package/$(PKG_NAME)/postrm软件包删除后处理方法,使用脚本语言4)使用定义完成前面的定义后,必须使用eval函数
13、实现各种定义。格式为用户层软件包:$(eval $(call BuildPackage,$(PKG_NAME)内核层软件包:$(eval $(call KernelPackage,$(PKG_NAME)三、增加内核模块软件包内核模块的Makefile与用户层模块大致相同,以下只叙述其不同的地方。1)内核模块使用KernelPackage定义;a)KernelPackage/$(PKG_NAME)SUBMENU表示子菜单位置,kernel.mk对内核模块定义了CATEGORY为kernel modules,所以内核模块在menuconfig中的主菜单为kernel modules,然后有下一级子
14、菜单$(SUBMENU)。在子菜单下可以看到以kmod-$( PKG_NAME)项目。AUTOLOAD表示自动装入内核,一般表示方法为:AUTOLOAD:=$(call AutoLoad,$(PRIORITY),$(AUTOLOAD_MODS) AutoLoad的第一个参数$(PRIORITY)为优先级,01为最优先,99为最后装载。 有关自动装载可以在/etc/modules.d目录下看到,第二个参数 $(AUTOLOAD_MODS)模块名,每个模块名以空格符分隔。即可同时装载多个内 核模块。4、编译通过make menuconfig可找到所增加的软件包。make package/$(PKG
15、_NAME)/compile V=99 即可编译相应的模块。编译后的文件存在于用户层: ./build_dir/target_xxx/$(PKG_NAME)/中内核层:./build_dir/target_xxx/linux_xxx/$(PKG_NAME)/中五、用户层与内核层实例1、用户层软件包实例a)目录结构b)user_module中的Makefilec)src中的Makefile,该Makefile写法跟普通makefile一样。可随意。源文件: 2、内核模块软件包实例a)目录结构b)kernel_module中的Makefilec)src中的Makefiled)src中的Kconfig源文件: (声明:以上资料大部分来源于网络。)