zoukankan      html  css  js  c++  java
  • OpenWRT添加模块 Makefile和Config.in

    添加模块编译

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

    http://blog.csdn.net/lj627889343/article/details/7997463

    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

  • 相关阅读:
    二项分布 正太分布 关系 隶莫佛-拉普拉斯定理的推广 列维-林德伯格定理
    lint (software)
    eslint
    Lazy freeing of keys 对数据的额异步 同步操作 Redis 4.0 微信小程序
    XML-RPC JSON-RPC RPC是实现思路
    Multitier architecture
    Messaging Patterns for Event-Driven Microservices
    替换模板视频图片的原理
    Understanding When to use RabbitMQ or Apache Kafka Kafka RabbitMQ 性能对比
    RabbitMQ Connector
  • 原文地址:https://www.cnblogs.com/general0878/p/4983801.html
Copyright © 2011-2022 走看看