OpenWrt添加软件包(一)

2023-11-20

本文参考https://wiki.openwrt.org/zh-cn/doc/devel/packages
http://blog.csdn.net/teddy99999/article/details/17537545

OpenWrt是一个比较完善的嵌入式Linux开发平台,人们可以在其基础上增加软件包,以扩大其应用范围。OpenWrt在增加软件方面使用极其方便,按照OpenWrt的约定就可以很简单完成。
加入的软件包可以是网上可下载的开源软件或自行开发的软件。为加入软件包需要在package目录下创建一个目录,以包含软件包的各种信息和与OpenWrt建立联系的文件。然后创建一个Makefile与OpenWrt建立联系,Makefile需要遵循OpenWrt的约定。另外可以创建一個patchs目录保存patch文件,对下载的源代码进行适量修改。下面主要介紹Makefile的基本约定。

  1. 引入文件
    OpenWrt使用三个makefile的子文件,分别为:
    include(TOPDIR)/rules.mk
    include(INCLUDE_DIR)/.kernel.mk
    include(INCLUDE_DIR)/package.mk

    由这些makefile子文件确立软件包加入Openwrt的方法和方式。

    include(TOPDIR)/rules.mk一般在Makefile的开头
    include(INCLUDE_DIR)/kernel.mk文件对于软件包为内核时不可缺少
    include(INCLUDE_DIR)/package.mk一般在软件包的基本信息完成后引入

  2. 编写软件包的基本信息,这些软件包的开头均以PKG_开头,其意义和作用如下:

    -PKG_NAME -软件包的名字, 在 menuconfig 和 ipkg 显示
    -PKG_VERSION -软件包的版本,主干分支的版本正是我们要下载的
    -PKG_RELEASE -这个 makefile 的版本
    -PKG_BUILD_DIR -编译软件包的目录
    -PKG_SOURCE -要下载的软件包的名字,一般是由 PKG_NAME 和 PKG_VERSION 组成
    -PKG_SOURCE_URL -下载这个软件包的链接,@SF表示在sourceforge网站,@GNU表示在GNU网站
    -PKG_MD5SUM -软件包的 MD5 值
    -PKG_CAT -解压软件包的方法 (zcat, bzcat, unzip)
    -PKG_BUILD_DEPENDS -需要预先构建的软件包,但只是在构建本软件包时,而不是运行的时候。它的语法和下面的DEPENDS一样

  3. 编译包定义
    用户程序和内核模块的定义不一样。用户态软件包使用Package,內核模块使用KernelPackage。
    用户程序的编译包以Package/开头,然后接着软件名,在Package定义中的软件名可以与软件包名不一样,而且可以多个定义。下面使用$(PKG_NAME)只是做一个标示,并非真正使用它。

    Package/$(PKG_NAME)
    -SECTION - 软件包类型 (尚未使用)
    -CATEGORY - menuconfig中软件包所属的一级目录,如Network
    -SUBMENU - menuconfig中软件包所属的二级目录,如dial-in/up
    -TITLE - 软件包标题
    -DESCRIPTION - 软件包的详细说明
    -URL - 软件的原始位置,一般是软件作者的主页
    -MAINTAINER - (optional) 软件包维护人员
    -DEPENDS - (optional) 依赖项,运行本软件依赖的其他包,如果存在多个依赖,则每个依赖需用空格分开。依赖前使用+号表示默认显示,即对象沒有选中时也会显示,使用@则默认为不显示,即当依赖对象选中后才显示。

    Package/$(PKG_NAME)/conffiles
    本包安装的配置文件,一行一个。如果文件结尾使用/,则表示为目录。用于备份配置文件说明,在sysupgrade命令执行时将会用到。

    Package/$(PKG_NAME)/description
    软件包的详细描述,取代前面提到的DESCRIPTION详细描述。

    Build/Prepare
    编译准备方法,对于网上下载的软件包不需要再描述。对于非网上下载或自行开发的软件包必须说明编译准备方法。一般的准备方法为:

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

按OpenWrt的习惯,一般把自己设计的程序全部放在src目录下。

Build/Configure
在Automake中需要进行./configure,所以本配置方法主要针对需要配置的软件包而设计,一般自行开发的软件包可以不在这里说明。需要使用本定义的情况,可参考dropbear。

Build/Compile
编译方法,没有特别说明的可以不予以定义。如果不定义将使用默认的编译方法Build/Compile/Default
自行开发的软件包可以考虑使用下面的定义。

define Build/Compile
        $(MAKE) -C $(PKG_BUILD_DIR) \
        $(TARGET_CONFIGURE_OPTS) CFLAGS="$(TARGET_CFLAGS) -I$(LINUX_DIR)/include"
Endef

Package/$(PKG_NAME)/install

软件包的安装方法,包括一系列拷贝编译好的文件到指定位置。调用时会带一个参数,就是嵌入系統的镜像文件系統目录,因此$(1)表示嵌入系统的镜像目录。一般可以采用下面的方法:

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

INSTALL_DIR、INSTALL_BIN在 $(TOPDIR)/rules.mk文件定义,所以本Makefile必须引入该文件
INSTALL_DIR :=install -d -m0755 意思创建所属用户可读写即执行,其他用户可读可执行的目录。
INSTALL_BIN:=install -m0755意思编译好的文件到镜像文件目录。
如果用户态软件在boot时要自动运行,则需要在安装方法说明中增加自动运行的脚本文件安装和配置文件安装方法
例如:

define Package/mountd/install
        $(INSTALL_DIR) $(1)/sbin/ $(1)/etc/config/ $(1)/etc/init.d/
        $(INSTALL_BIN) $(PKG_BUILD_DIR)/mountd $(1)/sbin/

         $(INSTALL_DATA) ./files/mountd.config $(1)/etc/config/mountd
         $(INSTALL_BIN) ./files/mountd.init $(1)/etc/init.d/mountd
endef

安装文件放在files子目录下,不要和源代码文件目录src混在一起,以提高可读性。
使用清晰的文件扩展名,更方便安装识別文件。

Package/preinst

软件安装之前被执行的脚本,别忘了在第一句加上#!/bin/sh。如果脚本执行完毕要取消安装过程,直接让它返回false即可。

Package/postinst

软件安装之后被执行的脚本,别忘了在第一句加上#!/bin/sh。

Package/prerm

软件删除之前被执行的脚本,别忘了在第一句加上#!/bin/sh。如果脚本执行完毕要取消删除过程,直接让它返回false即可。

Package/postrm

软件删除之后被执行的脚本,别忘了在第一句加上#!/bin/sh。

OK,对于软件包的定义已经讲完啦,现在我们来看一个例子:

include $(TOPDIR)/rules.mk

PKG_NAME:=bridge
PKG_VERSION:=1.0.6
PKG_RELEASE:=1

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

include $(INCLUDE_DIR)/package.mk

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

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

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

define Package/bridge/install
  $(INSTALL_DIR) $(1)/usr/sbin
  $(INSTALL_BIN) $(PKG_BUILD_DIR)/brctl/brctl $(1)/usr/sbin/
endef

$(eval $(call BuildPackage,bridge))

是不是很容易就看懂了呢?接下来就是创建自己想要的软件包了,下一篇我们会说一下Openwrt创建内核模块软件包的方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenWrt添加软件包(一) 的相关文章

随机推荐

  • 蓝桥杯:字符串

    题目链接 include
  • notepad++字符串替换

    删除空白行 在编辑选项里面包括很多功能 编辑 gt 行操作 gt 移除空行 包括空白字符 行首添加字符串 按CTRL F 选择替换页签 选择正则表达式 查找目标 设置为 替换为 设置自己想要替换的字符串 特殊字符需要添加 进行转义 行尾添加
  • 【MySQL】34道SQL综合练习详解(员工表、部门表、工资等级表)

    文章目录 一 34道SQL综合练习 二 测试使用的数据表 三 创建测试表的SQL语句 一 34道SQL综合练习 1 查询取得每个部门最高工资的人员信息 select e ename t from emp e join select dept
  • 如何使用PCL将XYZRGB点云转换为彩色mesh模型

    如何使用PCL将XYZRGB点云转换为彩色mesh模型 最近完成了一个使用RGBD传感器 构建物体模型的小demo 其中有点难的最后一步是如何将获得的物体点云变成彩色mesh模型 效果图如下 从点云变成彩色mesh 其实整体的步骤可以总结如
  • M1 macbook上安装docker 编译内核 并使用qemu启动内核。

    一 编译内核并通过qemu启动内核 1 在M1上安装docker这个就不用提供步骤了 网上自行搜索 2 在M1上pull一个ubuntu的容器 docker pull ubuntu 18 04 docker images REPOSITOR
  • 卡尔曼滤波及其MATLAB程序

    今天写了个卡尔曼滤波的小程序 希望对有需要的同学有点帮助 卡尔曼滤波是一个很常用的滤波算法 与维纳滤波相比有很多长处 这里我们把Kalman Filter简称为KF KF的基本思想是 采用信号 噪声 状态空间模型 利用前一时刻的状态最优估计
  • 学习python笔记01

    一 python是什么 人生苦短 我用python python是一门解释型语言 边解释边运行 与编译型语言的区别是 编译型语言是先编译后运行 python语言的特点 1 优雅 2 明确 3 简单 python是一个完全面向对象语言 具有强
  • 纯java实现相片转素描

    1 实例演示图片转素描效果 首先我们来看一下具体的效果 在项目中添加依赖
  • unity制作一个可以自由滑动收缩的历史记录功能。

    公司在做一款模拟经营类的卖车游戏 需要一个简单的历史记录功能 放在左上角 记录最近20条的收入 支出记录 超过2秒不动则收起 收起时展示最近的一个消息记录 用到的组件是ScrollView 使用方法可以参考我写过的一篇博客 ScrollVi
  • Input.GetAxis _ Unity3d

    Input GetAxis 获取轴 static function GetAxis axisName string float Description描述 Returns the value of the virtual axis iden
  • 【论文精读】时序逻辑应用之模型预测控制Model Predictive Control with Signal Temporal Logic Specifications

    前言 因为天天写代码实在是太枯燥了 所以读点其他东西来调剂一下 这样科研进度不至于停下 前面读了几篇关于时序逻辑学习的文章 今天来了解一下时序逻辑公式在控制中的应用 Raman V Donze A Maasoumy M Murray R M
  • Android Studio编译失败问题(aapt2)

    Android Studio 3 1编译时出错 org gradle api tasks TaskExecutionException Execution failed for task app mergeDebugResources at
  • 心灵鸡汤

    心灵鸡汤 比尔盖茨不想弯腰去捡100美金 浪费了1秒 时间是最宝贵 有限的时间资源最大化 如果你不够优秀 人脉是不值钱的 它不是追求来的 而是吸引来的 只有等价的交换 才能得到合理的帮助 虽然听起来很冷 但这是事实 与凤凰同飞 必是俊鸟 与
  • AESCBCUtil

    import javax crypto Cipher import javax crypto spec IvParameterSpec import javax crypto spec SecretKeySpec import org ap
  • 面试必问的 CAS ,要多了解

    前言 CAS Compare and Swap 即比较并替换 实现并发算法时常用到的一种技术 Doug lea大神在java同步器中大量使用了CAS技术 鬼斧神工的实现了多线程执行的安全性 CAS的思想很简单 三个参数 一个当前内存值V 旧
  • 结构体中数组放在最后位置的问题

    以下出自 C Programming FAQS 先看下面的代码 struct name int namelen char namestr 1 struct name makename char newname struct name ret
  • GDAL多光谱与全色图像融合简单使用

    目录 简述 C 代码 效果对比 GDAL融合效果和原始多光谱波段对比 GDAL融合效果和原始全色波段对比 ARCGIS融合效果与原始全色和多光谱对比 GDAL融合效果与ArcGIS融合效果对比 简述 最近在GDAL的代码中看见了gdalpa
  • 毕业设计e4a代码

    事件 主窗口 创建完毕 用来设置该窗口控件的属性 比如说该窗口的标题 该窗口的背景颜色 该窗口的背景图片 按键的标题设置 标签1 背景颜色 无色 标签1就是设备未使用 标签2 背景颜色 无色 标签2就是推出系统 标签1 可用 假 禁止标签使
  • STM32第二天之外部中断及系统定时器

    1 中断优先级 1 在 NVIC 有一个专门的寄存器 中断优先级寄存器 NVIC IPRx 用来配置外部中断的优先级 IPR 宽度为 8bit 原则上每个外部中断可配置的优先级为 0 255 2 数值越小 优先级越高 在 F103 中 只使
  • OpenWrt添加软件包(一)

    本文参考https wiki openwrt org zh cn doc devel packages http blog csdn net teddy99999 article details 17537545 OpenWrt是一个比较完