学习RPM制包的体会
创始人
2025-05-28 03:05:17

目录

聪明人的学习和工作的模式

制作RPM包,分为几步:

那么需要在事先准备一些信息


聪明人的学习和工作的模式

我见过一些聪明人的学习和工作模式。

我们这一代人,而临着每天都要学习新知识的困境。聪明的人,在学习之前,会审视自己的需求,然后理解上下文场景,然后,最重要的一步,是思考如果是自己去设计正要学习的工具,将如何来设计与实现。

制作RPM包,分为几步:

准备,编译,install。

分别对应于spec脚本的 

%prep, %build, %install

外部的环境,包括操作系统 ,编译环境,和配置工具。

这次我的需求是定制dpdk-20.11版本的rpm包。

那么需要在事先准备一些信息

1。 待编译的自定义的DPDK的源码;

2. 能够手工完成编译和安装。

2。 去网上寻找其它公司,例如redhat公司的spec库:Overview - rpms/dpdk - CentOS Git server

下载之后,找到相关的分支,相关的tag,然后下载下关的代码,完成制包的工作。

这些都没有什么困难。只是花时间。

思考如何验证与测试

先研究清楚,如何验证。

例如,我自己买了正版的beyond compare,将编译后的.so进行比较。

在将原始dpdk rpmbuild环境中的代码,换为自定义的dpdk之后,得到的编译.so文件,与手工编出来的并不一致。

后面我们重点说这个问题。

Linux的RPM机制的问题

一个聪明的人,需要去研究当前的工具和场景的问题。这不是为了挑毛病。

而是思考,当前这种问题的根源是什么。

你要知道,设计的人,也都是聪明人。

但是,千成不要停止在这里。聪明人,是站在其自身角度,未必对他人是友好的。

先说一下结论

对于dpdk这个包来讲,meson后面,什么参数都不加,反而比redhad提供的更好

这一大堆:

%define meson \export CFLAGS="${CFLAGS:-%__global_cflags}"       \export CXXFLAGS="${CXXFLAGS:-%__global_cxxflags}" \export FFLAGS="${FFLAGS:-%__global_fflags}"       \export FCFLAGS="${FCFLAGS:-%__global_fcflags}"    \export LDFLAGS="${LDFLAGS:-%__global_ldflags}"    \%{__meson}                                    \\\--buildtype=plain                         \\\--prefix=%{_prefix}                       \\\--libdir=%{_libdir}                       \\\--libexecdir=%{_libexecdir}               \\\--bindir=%{_bindir}                       \\\--sbindir=%{_sbindir}                     \\\--includedir=%{_includedir}               \\\--datadir=%{_datadir}                     \\\--mandir=%{_mandir}                       \\\--infodir=%{_infodir}                     \\\--localedir=%{_datadir}/locale            \\\--sysconfdir=%{_sysconfdir}               \\\--localstatedir=%{_localstatedir}         \\\--sharedstatedir=%{_sharedstatedir}       \\\--wrap-mode=%{__meson_wrap_mode}          \\\--auto-features=%{__meson_auto_features}  \\\%{_vpath_srcdir} %{_vpath_builddir}       \\\%{nil}

不如

%define meson \meson x86_64-redhat-linux-gnu

注意%define,只是定义了一个宏。

spec,大部分代码,是这些准备工作。反而prep,build,install,一般代码很少。

所以,上面的真实的代码是:

meson meson x86_64-redhat-linux-gnu 

或者你自己想要的目录:

meson mybuild

为什么会这样

这是因为linux系统的一直不好的习惯。

一个好的系统是什么样的?

1。 承认主动对象

2。 给以主动对象一定的自主权

3。 能够海纳百川地,理解各种主动对象的对个可配置参数。

但是linux,总是试图大而不当的统一。

这里最关键是这几句

%define meson \export CFLAGS="${CFLAGS:-%__global_cflags}"       \export CXXFLAGS="${CXXFLAGS:-%__global_cxxflags}" \export FFLAGS="${FFLAGS:-%__global_fflags}"       \export FCFLAGS="${FCFLAGS:-%__global_fcflags}"    \export LDFLAGS="${LDFLAGS:-%__global_ldflags}"    \

这些变量,都在这里定义:

/usr/lib/rpm/rpmrc

和macro文件中。

特别地, redhat自己建立了自己的。

这些就不是良好的设计。

原始的目标是,一台机器上,所有的RPM的GCC编译参数都是相同的。

那么,我想问,这个需求的合理性在哪里?

是不是我一个rpm包,没有用统一的编译参数就不能运行呢?这显然不成立。

例如,我想调试dpdk,难道 说,其它的包也编译为debug版吗?

而且,事实上,这里面存在bug: rpm 的 RPM_OPT_FLAGS 参数,被编译和链接,同时共用,这里导致了极为混乱的复杂。

结果是什么呢?

难怪人们又重新发明了一个轮子meson + ninja

meson之所以要被发明,就是要绕过这令人恼火的管得过宽的OS和rpmbuild,

然是,显然,redhat的工程师不么想。

他们显然是meson想消灭的存在,

结果,经过redhat的工程师的不懈努力,又重新将缰绳套在了meson上:

本来应该是这样:
meson mybuild

redhat一定要重新改回这样:

%define meson \export CFLAGS="${CFLAGS:-%__global_cflags}"       \export CXXFLAGS="${CXXFLAGS:-%__global_cxxflags}" \export FFLAGS="${FFLAGS:-%__global_fflags}"       \export FCFLAGS="${FCFLAGS:-%__global_fcflags}"    \export LDFLAGS="${LDFLAGS:-%__global_ldflags}"    \%{__meson}                                    \\\--buildtype=plain                         \\\--prefix=%{_prefix}                       \\\--libdir=%{_libdir}                       \\\--libexecdir=%{_libexecdir}               \\\--bindir=%{_bindir}                       \\\--sbindir=%{_sbindir}                     \\\--includedir=%{_includedir}               \\\--datadir=%{_datadir}                     \\\--mandir=%{_mandir}                       \\\--infodir=%{_infodir}                     \\\--localedir=%{_datadir}/locale            \\\--sysconfdir=%{_sysconfdir}               \\\--localstatedir=%{_localstatedir}         \\\--sharedstatedir=%{_sharedstatedir}       \\\--wrap-mode=%{__meson_wrap_mode}          \\\--auto-features=%{__meson_auto_features}  \\\%{_vpath_srcdir} %{_vpath_builddir}       \\\%{nil}

相关内容

热门资讯

Java发起同步和异步HTTP... 同步与异步概念辨析 同步(synchronous)和异步(...
Kubernetes安装与集群... 一、环境准备 1、机器环境前置条件 当前演示准备3台虚拟机环境,或者是3台阿里云服务器...
simscape仿真总结2-机... 最近用simscape进行机器人的仿真,记录和总结一下学习心得和踩过的坑。 参照B站...
Redis(一):数据结构-底... 前言 从本文开始,我将分享一下近期自学 Redis 的学习笔记,其中大部...
flask教程5:abort函... 文章目录一、abort()函数的使用1.传递状态码信息2.传递响应体消息二、自定义错误处理 app....
【玩转Jetson TX2 N... 1 VMware14 Workstation Pro安装 如果没有Ubuntu系统电脑,...
2023还有人不知道kuber... 文章目录Kubernetes(K8s)一、Openstack&VM1、**认识虚拟化****1.1*...
NOI2019模拟赛 T1牛油... 题目描述 牛油果是一种神秘的水果,其具有一个坚固程度x≥0x\geq 0x≥0...
嵌入式软件开发之Linux下C... 目录 前沿 Hello World! 编写代码 编译代码 GCC编译器  gcc 命...
云原生|Rancher与Ope... 目录一、Rancher(一)介绍(二)优点&...
如何突破卫星影像建模难点?重建... 日前,由重建大师生成的首个“珞珈三号01星”卫星影像三维模型一经发出,引...
L1-085 试试手气 L1... 我们知道一个骰子有 6 个面,分别刻了 1 到 6 个点。下面给你 6 个骰子的初始状...
SpringSecurity客... 概述 FilterChainProxy是spring-security的入口,包含默认...
数据结构--二叉树 目录1.树概念及结构1.1数的概念1.2数的表示2.二叉树概念及结构2.1二叉树的概念2.2数据结构...
Qt之QUrl和QUrlQue... QUrlQUrl 类提供了一个方便的接口使用 URLs。最常见的使用QUrl 的方式是通过构造函数来...
函数指针二三事 1 什么是函数指针? ​ 函数指针,顾名思义,它是一个指向...
[ 红队知识库 ] Windo... 🍬 博主介绍 👨‍🎓 博主介绍:大家好...
【PowerBI】PowerB... 目的: 陈述PowerBI连接Mysql数据库的坑。 方法1:直接使用【...
BI数据可视化|可自动刷新的可... BI数据可视化大屏和其他的BI报表一样,都是可用于日常的决策中,因此除了...
Linux 练习十二 (Lin... 文章目录1 计算机网络基础知识1.1 OSI参考模型和TCP/IP参考模型1.2 TCP 协议1.2...
SQL语言基础教学 | Mys... SQL语言基础教学SQL(Structured Query Languageÿ...
pandas数据分析(三) 书接pandas数据分析(二) 文章目录DataFrame数据处理与分...
DC-DC升压模块隔离高压稳压... 特点● 效率高达 80%● 2*2英寸标准封装● 单双电压输出● 价格低● 大于600V高压,稳压输...
Java【多线程基础2】 Th... 文章目录前言一、Thread类1, 构造方法2, 常用成员属性3, 常用成员方法3.1, start...
TDK| 电源——反激变压器设... 电源参数根据功率、输入输出的情况,我们选择反激电源拓扑。反激式变压器的优点有:1、 电...
Python:判断语句 目录一、布尔类型1.1定义1.2获取二、逻辑运算符2.1and运算符2.2or运算符2.2not运算...
协程池加disruptor加e... 先说一下disrutor和协程的实现。然后介绍服务器具体分析,以及迭代过程,项目困难,学到东西,压测...
selenium(2)----... 操作界面上的元素: 先选中元素再进行调用下面的方法 1)click(),点击对象 2)...
第九章:C语言数据结构与算法初... 系列文章目录 文章目录系列文章目录前言一、堆的定义二、堆的实现三、堆的接口函数1、初始化2、销毁3...
< Linux > 多线程(单... 目录 1、单例模式         饿汉方式实现单例模式         懒汉方式实现单例模式   ...