制作一个 rpm 软件包

首发日期 2024-04-30, 以下为原文内容:


本文以 ibrus (艾刷, 胖喵拼音 ibus 接口模块) 为例, 介绍 rpm 软件包的制作过程.


相关文章:

  • 《发布 AUR 软件包 (ArchLinux)》 https://blog.csdn.net/secext2022/article/details/136803790
  • 《多种双拼方案的实现》 https://blog.csdn.net/secext2022/article/details/136804091

目录

  • 1 问题背景
  • 2 创建 rpm 软件包
  • 3 测试
  • 4 总结与展望

1 问题背景

本文来源于胖喵拼音的一个问题 (issue): https://github.com/fm-elpac/pmim-ibus/issues/1

Fedora Kinoite 是一个 GNU/Linux 发行版本, 这个系统的特点是, 使用 rpm-ostree 来进行软件包管理 (系统升级).

  • https://fedoraproject.org/atomic-desktops/kinoite/
  • https://coreos.github.io/rpm-ostree/

所以 /usr 目录是只读的:

a2@fedora:~$ mount | grep /usr
/dev/sda3 on /usr type btrfs (ro,relatime,seclabel,compress=zstd:1,space_cache=v2,subvolid=258,subvol=/root)

注意这里的 ro.

由于 ibus 输入法框架的限制, 需要把配置文件 pmim_ibrus.xml 安装到 /usr/share/ibus/component 目录.

此时需要制作一个 rpm 软件包, 通过安装 rpm 软件包来安装这个配置文件.

  • https://docs.fedoraproject.org/en-US/fedora-kinoite/getting-started/#package-layering

系统版本信息:

a2@fedora:~$ rpm-ostree status
State: idle
Deployments:
● fedora:fedora/40/x86_64/kinoite
                  Version: 40.20240430.0 (2024-04-30T00:38:03Z)
                   Commit: 68a08da82e9303cc1fd5956a1cbbbc3675b2f0f076c4cf9b0413feb026b11096
             GPGSignature: Valid signature by 115DF9AEF857853EE8445D0A0727707EA15B79CC
a2@fedora:~$ uname -a
Linux fedora 6.8.7-300.fc40.x86_64 #1 SMP PREEMPT_DYNAMIC Wed Apr 17 19:21:08 UTC 2024 x86_64 GNU/Linux

ibus 版本:

a2@fedora:~$ rpm -qi ibus
Name        : ibus
Version     : 1.5.30~rc3
Release     : 1.fc40
Architecture: x86_64
Install Date: 2024年04月30日 星期二 08时29分30秒
Group       : Unspecified
Size        : 147304373
License     : LGPL-2.1-or-later
Signature   : RSA/SHA256, 2024年04月02日 星期二 22时52分24秒, Key ID 0727707ea15b79cc
Source RPM  : ibus-1.5.30~rc3-1.fc40.src.rpm
Build Date  : 2024年04月02日 星期二 22时25分13秒
Build Host  : buildhw-x86-07.iad2.fedoraproject.org
Packager    : Fedora Project
Vendor      : Fedora Project
URL         : https://github.com/ibus/ibus/wiki
Bug URL     : https://bugz.fedoraproject.org/ibus
Summary     : Intelligent Input Bus for Linux OS
Description :
IBus means Intelligent Input Bus. It is an input framework for Linux OS.

2 创建 rpm 软件包

主要参考资料: https://rpm-packaging-guide.github.io/

编写 rpm 描述文件 librush/rpm/ibrus.spec:

Name:       ibrus
Version:    0.1.0a3
Release:    1%{?dist}
Summary:    ibus module for pmim (a Chinese pinyin input method)
License:    LGPL-2.1-or-later OR GPL-3.0-or-later
URL:        https://github.com/fm-elpac/librush
Requires:   ibus

%description
librush: ibus module for pmim (a Chinese pinyin input method)

%prep
# TODO

%build
# skip

%install
mkdir -p %{buildroot}/usr/lib/pmim
install -Dm755 -t %{buildroot}/usr/lib/pmim %{_topdir}/SOURCES/ibrus
install -Dm644 -t %{buildroot}/usr/share/ibus/component %{_topdir}/SOURCES/pmim_ibrus.xml

%files
/usr/lib/pmim/ibrus
/usr/share/ibus/component/pmim_ibrus.xml

%changelog
# TODO

然后:

  • (1) 安装 toolbox: https://containertoolbx.org/

    版本信息:

    > toolbox --version
    toolbox version 0.0.99.5
    

    参考资料: https://wiki.archlinux.org/title/Toolbox

  • (2) 创建运行环境:

    > toolbox create -d fedora -r 40
    Image required to create toolbox container.
    Download registry.fedoraproject.org/fedora-toolbox:40? [y/N]: y
    Created container: fedora-toolbox-40
    Enter with: toolbox enter fedora-toolbox-40
    

    创建之后:

    > toolbox list
    IMAGE ID      IMAGE NAME                                    CREATED
    1b6661a009d9  registry.fedoraproject.org/fedora-toolbox:40  5 days ago
    
    CONTAINER ID  CONTAINER NAME       CREATED         STATUS   IMAGE NAME
    4a40c125ebbf  fedora-toolbox-40    52 seconds ago  created  registry.fedoraproject.org/fedora-toolbox:40
    
  • (3) 进入运行环境:

    > toolbox enter fedora-toolbox-40
    ⬢[s2@toolbox ~]$ type dnf
    dnf 是 /usr/bin/dnf
    ⬢[s2@toolbox ~]$
    
  • (4) 安装 rpm 开发工具:

    [s2@toolbox ~]$ sudo dnf install rpm-build rpm-devel rpmdevtools
    
  • (5) 初始化 rpm 编译环境:

    [s2@toolbox ~]$ rpmdev-setuptree
    

    初始的编译目录:

    [s2@toolbox ~]$ tree ~/rpmbuild
    /home/s2/rpmbuild
    ├── BUILD
    ├── RPMS
    ├── SOURCES
    ├── SPECS
    └── SRPMS
    
    6 directories, 0 files
    
  • (6) 将所需文件放在相应的位置:

    [s2@toolbox ~]$ tree ~/rpmbuild
    /home/s2/rpmbuild
    ├── BUILD
    ├── RPMS
    ├── SOURCES
    │   ├── ibrus
    │   └── pmim_ibrus.xml
    ├── SPECS
    │   └── ibrus.spec
    └── SRPMS
    
    6 directories, 3 files
    
  • (7) 编译 rpm 软件包:

    [s2@toolbox ~]$ rpmbuild -bb ~/rpmbuild/SPECS/ibrus.spec
    

    编译之后:

    [s2@toolbox ~]$ tree ~/rpmbuild
    /home/s2/rpmbuild
    ├── BUILD
    ├── BUILDROOT
    ├── RPMS
    │   └── x86_64
    │       └── ibrus-0.1.0a3-1.fc40.x86_64.rpm
    ├── SOURCES
    │   ├── ibrus
    │   └── pmim_ibrus.xml
    ├── SPECS
    │   └── ibrus.spec
    └── SRPMS
    
    8 directories, 4 files
    

    其中 ibrus-0.1.0a3-1.fc40.x86_64.rpm 就是制作好的 rpm 软件包.

    包含的文件:

    [s2@toolbox ~]$ rpm -qlp ~/rpmbuild/RPMS/x86_64/ibrus-0.1.0a3-1.fc40.x86_64.rpm
    /usr/lib/.build-id
    /usr/lib/.build-id/6f
    /usr/lib/.build-id/6f/ddc23c3dcf3a7ef8cb8800119bcfbeaaf60779
    /usr/lib/pmim/ibrus
    /usr/share/ibus/component/pmim_ibrus.xml
    

    软件包信息:

    [s2@toolbox ~]$ rpm -qip ~/rpmbuild/RPMS/x86_64/ibrus-0.1.0a3-1.fc40.x86_64.rpm
    Name        : ibrus
    Version     : 0.1.0a3
    Release     : 1.fc40
    Architecture: x86_64
    Install Date: (not installed)
    Group       : Unspecified
    Size        : 6403239
    License     : LGPL-2.1-or-later OR GPL-3.0-or-later
    Signature   : (none)
    Source RPM  : ibrus-0.1.0a3-1.fc40.src.rpm
    Build Date  : 2024年04月30日 星期二 09时52分16秒
    Build Host  : toolbox
    URL         : https://github.com/fm-elpac/librush
    Summary     : ibus module for pmim (a Chinese pinyin input method)
    Description :
    librush: ibus module for pmim (a Chinese pinyin input method)
    

3 测试

操作系统: Fedora Kinoite 40

  • (1) 安装 rpm 软件包:

    在这里插入图片描述

    a2@fedora:~$ sudo rpm-ostree install ibrus-0.1.0a3-1.fc40.x86_64.rpm
    Checking out tree 68a08da... done
    Enabled rpm-md repositories: fedora-cisco-openh264 updates fedora updates-archive
    Updating metadata for 'fedora-cisco-openh264'... done
    Updating metadata for 'updates'... done
    Updating metadata for 'fedora'... done
    Updating metadata for 'updates-archive'... done
    Importing rpm-md... done
    rpm-md repo 'fedora-cisco-openh264'; generated: 2023-12-11T14:43:50Z solvables: 4
    rpm-md repo 'updates'; generated: 2024-04-29T01:08:34Z solvables: 8720
    rpm-md repo 'fedora'; generated: 2024-04-14T18:51:11Z solvables: 74881
    rpm-md repo 'updates-archive'; generated: 2024-04-30T01:22:20Z solvables: 7344
    Resolving dependencies... done
    Checking out packages... done
    Running pre scripts... done
    Running post scripts... done
    Running posttrans scripts... done
    Writing rpmdb... done
    Writing OSTree commit... done
    Staging deployment... done
    Freed: 1.9 GB (pkgcache branches: 0)
    Added:
      ibrus-0.1.0a3-1.fc40.x86_64
    Changes queued for next boot. Run "systemctl reboot" to start a reboot
    a2@fedora:~$
    
  • (2) 重启系统.

    重启之后:

    a2@fedora:~$ rpm-ostree status
    State: idle
    Deployments:
    ● fedora:fedora/40/x86_64/kinoite
                      Version: 40.20240430.0 (2024-04-30T00:38:03Z)
                  BaseCommit: 68a08da82e9303cc1fd5956a1cbbbc3675b2f0f076c4cf9b0413feb026b11096
                GPGSignature: Valid signature by 115DF9AEF857853EE8445D0A0727707EA15B79CC
                LocalPackages: ibrus-0.1.0a3-1.fc40.x86_64
    
    a2@fedora:~$ rpm -qi ibrus
    Name        : ibrus
    Version     : 0.1.0a3
    Release     : 1.fc40
    Architecture: x86_64
    Install Date: 2024年04月30日 星期二 10时07分01秒
    Group       : Unspecified
    Size        : 6403239
    License     : LGPL-2.1-or-later OR GPL-3.0-or-later
    Signature   : (none)
    Source RPM  : ibrus-0.1.0a3-1.fc40.src.rpm
    Build Date  : 2024年04月30日 星期二 09时52分16秒
    Build Host  : toolbox
    URL         : https://github.com/fm-elpac/librush
    Summary     : ibus module for pmim (a Chinese pinyin input method)
    Description :
    librush: ibus module for pmim (a Chinese pinyin input method)
    
    a2@fedora:~$ ls -l /usr/share/ibus/component/
    总计 496
    -rw-r--r--. 3 root root    656 197011日 anthy.xml
    -rw-r--r--. 3 root root    421 197011日 dconf.xml
    -rw-r--r--. 3 root root    465 197011日 gtkextension.xml
    -rw-r--r--. 3 root root    428 197011日 gtkpanel.xml
    -rw-r--r--. 3 root root    904 197011日 hangul.xml
    -rw-r--r--. 3 root root   1941 197011日 libpinyin.xml
    -rw-r--r--. 3 root root   1165 197011日 libzhuyin.xml
    -rw-r--r--. 3 root root    625 197011日 m17n.xml
    -rw-r--r--. 2 root root    857 197011日 pmim_ibrus.xml
    -rw-r--r--. 3 root root 464835 197011日 simple.xml
    -rw-r--r--. 3 root root    751 197011日 typing-booster.xml
    

在这里插入图片描述

ibus 配置界面中已经出现了 胖喵拼音.

在这里插入图片描述

输入测试.

4 总结与展望

通过制作一个 rpm 软件包, 胖喵拼音 实现了对基于 rpm-ostree 系统的支持.

如果 ibus 输入法框架做出改进, 支持在用户级别 (而不是系统级别) 安装新的输入法, 就不用这么麻烦了.

对比 AUR (ArchLinux) 和 RPM (Fedora) 软件包格式, 窝还是觉得 AUR 的打包更加简单方便一些.


彩蛋:

最近胖喵拼音新增了一个可选的词库, 数据来自于 清华大学开放中文词库 (THUOCL) http://thuocl.thunlp.org/

包含约 11 万个词.

体验地址: https://github.com/fm-elpac/pmim-data-thuocl


本文使用 CC-BY-SA 4.0 许可发布.

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Redisson分布式锁,重试锁和锁续命的原理

RedissonLock 锁重试原理 tryLock有三个三个参数,第一个是等待时间,第二个是锁失效后自动释放的时间,不填默认为-1,第三个是时间单位; 当设置了第一个参数,那这个锁就成了可重试锁;获取锁失败后&#xff0c…

人工智能|深度学习——多模态条件机制 Cross Attention 原理及实现

一、引入 虽然之前写过 Attention 的文章,但现在回头看之前写的一些文章,感觉都好啰嗦,正好下一篇要写的 Stable Diffusion 中有 cross-attention,索性就再单拎出来简单说一下 Attention 吧,那么这篇文章的作用有两个&…

图搜索算法详解与示例代码

在计算机科学领域,图搜索算法是一类用于在图数据结构中查找特定节点或路径的算法。图搜索算法在许多领域都有着广泛的应用,包括网络路由、社交网络分析、游戏开发等。本文将详细介绍几种常见的图搜索算法,包括深度优先搜索(DFS&am…

大数据技术就业和发展前景怎么样

大数据技术的就业和发展前景极为乐观,具有行业需求旺盛、就业多样性、可持续发展潜力等特点, 上大学网 (www.sdaxue.com)整理出了大数据技术的就业和发展前景以下几个关键趋势,供大家参考! 行业需求旺盛&…

链表例题(分割链表)

链接: . - 力扣(LeetCode) 题目描述: 即将小于特定值的节点放在前面,大于特定值的节点接在后面 思路: 我们可以创建两个链表分别存放大于的值和小于的值。5个变量(记录链表当前位置的指针st…

【开发技巧 | 第一篇】Typora快捷键方式给字体添加颜色

文章目录 1.Typora快捷键方式给字体添加颜色1.1下载并安装AutoHotkey1.2新建ahk脚本文件1.3运行ahk脚本文件1.4小结 1.Typora快捷键方式给字体添加颜色 1.1下载并安装AutoHotkey 点击下载: https://autohotkey.com/download/ahk-install.exe下载安装包,执行安装&a…

前端开发攻略---介绍HTML中的<dialog>标签,浏览器的原生弹框。

1、演示 2、介绍 <dialog> 标签用于定义对话框&#xff0c;即一个独立的窗口&#xff0c;通常用来显示对话框、提示框、确认框等弹出式内容。在对话框中&#xff0c;可以包含文本、表单元素、按钮等内容&#xff0c;用户可以和这些内容进行交互。 3、兼容性 4、示例代码 …

02 spring-boot+mybatis+elementui 的登录,文件上传,增删改查的入门级项目

前言 主要是来自于 朋友的需求 项目概况 就是一个 学生信息的增删改查 然后 具体到业务这边 使用 mybatis xml 来配置的增删改查 后端这边 springboot mybatis mysql fastjson hutool 的一个基础的增删改查的学习项目, 简单容易上手 前端这边 node14 vue element…

ZABAPGIT问题,导入github上的程序包时报 DBSQL_DUPLICATE_KEY_ERROR

跟踪程序发现在94050行 INSERT seocompotx FROM TABLE it_descriptions 报的错 刚开始&#xff0c;不想着改动他&#xff0c;把seocompotx 表的数据做下指定清楚&#xff0c;但是5次清楚后&#xff0c;果断注释掉 改成 MODIFY seocompotx FROM TABLE it_descriptions。 在用…

算法训练营第十天 | LeetCode 232 用栈实现队列、LeetCode 225 用队列实现栈

栈的实现有顺序表和链式表两种&#xff0c;也就是数组和链表实现。 其中抽象栈类的私有成员函数有operator的重载函数和stack的构造函数&#xff0c;为了保护栈的构造和拷贝被保护。公有成员函数有Stack()&#xff0c;~Stack()&#xff0c;clear()&#xff0c;push()&#xff…

解决Redis的键值前出现类似\xAC\xED\x00\x05t\x00*这样的字符序列

文章目录 1.问题2.解决方法3.StringRedisTemplate和RedisTemplate的区别 1.问题 在使用RedisTemplate对Redis进行操作时,发现Reids键值对前有\xAC\xED\x00\x05t\x00*这样的字符序列 如图所示: 虽说不影响使用,但是听影响观感的 2.解决方法 查找了很多方法,可以指定RedisTem…

数据结构实验--实验02 栈的应用(数制转换及回文判断)

一、实验内容 二、算法实现 1、用栈的特性实现进转换的思路&#xff1a;参考手算求进制转换的思路——除r取余法&#xff0c;这里的r表示基数&#xff0c;8进制的基数就是8&#xff0c;那么将十进制数转换成8进制数手算的方法就是除8取余法&#xff0c;具体手算方法如图&#…

在安装有Acer软件保护卡的电脑上安装PRCS6

PRCS6下载地址https://www.yuque.com/u33774918/pqzsy8/gdo8n6hibxgzsghw 第一步&#xff0c;电脑开机进入windows系统 第二步&#xff0c;解压PRCS6到电脑桌面 第三步&#xff0c;打开电脑桌面的PRCS6文件夹&#xff0c;双击‘点我安装’&#xff0c;开始安装 第四步&…

windows浅尝NW.js

windows浅尝NW.js 在本指南中&#xff0c;我们将详细介绍如何在windows上部署NW.js,实现应用的构成、启动方式、开发环境 环境部署 首先我们需要从官网下载对应的压缩包 (https://nwjs.io/downloads/) 下载完成后解压&#xff0c;可以看到对应的文件目录 然后我们运行目录下…

数据结构与算法实验题五道 A一元多项式的求导 B还原二叉树 C 六度空间 D 基于词频的文件相似度 E 模拟excel排序

A (1) 输入格式说明&#xff1a; 以指数递降方式输入多项式非零项系数和指数&#xff08;绝对值均为不超过1000的整数&#xff09;。数字间以空格分隔。 (2) 输出格式说明&#xff1a; 以与输入相同的格式输出导数多项式非零项的系数和指数。数字间以空格分隔&#xff0c;但…

ffmpeg中stream_loop参数不生效原因分析

问题 使用ffmpeg把一个视频文件发布成一个rtmp流&#xff0c;并设置成循环推流&#xff0c;此时需要使用参数stream_loop&#xff0c;命令如下: ffmpeg.exe -stream_loop -1 -re -i D:\tools\ffmpeg-5.1.2\bin\sei.h264 -c copy -f flv -safe 0 rtmp://localhost:1935/live/te…

【智能算法】鹦鹉优化算法(WO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2024年&#xff0c;J Lian等人受到鹦鹉学习行为启发&#xff0c;提出了鹦鹉优化算法&#xff08;Parrot Optimizer, PO&#xff09;。 2.算法原理 2.1算法思想 PO灵感来自于在驯养的鹦鹉中观察到的…

go稀疏数组

稀疏数组 稀疏数组 稀疏数组 package testimport ("encoding/json""fmt""io/ioutil""log""reflect""testing" )type ValNode struct {Row int json:"row"Col int json:"col"Val int json:&qu…

分布式与一致性协议之Raft算法与一致哈希算法(一)

Raft算法 Raft与一致性 有很多人把Raft算法当成一致性算法&#xff0c;其实它不是一致性算法而是共识算法&#xff0c;是一个Multi-Paxos算法&#xff0c;实现的是如何就一系列值达成共识。并且&#xff0c;Raft算法能容忍少数节点的故障。虽然Raft算法能实现强一致性&#x…

黑马 - websocket搭建在线聊天室

这里写自定义目录标题 一、消息推送常见方式二、websocket 是什么&#xff1f;三、websocket api的介绍1、客户端 &#xff08;浏览器&#xff09; 四、实现在线聊天室1、需求2、聊天室流程分析3、消息格式4、代码实现 一、消息推送常见方式 1、轮训方式 2、SSE&#xff08;…