Openwrt添加定制一个软件包

我深知前路风雨,但我依然微笑前行 ;)

  Openwrt的Makefile流程异于一般常用的Makefile,阅读起来难度太大。但是我么可以先通过如何使用、修改Makefile开始,从Makefile的某个局部开始了解,事情就会变得简单许多。我们在开发定制Openwrt的时候,通常会给它添加某项功能。这里介绍一下使用,添加软件包(opkg在线安装)、编译出内核模块ko两种方法完成功能的添加。(它们分别是用户态、内核态)

  用户态与内核态的区别:简单来说就是处于内核态的程序对于操作系统资源的访问拥有更大的特权,对于某些操作可以直接调用资源;而不像用户态的程序,访问操作系统资源受到限制,而且是通过操作系统提供的接口来访问资源。内核态程序可以执行得很快,但如果出错则系统崩溃;用户态程序与之相反。

[下面使用TOP_DIR表示Openwrt的住目录]这里先介绍如何使用添加软件包(用户态)形式添加功能的方法。本文的目录结构安排如下所示:

  1. package的所有源码都存放在本地

  2. package的源码存放在因特网(和Openwrt做法相似)

  3. package中添加patch来给软件包打补丁

1、package的所有源码都存放在本地

  首先我们要在TOP_DIR/package/utilks目录下创建helloworld文件夹,然后创建两个Makefile文件外加一个helloworld.c共三个文件。具体的目录结构如下图所示:

 TOP_DIR/package/utils/helloworld------Makefile
                            |

                            --------src-------helloworld.c
                                     |

                                     ----------Makefile

文件介绍

  • helloworld/Makefile:交给Openwrt工程Makefile调用,用于描述软件包的各种信息。主要作用是告诉Openwrt我的软件包基本信息(软件包名、版本号、详细介绍等等;如何编译、安装)

  • helloworld/src/helloworld.c:软件包C源码

  • helloworld/src/Makefile:软件包具体的编译依赖描述,和我们平时写的Makefile类似;

1.1首先创建helloworld文件夹,然后在目录下创建Makefile(不要创建src文件夹以及目录下的两个文件)。

该Makefile的内容如下所示:

include $(TOPDIR)/rules.mk

PKG_NAME:=helloworld
PKG_VERSION:=1
PKG_RELEASE:=1

PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)

include $(INCLUDE_DIR)/package.mk

define Package/helloworld
  SECTION:=utils
  CATEGORY:=Utilities
  TITLE:=helloworld_xz
endef

define Package/helloworld/description
 show demo.
endef

define Build/Prepare
	mkdir -p $(PKG_BUILD_DIR)
	$(CP) ./src/* $(PKG_BUILD_DIR)/
endef

define Package/helloworld/install
	$(INSTALL_DIR) $(1)/bin
	$(INSTALL_BIN) $(PKG_BUILD_DIR)/helloworld $(1)/bin
endef

$(eval $(call BuildPackage,helloworld))

  此时软件包的描述信息添加完毕,此时在TOP_DIR目录下执行make menuconfig,则会在Utilities选项下看到你的软件包,如下图所示:
Openwrt添加定制一个软件包_第1张图片

将其前面选择为M,则等会编译工程时则会将其编译成一个*.ipx软件安装包。

1.2添加src/helloworld.c、src/Makefile两个文件。

  这两个文件的内容很简单,和平时写的简单工程的C文件以及Makefile没有区别[这里就不做详细介绍]。

/* src/helloworld.c */
#include
#include

int main(int argc, char *argv[])
{
	printf("zhangxingzhi hello world!\n");
	return 0;
}
/* src/Makefile */
APP_NAME = helloworld
OBJ = helloworld.o

$(APP_NAME):$(OBJ)
	$(CC) $^ -o $@ $(LDFLAGS)

%.o:%.c
	$(CC) $(CFLAGS) -c $^

.PHONY:clean
clean:
	rm $(OBJ) $(APP_NAME)

1.3将编译生成的*.ipx,上传到目标板上安装运行

  我生成的文件是:TOP_DIR/bin/targets/brcm2708/bcm2710/packages/kmod-khello_4.4.112+1.0-1_arm_cortex-a53_neon-vfpv4.ipk【编译时可以单独编译该模块,如果之前已经编译好工具链,“make package/helloworld/compile V=99”】

  1. 使用scp命令即可将生成软件包远程复制到目标板
  2. 使用opkg install/remove即可安装卸载软件包

你可能感兴趣的:(Openwrt学习,openwrt,makefile,packege)