查看: 85|回复: 0

[讨论] 【转】openwrt创建用户软件包

[复制链接]

582

主题

3

好友

1万

积分

翰林

Rank: 7Rank: 7Rank: 7

  • TA的每日心情
    擦汗
    2014-2-12 10:49
  • 签到天数: 150 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2017-7-25 14:52:30 |显示全部楼层
    openwrt根目录先看看openwrt初次编译好后的目录结构:

    TIM截图20170725144120.png


    如上图所示:
    arvik_note:本人更改软件包记录笔记,不必理会。
    include:存放 *.mk 文件
    build_dir:建立工具链时的临时目录,解压、编译、补丁等文件存放点
    staging_dir:工具链的安装位置
    target:平台相关代码及配置文件
    dl:下载目录,编译期间从网上下载的数据包都会放在此目录,数据包会解压到build_dir目录下
    package:包含了我们在配置文件里设定懂得所有编译好的软件包
    feeds:执行./srcipts/feeds install后的缓存文件存放点
    bin:对应平台编译好的二进制文件以及相关ipk文件


    创建软件包↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓以下内容摘自官方WIKI ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
    构建方法openwrt靠Makefile文件来添加软件,Makefile文件最关键,一般来说它提供了下载、编译、安装这个软件包的步骤。
    这里Makefile的格式跟一般的Makefile不一样,因为它的功能跟普通Makefile就是不一样的。它是一种编写方便的模板。
    以package/bridge/Makefile文件为例:
    1. include $(TOPDIR)/rules.mk

    2. PKG_NAME:=bridge
    3. PKG_VERSION:=1.0.6
    4. PKG_RELEASE:=1

    5. PKG_BUILD_DIR:=$(BUILD_DIR)/bridge-utils-$(PKG_VERSION)
    6. PKG_SOURCE:=bridge-utils-$(PKG_VERSION).tar.gz
    7. PKG_SOURCE_URL:=@SF/bridge
    8. PKG_MD5SUM:=9b7dc52656f5cbec846a7ba3299f73bd
    9. PKG_CAT:=zcat

    10. include $(INCLUDE_DIR)/package.mk

    11. define Package/bridge
    12.   SECTION:=base
    13.   CATEGORY:=Network
    14.   TITLE:=Ethernet bridging configuration utility
    15.   #DESCRIPTION:=This variable is obsolete. use the Package/name/description define instead!
    16.   URL:=http://bridge.sourceforge.net/
    17. endef

    18. define Package/bridge/description
    19. Ethernet bridging configuration utility
    20. Manage ethernet bridging; a way to connect networks together to
    21. form a larger network.
    22. endef

    23. define Build/Configure
    24.   $(call Build/Configure/Default,--with-linux-headers=$(LINUX_DIR))
    25. endef

    26. define Package/bridge/install
    27.   $(INSTALL_DIR) $(1)/usr/sbin
    28.   $(INSTALL_BIN) $(PKG_BUILD_DIR)/brctl/brctl $(1)/usr/sbin/
    29. endef

    30. $(eval $(call BuildPackage,bridge))
    复制代码
    软件包变量建立一个软件包不需要太多工作;大部分工作都隐藏在其它的 makefiles 中,编写工作被抽象成对几个变量的赋值。
    PKG_NAME -软件包的名字, 在 menuconfig 和 ipkg 显示
    PKG_VERSION -软件包的版本,主干分支的版本正是我们要下载的
    PKG_RELEASE -这个 makefile 的版本
    PKG_BUILD_DIR -编译软件包的目录
    PKG_SOURCE -要下载的软件包的名字,一般是由 PKG_NAME 和 PKG_VERSION 组成
    PKG_SOURCE_URL -下载这个软件包的链接
    PKG_MD5SUM -软件包的 MD5 值
    PKG_CAT -解压软件包的方法 (zcat, bzcat, unzip)
    PKG_BUILD_DEPENDS -需要预先构建的软件包,但只是在构建本软件包时,而不是运行的时候。它的语法和下面的DEPENDS一样。
    PKG_*变量定义了从何处下载这个软件包;@SF是表示从sourceforge网站下载的一个特殊关键字。md5sum用来检查从网上下载的软件包是否完好无损。PKG_BUILD_DIR定义了软件包源代码的解压路径。
    注意到上面示例文件底部的最后一行吗?这是最为关键的BuildPackage宏。它是在$(INCLUDE_DIR)/package.mk文件里定义的。BuildPackage宏只要求一个参数,即要编译的软件包名,在本例中是”bridge”。所有其他信息都通过宏来获得,这提供了一种内在的简洁性。比如BuildPackage需要软件包的一大串描述信息,我们并不要向它传递冗长的参数,因为我们已经约定描述信息定义在DESCRIPTION宏,BuildPackage从里面读取就可以了。
    BuildPackage相关的宏Package/
    描述软件包在menuconfig和ipkg中的信息,可以定义如下变量:
    SECTION - 软件包类型 (尚未使用)
    CATEGORY - menuconfig中软件包所属的一级目录,如Network
    SUBMENU - menuconfig中软件包所属的二级目录,如dial-in/up
    TITLE - 软件包标题
    DESCRIPTION - 软件包的详细说明
    URL - 软件的原始位置,一般是软件作者的主页
    MAINTAINER - (optional) 软件包维护人员
    DEPENDS - (optional) 依赖项,运行本软件依赖的其他包
    Package/conffiles (可选)
    软件包需要复制的配置文件列表,一个文件占一行
    Build/Prepare (可选)
    一组解包源代码和打补丁的命令,一般不需要。
    Build/Configure (可选)
    如果源代码编译前需要configure且指定一些参数,就把这些参数放在这儿。否则可以不定义。
    Build/Compile (可选)
    编译源代码命令。
    Package/install
    软件安装命令,主要是把相关文件拷贝到指定目录,如配置文件。
    Package/preinst
    软件安装之前被执行的脚本,别忘了在第一句加上#!/bin/sh。如果脚本执行完毕要取消安装过程,直接让它返回false即可。
    Package/postinst
    软件安装之后被执行的脚本,别忘了在第一句加上#!/bin/sh。
    Package/prerm
    软件删除之前被执行的脚本,别忘了在第一句加上#!/bin/sh。如果脚本执行完毕要取消删除过程,直接让它返回false即可。
    Package/postrm
    软件删除之后被执行的脚本,别忘了在第一句加上#!/bin/sh。
    为什么一些定义是”Package/”前缀,另一些定义却是”Build”前缀?这是因为我们支持一个特性:从单个源代码构建多个软件包。OpenWrt工作在一个Makefile对应一个源代码的假设之上,但是你可以把编译生成的程序分割成任意多个软件包。因为编译只要一次,所以使用全局的”Build”定义是最合适的。然后你可以增加很多“Package/”定义,为各软件包分别指定安装方法。建议你去看看dropbear包,这是一个很好的示范。

    提示:对于所有在pre/post, install/removal脚本中使用的变量,都应该使用"$$"代替"$"。这是告诉make暂时不要解析这个变量,而是把它当成普通字符串以及用"$"代替"$$"

    在编辑好Makefile文件,并放到指定目录后,这个新的软件包将在下次执行make menuconfig时出现,你可以选择这个软件包,保存退出,用make编译。现在就把一个软件成功移植到OpenWrt中了!
    ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑以上内容摘自官方WIKI ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
    创建软件包arvik_hello按照如下命令步骤:
    先建一个软件集合的目录arvik_app
    1. cd ./packet
    2. mkdir arvik_app
    复制代码
    在arvik_app目录下建立arvik_hello目录
    1. cd ./arvik_app
    2. mkdir arvik_hello
    复制代码
    接着在arvik_hello中建立src目录和Makefile文件
    1. cd ./arvik_hello
    2. mkdir src
    3. touch Makefile
    复制代码
    该处Makefile文件内容如下,可参照上面软件包变量读懂每句含义,在此不赘述。需要注意的是代码里每行行末是没有空格的,否则可能会出错。 好了,openwrt就靠这个Makefile来添加我们的arvik_hello软件包了。
    1. include $(INCLUDE_DIR)/package.mk

    2. define Package/$(PKG_NAME)
    3.   SECTION:=Utilities
    4.   CATEGORY:=Arvik_Applications
    5.   TITLE:=a Test Program offer by arvik
    6.   MAINTAINER:=arvik
    7. endef

    8. define Package/$(PKG_NAME)/description
    9.   This is a test program that provides a MAkefile template !
    10. endef

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

    15. define Build/Configure
    16. endef

    17. define Package/$(PKG_NAME)/install
    18.     $(INSTALL_DIR) $(1)/usr/bin
    19.     $(INSTALL_BIN) $(PKG_BUILD_DIR)/$(PKG_NAME) $(1)/usr/bin/
    20. endef

    21. $(eval $(call BuildPackage,$(PKG_NAME)))
    复制代码
    下面就进入src目录来建立我们软件源文件和Makefile文件了。
    1. cd ./src
    2. touch hello.c
    3. touch Makefile
    复制代码
    hello.c内容如下:
    1. #include <stdio.h>

    2. int main()
    3. {
    4.     printf("arvik hello world!\n");

    5.     return 0;
    6. }
    复制代码
    此处Makefile文件内容如下:
    1. #########################################
    2. #author:arvik
    3. #email:1216601195@qq.com
    4. #csdn:http://blog.csdn.net/u012819339
    5. #########################################

    6. EXEC:=arvik_hello
    7. SRC:=hello.c

    8. all: $(EXEC)
    9. $(EXEC): $(SRC)
    10.     $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(SRC) $(LDLIBS)

    11. .PHONY:clean
    12. clean:
    13.     -rm -f $(EXEC) *.elf *.gdb *.o
    复制代码
    检验软件包make menuconfig退回openwrt根目录,执行make menuconfig,找到Arvik_Applications选项,进入

    TIM截图20170725144145.png

    再选择arvik_hello
    TIM截图20170725144153.png


    重新编译一次即可(或者单独只编译一次arvik_hello即可,命令 make package/arvik_app/arvik_hello/compile V=99)。
    运行arvik_hello
    1. root@OpenWrt:/# arvik_hello
    2. arvik hello world!
    复制代码
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    关闭

    站长推荐上一条 /5 下一条

    手机版|爱板网 |网站地图  

    GMT+8, 2017-8-20 00:36 , Processed in 0.100707 second(s), 11 queries , Memcache On.

    苏公网安备 32059002001056号

    Powered by Discuz!

    回顶部