【openwrt】package介绍

openwrt package介绍

OpenWrt 构建系统主要围绕package的概念展开。不管是什么软件,几乎都对应一个package。 这几乎适用于系统中的所有内容:HOST工具、交叉编译工具链、Linux 内核、内核mod、根文件系统和上层的应用软件。

一个 OpenWrt package本质上是一个目录,其中包含:

  • OpenWrt package Makefile,描述软件的获取、构建和打包过程(必需)
  • OpenWrt package 补丁目录,用于修改package的源代码(可选)
  • OpenWrt package 附带的其他静态文件,例如初始化脚本文件、默认配置、脚本或其他支持文件(可选)
├── miniupnpd
│   ├── files
│   ├── Makefile
│   └── patches

如果这个package不需要源码或者源码是在线下载的(git、svn、http方式等等),那么只需要一个上述的OpenWrt package就可以了,否则还需要一个package 源码的目录,这个目录比较随意,可以放在任何地方,甚至可以放在OpenWrt package目录内部,不过为了方便管理,建议还是将源码和OpenWrt package分开。

├── miniupnpd
│   ├── files
│   ├── Makefile
│   ├── patches
│   └── src   # 新增源码目录

接下来依次介绍这4个部分的规范:

Makefile (必要)

Makefile文件是用来描述软件的获取、构建和打包过程,它是必需的,而且具有一定的格式。
而且这里的Makefile文件与传统的makefile文件也是有区别的,编写时需要特别注意。

PKG_*部分

PKG_NAME - 包的名称,可以通过menuconfig 查看,是人为定义的name
PKG_VERSION - 需要下载的package版本号,通常和PKG_SOURCE配合使用
PKG_RELEASE - 当前package Makefile 的版本
PKG_LICENSE - 软件包可用的许可证,SPDX 形式。
PKG_LICENSE_FILES-包含许可证文本的文件
PKG_BUILD_DIR -package编译目录,在哪里编译这个package,默认为$(BUILD_DIR)/$(PKG_NAME)
PKG_SOURCE - package的源码压缩包名(busybox-$(PKG_VERSION).tar.bz2)
PKG_SOURCE_URL - 从哪里下载package的源码
PKG_HASH - package的源码压缩包的校验和。MD5或SHA256格式,默认使用 SHA256,请参阅 script/download.pl
PKG_CAT - 如何解压缩源文件(zcat、bzcat、unzip)
PKG_BUILD_DEPENDS - 需要在此包之前构建的包。如果当前package在构建时需要依赖另一个package的文件或者库,则需要使用此选项指定依赖package的目录名称(即 openssl)而不是二进制包名称(即 libopenssl)。
PKG_CONFIG_DEPENDS - 指定哪些配置选项影响构建配置并应在更改时触发重新运行构建/配置
PKG_INSTALL - 将其设置为'1'将调用"make install"进行编译后的安装动作,并将安装目标路径前缀设置为PKG_INSTALL_DIR
PKG_INSTALL_DIR - 指定make install的目标路径如果是从git, bzr, svn等获取package源代码,还需要定义如下信息PKG_SOURCE_PROTO -获取package源码使用的协议(git, svn等)
PKG_SOURCE_URL -package源码存储库地址。URL方案必须与PKG_SOURCE_PROTO一致(例如git://),但现在大多数VCS都接受http://或https:// URL。
PKG_SOURCE_VERSION -基于哪个commit hash 获取package 源码
PKG_SOURCE_DATE—一个类似2019-09-01的日期,用于生成的tarball的名称中(uci-2019-09-01-415f9e48.tar.xz)
PKG_MIRROR_HASH -从源码存储库获取的tarball的SHA256校验(以前称为PKG_MIRROR_MD5SUM)
PKG_SOURCE_SUBDIR—从源码存储库获取的tarball临时存放目录,默认为$(PKG_NAME)-$(PKG_VERSION)

Package/

Package/用于定义package在menuconfig中的一些信息,常见的参数如下:

SECTION - (未使用)软件包类型
CATEGORY - package所在的menuconfig一级菜单(可以自定义)
SUBMENU - CATEGORY的下级菜单(可以自定义)
TITLE - menuconfig中对软件包的简短描述
DESCRIPTION -(已废弃)软件包的详细描述
URL - (可选)package的源网址(一般是提供这个package的官网,但不是直接下载package的网址)
MAINTAINER -(新软件包需要)package的联系人(Imre Kaloz <kaloz@openwrt.org>)
DEPENDS -(可选)此package依赖的其他package(目录,而不是package名字)
EXTRA_DEPENDS -(可选)运行时依赖项,不会被编译,只会添加到软件包控制文件中
PROVIDES - (可选)允许定义一个虚拟软件包,它可能由多个实际软件包提供
PKGARCH -(可选)将其设为 "all"(全部),以生成 "Architecture: all"(架构:全部)的软件包(见下文
USERID -(可选)在安装软件包时创建的用户名:组名对。(例如ubus=81:ubus=81

Package/<Package Name>/description

Package的详细描述信息,它将出现在menconfig的Help选项中。

Build/Prepare(可选)

定义编译之前的准备工作。
默认动作是解压源码并给解压后的源码打patch。如果未定义此参数,则会执行默认的动作。

Build/Configure (可选)

定义如何配置源码。
如果源代码存在configure命令,默认动作则会执行configure对源码进行配置。你也可以自定义此参数在编译之前进行一些自定义配置。

Build/Compile (可选)

定义如何编译源码。
在大多数情况下,不需要定义此参数,因为这时将使用默认值,该值将调用make。你也可以自定义此参加进行自定义编译。
这里需要特别注意:这一步不是定义源码该如何编译出二进制,而是定义进入哪个目录编译,需要携带哪些编译参数(-Wall,-g等等)。

Build/Install (可选)

定义如何安装编译后的产物。
默认动作是调用“make install”,前提是需要定义PKG_INSTALL:=1。
如果PKG_INSTALL:=1,但是源码的makefile中并没有提供install目标,会提示如下编译报错。

make[3]: *** No rule to make target 'install'.  Stop.

解决方案有两种:
1.自定义Build/Install参数,不使用make install进行安装
2.取消定义PKG_INSTALL:=1,在Build/InstallDev或者Package/install中实现安装步骤。

Build/InstallDev (可选)

定义如何安装编译后的产物,和Build/Install类似。

Build/Clean (可选)

用于清理package,默认只会删除编译目录。

Package/install(可选)

用于将文件复制到ipkg,ipkg由$(1)目录表示。
这里的文件可以是源码中的文件,也可以是编译产物。
注意这里不是调用make install进行安装的,只是用的cp、mv之类shell命令。
也可以使用上面Build/Install或者Build/InstallDev 方法进行安装,都可以达到同样的效果。

Package/preinst(可选)

opkg install xxx.ipk之前要执行的脚本。不要忘记包含#!/bin/sh。如果需要中止安装,让脚本返回false。

Package/postinst(可选)

opkg install xxx.ipk之后要执行的脚本。不要忘记包含#!/bin/sh。

Package/prerm(可选)

opkg remove xxx.ipk之前要执行的脚本。不要忘记包含#!/bin/sh。如果需要中止删除,请让脚本返回false。

Package/postrm(可选)

opkg remove xxx.ipk之后要执行的脚本。不要忘记包含#!/bin/sh。

小结

  • 之所以有些定义的前缀是 “Package/xxx”,而另一些定义的前缀是 “Build/xxx”,是因为同一份源代码可能生成多个二进制文件。
  • OpenWrt 的工作假设是每个Package Makefile只有一个源代码,但您可以根据需要使用源代码编译生成任意多个二进制文件。由于只需编译一次源代码,因此只有一组全局的"Build/xxx"定义,但您可以通过增加对BuildPackage的调用来添加任意数量的 "Package/xxx"的定义。
  • Build/InstallDev Build/Install以及Package/hello/install这三种方法作用是差不多的,在实际使用中,至少需要实现其中一种,因为编译产物需要安装到什么位置必须由我们自己决定。

files (可选)

这个目录存放package静态文件(如OpenWrt特定的初始化脚本或配置文件),这些静态文件的命名没有明确规定。

patches (可选)

该目录必须与Makefile放在同一个父目录中,目录名必须固定为小写的patchs,并且只能用于修改压缩包形式的源代码。

补丁文件必须采用统一的diff格式,并带有扩展名。文件名还必须带有数字前缀,以表示必须应用补丁文件的顺序。补丁文件名应简洁,避免使用ASCII字母数字和连字符以外的字符。

合法的补丁文件名如下所示:

000-patch-makefile.patch
010-backport-frobnicate-crash-fix.patch
999-add-local-hack-for-openwrt-compatibility.patch

src (可选)

这个目录是否存在取决于这个package是否需要源码以及源码是否在线下载的,如果需要源码且源码不是在线下载的,那就需要一个目录来存放源码,但这个目录比较自由,理论上可以放在任何地方。
如果你将源码放在Package Makefile同级的src目录下,那编译时会自动拷贝src/*$(PKG_BUILD_DIR),否则,你需要手动将源码拷贝到$(PKG_BUILD_DIR)

helloworld package示例

下面是一个Makefile的示例:

include $(TOPDIR)/rules.mkPKG_NAME:=helloworld
PKG_VERSION:=1.0.0
PKG_RELEASE:=1
PKG_LICENSE:=GPL-2.0
PKG_LICENSE_FILES:=GPL
#PKG_INSTALL:=1include $(INCLUDE_DIR)/package.mkdefine Package/helloSECTION:=Utilities CATEGORY:=UtilitiesSUBMENU:=appsDEPENDS:=TITLE:= example package part 1 
endefdefine Package/hello/descriptionA simple example package
endefdefine Package/worldSECTION:=Utilities CATEGORY:=UtilitiesSUBMENU:=appsDEPENDS:=TITLE:= example package part 2
endefdefine Package/world/descriptionA simple example package
endefdefine Build/Prepare$(Build/Prepare/Default)$(INSTALL_DIR) $(PKG_BUILD_DIR)/files[ ! -d ./files/ ] || $(CP) ./files/* $(PKG_BUILD_DIR)/files/
endef#define Build/Install
#	$(INSTALL_DIR) $(1)/etc/init.d
#	$(INSTALL_BIN) $(PKG_BUILD_DIR)/files/helloworld.init $(1)/etc/init.d/helloworld.init
#endefdefine Build/InstallDev$(INSTALL_DIR) $(1)/etc/init.d$(INSTALL_BIN) $(PKG_BUILD_DIR)/files/helloworld.init $(1)/etc/init.d/helloworld.init
endef#define Build/Clean
#	rm -rf $(PKG_BUILD_DIR)
#endefdefine Package/hello/install$(INSTALL_DIR) $(1)/usr/bin$(INSTALL_BIN) $(PKG_BUILD_DIR)/hello $(1)/usr/bin
endefdefine Package/world/install$(INSTALL_DIR) $(1)/usr/bin$(INSTALL_BIN) $(PKG_BUILD_DIR)/world $(1)/usr/bin
endef#define Package/hello/preinst
#    #!/bin/sh
#		echo "hello-preinst" 
#endef$(eval $(call BuildPackage,hello))
$(eval $(call BuildPackage,world))

helloworld会根据源码编译生成2个可执行文件,源码采用本地目录的方式。
#注释掉的部分都是非必要的,没有注释的部分也并非都是必要的,例如Build/InstallDev里面的步骤也可以放在Package/xxx/install里面做。

├── helloworld
│   ├── files   # 配置文件目录
│   │   └── helloworld.init
│   ├── Makefile
│   ├── patchs
│   └── src   # 源码文件
│       ├── hello.c
│       ├── makefile  # 这个源码的编译规则,需要自行编写
│       └── world.c# src/makefile  示例
all: hello  world
hello:$(CC) hello.c $(CFLAGS) -o hello
world:$(CC) world.c $(CFLAGS) -o world
clean:rm -rf hello.o hello world.o world

总结

OpenWrt 系统本质是一个package管理器(类似.deb or .rpm包管理),几乎所有的软件都对应一个package,package里面的Makefile文件非常重要,它的语法也比较特殊,在创建新的package时,Makefile文件尽量参考已有的package。
package Makefile和源码的makefile不是一回事,前者是定义Package的一些信息,后者是具体的编译规则,package Makefile的语法也比较灵活,大家可能要根据实际情况决定是否需要自定义某些参数。

参考

OpenWrt packages

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/21942.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【2023】XXL-Job 具体通过docker 配置安装容器,再通过springboot执行注册实现完整流程

【2023】XXL-Job 具体通过docker 配置安装容器&#xff0c;再通过springboot执行注册实现 一、概述二、安装1、拉取镜像2、创建数据库3、创建容器并运行3、查看容器和日志4、打开网页 127.0.0.1:9051/xxl-job-admin/ 三、实现注册测试1、创建一个SpringBoot项目、添加依赖。2、…

【uniapp】样式合集

1、修改uni-data-checkbox多选框的样式为单选框的样式 我原先是用的单选&#xff0c;但是单选并不支持选中后&#xff0c;再次点击取消选中&#xff1b;所以我改成了多选&#xff0c;然后改变多选样式&#xff0c;让他看起来像单选 在所在使用的页面上修改样式即可 <uni-d…

Zabbix分布式监控快速入门

目录 1 Zabbix简介1.1 软件架构1.2 版本选择1.3 功能特性 2 安装与部署2.1 时间同步需求2.2 下载仓库官方源2.3 Zabbix-Server服务端的安装2.3.1 安装MySQL2.3.1.1 创建Zabbix数据库2.3.1.2 导入Zabbix库的数据文件 2.3.2 配置zabbix_server.conf2.3.3 开启Zabbix-Server服务2.…

Elasticsearch:如何将整个 Elasticsearch 索引导出到文件 - Python 8.x

在实际的使用中&#xff0c;我们有时希望把 Elasticsearch 的索引保存到 JSON 文件中。在之前&#xff0c;我写了一篇管如何备份 Elasticsearch 索引的文章 “Elasticsearch&#xff1a;索引备份及恢复”。在今天&#xff0c;我们使用一种 Python 的方法来做进一步的探讨。你可…

如何使用vue ui创建一个项目?

首先打开cmd 输入vue ui 等待浏览器打开一个窗口&#xff0c;按照下图操作 在"功能页面"中&#xff0c;各个插件代表以下意思&#xff1a; Babel&#xff1a;Babel是一个JavaScript编译器&#xff0c;用于将ES6代码转换为向后兼容的JavaScript版本&#xff0c;以确保…

华为推出手机系统云翻新服务:什么是云翻新?如何使用?

华为手机系统云翻新是华为推出的一项功能&#xff0c;旨在通过云服务提供系统翻新的服务。它可以帮助用户对手机的系统进行优化和更新&#xff0c;以提高手机的性能和流畅度。具体而言&#xff0c;华为手机系统云翻新功能提供了免费的云空间&#xff0c;用户可以将手机中的系统…

Matlab对TMS320F28335编程--SVPWM配置互补PWM输出

前言 F28335中断 目的&#xff1a;FOC的核心算法及SVPWM输出&#xff0c;SVPWM的载波频率10kHz&#xff0c;SVPWM的每个周期都会触发ADC中断采集相电流&#xff0c;SVPWM为芯片ePWM4、5、6通道&#xff0c;配置死区 1、配置中断SVPWM进ADC中断&#xff0c;查上表知CPU1,PIE1 …

10分钟理解React生命周期

前言 学习React&#xff0c;生命周期很重要&#xff0c;我们了解完生命周期的各个组件&#xff0c;对写高性能组件会有很大的帮助。 一、简介 React /riˈkt/ 组件的生命周期指的是组件从创建到销毁过程中所经历的一系列方法调用。这些方法可以让我们在不同的时刻执行特定的…

数据可视化(六)多个子图及seaborn使用

1.多个子图绘制 #绘制多个子图 #subplot&#xff08;*args&#xff0c;**kwargs&#xff09; 每个subplot函数只能绘制一个子图 #subplots&#xff08;nrows&#xff0c;ncols&#xff09; #fig_add_subplot(行&#xff0c;列&#xff0c;区域) #绘制子图第一种方式 plt.subp…

算法刷题Day 55 判断子序列+不同的子序列

Day 55 动态规划 392. 判断子序列 动态规划 就是用求最长公共子序列的方法&#xff0c;最后在返回时判断长度 class Solution { public:bool isSubsequence(string s, string t) {int m s.size() 1, n t.size() 1;vector<vector<int>> dp(m, vector<int…

HTTP——五、与HTTP协作的Web服务器

HTTP 一、用单台虚拟主机实现多个域名二、通信数据转发程序 &#xff1a;代理、网关、隧道1、代理2、网关3、隧道 三、保存资源的缓存1、缓存的有效期限2、客户端的缓存 一台 Web 服务器可搭建多个独立域名的 Web 网站&#xff0c;也可作为通信路径上的中转服务器提升传输效率。…

aop实现加注解,自动存入数据库功能

1、建包、创类、建数据库 2 、数据库对应实体类 PcOperateLog import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;Data AllArgsConstructor NoArgsConstructor public class PcOperateLog {private Integer id;private String name;pri…

SQL 语句中 left join 后用 on 还是 where,区别大了!

目录 情况 小结 举例 情况 前天写SQL时本想通过 A left B join on and 后面的条件来使查出的两条记录变成一条&#xff0c;奈何发现还是有两条。 后来发现 join on and 不会过滤结果记录条数&#xff0c;只会根据and后的条件是否显示 B表的记录&#xff0c;A表的记录一定会显…

网络基础1

文章目录 网络基础11. 计算机网络背景1.1 网路发展1.2 认识 "协议" 2. 网络协议初识2.1 协议分层2.2 OSI七层模型2.3 TCP/IP五层(或四层)模型协议栈与OS的关系 3. 网络传输基本流程3.1 同一个局域网两台主机通信3.2 同一个路由器的两个子网通信 4. 网络中的地址管理4…

html学习10(字符实体)

1、在html中&#xff0c;某些字符是预留的。为了正确显示相应字符&#xff0c;需要使用字符实体。 2、字符实体的格式以&开头&#xff0c;后跟字符的别称。例如&#xff1a;小写符号用&lt表示。 3、html最常用的字符实体是不间断空格&#xff08;&nbsp&#xff0…

一文辨析,性能分析top命令中进程NI和PR

分析 Linux 服务器性能&#xff0c;首先想到的命令肯定是 top, 通过它&#xff0c;我们可以看到当前服务器资源使用情况和进程运行资源占用情况。 如果你想学习自动化测试&#xff0c;我这边给你推荐一套视频&#xff0c;这个视频可以说是B站播放全网第一的自动化测试教程&…

靶形数独

题目描述 小城和小华都是热爱数学的好学生&#xff0c;最近&#xff0c;他们不约而同地迷上了数独游戏&#xff0c;好胜的他们想用数独来一比高低。但普通的数独对他们来说都过于简单了&#xff0c;于是他们向 Z 博士请教&#xff0c;Z 博士拿出了他最近发明的“靶形数独”&am…

企业数字化转型:信息化还是数字化?

面对巨大的数字经济市场&#xff0c;全球大部分企业都开始了数字化转型进程&#xff0c;国内一半以上的企业已经将数字化转型视为下一步发展重点&#xff0c;并制定了清晰的数字化转型战略规划。 但是&#xff0c;相当一部分传统行业&#xff0c;如制造、金融、能源、化工等非数…

Dockerfile面试题(CMD、ENTRYPOINT与RUN命令对比)

目录 Dockerfile面试题 CMD、ENTRYPOINT与RUN命令对比 &#xff08;一&#xff09;CMD命令 &#xff08;二&#xff09;RUN命令 &#xff08;三&#xff09;ENTRYPOINT &#xff08;四&#xff09;RUN和CMD、ENTRYPOINT支持参数形式命令 &#xff1a; Dockerfile面试题 …

【M波段2D双树(希尔伯特)小波多分量图像去噪】基于定向M波段双树(希尔伯特)小波对多分量/彩色图像进行降噪研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…