您的位置:首页 > 运维架构

OpenWRT添加模块(一)Makefile和Config.in

2014-08-13 12:19 344 查看

最近折腾路由器,学习openwrt

原文出处:/article/7764540.html

第一次接触到openwrt,真是被毁三观啊,不要说makefile,连源代码在哪里都找不到,知道嵌入式系统水深,没想到迈出第一步就没过了脖子。好在旁边有人指点,直接在芯片厂商提供的既有代码上做二次开发,项目进展倒也完全满足了前期计划的目标。但是哥奔的就是嵌入式,这么好的学习机会怎容错过?!

目标:在芯片厂商提供的开发包上添加自己的用户态模块和内核态模块,以使我们自己开发的代码与芯片厂商的代码尽可能隔离。

添加模块编译

在网上找了一下,很多关于编译Openwrt系统的资料,不过这些事情芯片厂商提供的开发包都已经办得妥妥了,但是没有找到系统介绍的资料,添加一个包的介绍有不多,其中有两个很有参考价值:

/article/2102552.html

http://kamikaze.openwrt.org/docs/openwrt.html#x1-460002.1.2

详细步骤如下:

在package目录下创建模块目录my_module,内含:

Makefile 用于建立于OpenWRT的联系,成为OpenWRT的一个包

src 包含自己的代码

src/hello.c 源代码

src/Makefile 源代码的Makefile

后续将主要讲解一下目前的系统Makefile的理解:

include $(TOPDIR)/rules.mk 必须包含

#include $(INCLUDE_DIR)/kernel.mk 内核模块包含,目前不需要

PKG_NAME:=my_module 包名称,在menuconfig显示

PKG_VERSION:=0.0.1 包版本号

PKG_BASE_NAME:=my_module 包名称,在build_dir下面创建PKG_BASE_NAME-PKG_VERSION目录,用于存放源代码

#PKG_SOURCE:=$(PKG_BASE_NAME)-$(PKG_VERSION).tar.gz

PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_BASE_NAME)-$(PKG_VERSION) 指定代码存放路径

#PKG_RELEASE:=1

#PKG_SOURCE_URL:=http://localhost

PKG_BUILD_DEPENDS:=

PKG_BIN_DIR= 上面注释了三项,是为了不让OpenWRT去下载代码(而从本地拷贝代码,见后面说明)

include $(INCLUDE_DIR)/package-version-override.mk 不知道干嘛用,应该是一定要的

include $(INCLUDE_DIR)/package.mk 不知道干嘛用,应该是一定要的

ifeq ($(DUMP),) 不知道干嘛用

STAMP_CONFIGURED:=$(strip $(STAMP_CONFIGURED))_$(shell $(SH_FUNC) grep '^CONFIG_GPON_' $(TOPDIR)/.config | md5s)

endif

define Package/$(PKG_NAME) 用于设置menuconfig的选项

SECTION:=application 不知道干嘛用,类似的选项有net/sys/driver...应该是linux系统的分类

CATEGORY:=teddy menuconfig顶级目录

TITLE:=the first module by teddy 本包的目录项说明(目录项名称即包名称)

URL:=http://www.teddy.com/ 不知道干嘛用,估计用处不大

MAINTAINER:=teddy 不知道干嘛用,估计用处不大

DEPENDS:= 依赖的包,还不会用

MENU:=1 目录项使能,如果如果基础模块可以设为0

endef

define Package/$(PKG_NAME)/description 不知道干嘛用,估计用处不大

Teddy's First Package On OpenWRT.

endef

define Package/$(PKG_NAME)/config 结合config/Config.in设置比较复杂的目录项,可以不用

menu "detail configurations" 第一个选项,由开发人员自行设置

depends on PACKAGE_$(PKG_NAME)

source "$(SOURCE)/config/Config.in"

endmenu

$(call Package/$(PKG_NAME)/override_version) 第二个选项,由系统提供,应该是另外指定版本号

$(call Package/$(PKG_NAME)/override_source_path) 第三个选项,有系统提供,应该是另外指定代码存放路径的

endef

CONFIGURE_ARGS +=

ifeq ($(CONFIG_mips),y) 不知道干嘛用

CONFIGURE_ARGS += --enable-add_drv_cflags="-fno-pic -mno-abicalls -mlong-calls -G 0"

endif

define Build/Prepare 这个很关键,在上面取消了从网络下载,由这里的语句将src的代码拷到指定位置

mkdir -p $(PKG_BUILD_DIR)

$(CP) ./src/* $(PKG_BUILD_DIR)/

endef

define Build/Clean 清除语句,没用过

@- rm -Rf $(PKG_BUILD_DIR)/ipkg*

@- [ -e $(PKG_BUILD_DIR)/Makefile ] && $(MAKE) -C $(PKG_BUILD_DIR) clean

$(call Build/Clean/Default)

endef

define Package/$(PKG_NAME)/install 忘记干嘛用的了,好像是用来创建目录的,没有这句会导致编译不过

$(INSTALL_DIR) $(1)/$(PKG_BIN_DIR)

endef

$(eval $(call BuildPackage,$(PKG_NAME))) 必须

另外还可以创建

config/Config.in

用于细节定义,如

menu "macros"

config FIRST_MACRO 这里的config值可以被Makefile使用,但是还没有发现源代码可以用

bool "first macro defined in my module"

default y

config SECOND_MACRO

bool "second macro defined in my module"

default y

endmenu

也可以在menuconfig显示出来,怀疑config XXXX是宏定义,还没有试过

上面描述的手段应该不是openwrt希望的方法,但是作为一般开发应该已经够用了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: