当前位置: 首页 > news >正文

【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

相关文章:

【openwrt】package介绍

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

vue 封装一个鼠标拖动选择时间段功能

<template><div class"timeRange"><div class"calendar"><table><thead><tr><th rowspan"6" class"weekRow"><b>周/时间</b></th><th colspan"24"><…...

ubuntu22.0安装Barrier局域网共享鼠标键盘

ubuntu22.0安装Barrier局域网共享鼠标键盘 参考网站安装步骤客户端一直开启中解决 参考网站 https://idroot.us/install-barrier-ubuntu-22-04/ 安装步骤 sudo apt update sudo apt upgrade sudo apt install wget apt-transport-https gnupg2 software-properties-common s…...

ffmpeg常用功能博客导航

FFmpeg 是一个处理视频和音频内容的开源工具库&#xff0c;可以实现编码、解码、转码、流媒体和后处理等服务。 推荐博客&#xff1a; 常见命令和使用案例 用ffmpeg转mov为mp4格式 FFmpeg 常用命令 FFmpeg 常用命令编辑音/视频&#xff08;转换格式、压缩、裁剪、截图、切分合…...

shopee,lazada,etsy店群如何高效安全的管理

对于电商卖家来说&#xff0c;要经营多个店铺&#xff0c;管理多个账号是非常常见的操作。为了避免账号关联被平台识别出来&#xff0c;需要使用防关联的浏览器来进行操作 ​1、支持多平台 支持同时管理多个电商平台店铺&#xff0c;Shopee、Lazada、etsy、poshmark、vinted等&…...

【计算复杂性理论】证明复杂性(八):命题鸽巢原理(Propositional Pigeonhole Principle)的指数级归结下界

往期文章&#xff1a; 【计算复杂性理论】证明复杂性&#xff08;Proof Complexity&#xff09;&#xff08;一&#xff09;&#xff1a;简介 【计算复杂性理论】证明复杂性&#xff08;二&#xff09;&#xff1a;归结&#xff08;Resolution&#xff09;与扩展归结&#xff…...

使用DataX实现mysql与hive数据互相导入导出

一、概论 1.1 什么是DataX DataX 是阿里巴巴开源的一个异构数据源离线同步工具&#xff0c;致力于实现包括关系型数据库(MySQL、Oracle 等)、HDFS、Hive、ODPS、HBase、FTP 等各种异构数据源之间稳定高效的数据同步功能。 1.2 DataX 的设计 为了解决异构数据源同步问题&#xf…...

语音转录成文本:AI Transcription for mac

AI Transcription是一种人工智能技术&#xff0c;它可以将音频和视频文件转换成文本格式。这种技术可以帮助用户快速地将大量的音频和视频内容转换成文本格式&#xff0c;方便用户进行文本分析、搜索和编辑等操作。 以下是AI Transcription的几个特点&#xff1a; 高效性。AI …...

[nlp] TF-IDF算法介绍

&#xff08;1&#xff09;TF是词频(Term Frequency) 词频是文档中词出现的概率。 &#xff08;2&#xff09; IDF是逆向文件频率(Inverse Document Frequency) 包含词条的文档越少&#xff0c;IDF越大。...

一些感想,写在8月之前

最近换工作了&#xff0c;离开了一个奋斗了4年多的公司&#xff0c;现在在新公司&#xff0c;还在培训中&#xff0c;不那么忙了&#xff0c;就写写最近的想法吧。 因为最近一直在研究框架和搭项目框架&#xff0c;所以就想把一些工作上的过程记录下来&#xff0c;以备不时之需…...

推动数字经济高质量发展需破解三大挑战

随着信息技术的飞速发展&#xff0c;数字经济已成为全球经济发展的重要驱动力。数字经济以其高效、便捷、创新的特点&#xff0c;深刻改变着传统产业和商业模式&#xff0c;为经济发展带来新的活力和动力。然而&#xff0c;要实现数字经济的高质量发展&#xff0c;仍然面临着三…...

Pycharm工具Python开发自动添加注释(详细)

方法自动添加参数注释 定义了一个函数&#xff0c;在函数下面敲入了三个双引号后&#xff0c;enter回车并没有自动出现注释&#xff0c;如图&#xff1a; 解决办法 Pycharm中依次打开File —> Settings —> Tools —> Python Integrated Tools&#xff0c;如图&…...

RUST 有哪些整型?

在Rust中&#xff0c;有以下几种整型数据类型&#xff1a; i8 &#xff1a;有符号8位整型&#xff0c;取值范围为-128到127。u8 &#xff1a;无符号8位整型&#xff0c;取值范围为0到255。i16 &#xff1a;有符号16位整型&#xff0c;取值范围为-32768到32767。u16 &#xff1…...

【Python 实战】---- 批量识别图片中的文字,存入excel中【使用百度的通用文字识别】

分析 1. 获取信息图片示例 2. 运行实例 3. 运行结果 4. 各个文件的位置 实现 1. 需求分析 识别图片中的文字【采用百度的通用文字识别】;文字筛选,按照分类获取对应的文本;采用 openpyxl 实现将数据存入 excel 中。2. 获取 access_token 获取本地缓存的...

探索前端图片如何携带token进行验证

前言 图片在前端开发中扮演了重要的角色&#xff0c;它们不仅仅是美观的元素&#xff0c;还可以传递信息和激发用户的兴趣。随着应用场景的增多&#xff0c;前端开发人员就需要在图片加载过程中携带验证的信息。如 token&#xff0c;用于身份验证、权限控制等方面。通过在图片的…...

飞桨AI Studio可以玩多模态了?MiniGPT4实战演练!

MiniGPT4是基于GPT3的改进版本&#xff0c;它的参数量比GPT3少了一个数量级&#xff0c;但是在多项自然语言处理任务上的表现却不逊于GPT3。项目作者以MiniGPT4-7B作为实战演练项目。 创作者&#xff1a;衍哲 体验链接&#xff1a; https://aistudio.baidu.com/aistudio/proj…...

C++笔记之++i和i++是原子操作吗?

C笔记之i和i是原子操作吗&#xff1f; code review! 文章目录 C笔记之i和i是原子操作吗&#xff1f;1.i是原子操作吗&#xff1f;2.i是原子操作吗&#xff1f;3.前置递增和后置递增 1.i是原子操作吗&#xff1f; 2.i是原子操作吗&#xff1f; 3.前置递增和后置递增...

Pytest+Allure+Excel接口自动化测试框架实战

1. Allure 简介 简介 Allure 框架是一个灵活的、轻量级的、支持多语言的测试报告工具&#xff0c;它不仅以 Web 的方式展示了简介的测试结果&#xff0c;而且允许参与开发过程的每个人可以从日常执行的测试中&#xff0c;最大限度地提取有用信息。 Allure 是由 Java 语言开发…...

阿里云国际版账号注册常见问题汇总

公司现与阿里云国际站达成战略合作&#xff0c;为客户提供高品质、高性能、高可用的阿里云产品与服务&#xff0c;助力客户用云服务创造更多价值&#xff0c;达成业务转型、加速和创新&#xff0c;全面提升业务竞争力。助企业在各种业务场景中充分利用混合云基础设施进行优化。…...

Flowable基础

简介 Flowable 是 BPMN 的一个基于 java 的软件实现&#xff0c;不过 Flowable 不仅仅包括 BPMN &#xff0c;还有 DMN 决策表和 CMMN Case 管理引擎&#xff0c;并且有自己的用户管理、微服务 API 等一系列功能&#xff0c; 是一个服务平台。 官方手册&#xff1a; https://…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机

这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机&#xff0c;因为在使用过程中发现 Airsim 对外部监控相机的描述模糊&#xff0c;而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置&#xff0c;最后在源码示例中找到了&#xff0c;所以感…...

客户案例 | 短视频点播企业海外视频加速与成本优化:MediaPackage+Cloudfront 技术重构实践

01技术背景与业务挑战 某短视频点播企业深耕国内用户市场&#xff0c;但其后台应用系统部署于东南亚印尼 IDC 机房。 随着业务规模扩大&#xff0c;传统架构已较难满足当前企业发展的需求&#xff0c;企业面临着三重挑战&#xff1a; ① 业务&#xff1a;国内用户访问海外服…...

Java数组Arrays操作全攻略

Arrays类的概述 Java中的Arrays类位于java.util包中&#xff0c;提供了一系列静态方法用于操作数组&#xff08;如排序、搜索、填充、比较等&#xff09;。这些方法适用于基本类型数组和对象数组。 常用成员方法及代码示例 排序&#xff08;sort&#xff09; 对数组进行升序…...

ubuntu中安装conda的后遗症

缘由: 在编译rk3588的sdk时&#xff0c;遇到编译buildroot失败&#xff0c;提示如下&#xff1a; 提示缺失expect&#xff0c;但是实测相关工具是在的&#xff0c;如下显示&#xff1a; 然后查找借助各个ai工具&#xff0c;重新安装相关的工具&#xff0c;依然无解。 解决&am…...

Spring事务传播机制有哪些?

导语&#xff1a; Spring事务传播机制是后端面试中的必考知识点&#xff0c;特别容易出现在“项目细节挖掘”阶段。面试官通过它来判断你是否真正理解事务控制的本质与异常传播机制。本文将从实战与源码角度出发&#xff0c;全面剖析Spring事务传播机制&#xff0c;帮助你答得有…...