SPEC 基础知识
SPEC 基础知识 写 RPM 包的核心,不是命令多复杂,而是把“构建过程”和“最终安装内容”写清楚。 这篇文章以 rpmbuild 为主线,整理一份可直接落地的 SPEC 入门指南。 1. SPEC 文件是什么SPEC 是 RPM 的打包脚本与元数据描述文件。它决定了: 包叫什么、版本是多少。 构建时需要什么依赖。 代码如何编译、安装到临时目录。 最终哪些文件进 RPM 包。 可以理解成:元信息 + 构建脚本 + 打包清单。 2. 最小可用 SPEC 模板123456789101112131415161718192021222324252627282930313233Name: helloVersion: 1.0.0Release: 1%{?dist}Summary: A simple hello packageLicense: MITURL: https://example.com/helloSource0: %{name}-%{version}.tar....
SPEC file writing - Best Practices
SPEC file writing - Best Practices这篇是 SPEC 系列的“最佳实践清单”。 目标不是再讲语法,而是减少线上踩坑、提升包的可维护性。 1. 头部字段不要留空Summary、License、URL、%description 等信息必须完整。这些信息会直接体现在 rpm -qi 输出里,也是排障和审计的第一入口。 2. 头部字段对齐,降低阅读成本推荐统一列宽对齐: 123456Name: mydaemonVersion: 1.2.0Release: 1%{?dist}Summary: My daemon serviceLicense: MITURL: https://example.com/mydaemon 团队协作里,这种“无功能变化但提升可读性”的规范非常值。 3. 分段清晰,段内紧凑建议: 段与段之间空一行。 段内不要插入无意义空行。 注释聚焦“为什么”,不要重复“做了什么”。 4. 能用宏就不要写死路径避免硬编码 /usr、/et...
Makefile.am的例子
Makefile.am 的例子这篇用“能直接抄走改”的方式,整理 Automake 常见写法。如果你已经会写 Makefile,这篇重点是:如何把规则写进 Makefile.am,再由 Autotools 生成可移植构建系统。 1. 先理解三层关系 configure.ac:定义项目配置逻辑(检测依赖、生成哪些 Makefile)。 Makefile.am:声明各目录编译/安装规则。 configure + make:生成 Makefile.in/Makefile 后执行构建。 一句话:configure.ac 管“配置”,Makefile.am 管“目标与安装”。 2. 最小项目结构示例12345678myapp/ configure.ac Makefile.am src/ Makefile.am main.c include/ myapp.h 顶层 configure.ac: 123456789AC_INIT([myapp], [1.0.0], [you@example.com])AM_INIT_AUTOMAKE([foreign subdi...
How to write SPEC file
How to write SPEC file 如果说《SPEC 基础知识》解决“能打包”,这一篇解决的是“如何把 SPEC 写得可维护、可扩展、可发布”。 1. 先建立一个正确心智模型打包过程可以拆成三层: 上游构建系统(configure / Makefile)决定“会生成哪些文件”。 SPEC 的 %install 决定“这些文件安装到 %{buildroot} 的哪个路径”。 SPEC 的 %files 决定“最终哪些文件进入哪个 RPM 包”。 核心结论:SPEC 不负责创造文件,只负责组织和选择文件。 2. 从 Makefile 安装路径到 %files 的映射假设上游项目里有: 12scriptdir = $(libexecdir)/mydaemon/scriptsscript_SCRIPTS = conf/a.sh conf/b.sh conf/c.sh 执行 make install DESTDIR=%{buildroot} 后,文件会进入: 1%{buildroot}%{_libexecdir}/mydaemon/scripts/ 在 SPEC 中...
configure.ac介绍
configure.ac 介绍configure.ac 是 Autotools 的配置入口文件。它的作用是:在不同机器上探测编译环境,并生成可用的 configure 脚本与 Makefile。 可以把它理解成“构建前的环境协商脚本”。 参考: https://www.gnu.org/software/autoconf/manual/autoconf.html https://www.gnu.org/software/automake/manual/html_node/index.html 1. configure.ac 到底负责什么核心职责有 4 个: 定义项目元信息(名字、版本、最低工具版本)。 检测工具链、头文件、库、函数是否可用。 定义条件编译和可替换变量。 生成目标文件(config.h、各目录 Makefile、其他 .in 模板)。 2. 常见宏分组(按用途记忆)2.1. 项目初始化1234AC_PREREQ([2.69])AC_INIT([myapp], [1.0.0], [you@example.com])AC_CONFIG_SRCDIR([src...
automake基础
automake基础作为 Linux 下的程序开发人员,大家一定都遇到过 Makefile。用 make 命令来编译程序确实很方便。一般情况下,手工写一个简单 Makefile 并不难;但如果要写出一个符合自由软件惯例、可移植、可维护的 Makefile,就没那么容易了。 本文介绍如何使用 autoconf 和 automake 自动生成规范的构建文件。最终效果是像常见 GNU 程序一样,通过: ./configure make make install 完成构建与安装。 1. Makefile 介绍Makefile 用于自动化编译和链接。一个工程通常包含多个源文件,不是每次都需要全量重编译。Makefile 通过“依赖关系”判断哪些目标需要重新构建,从而节省时间。 手写 Makefile 的常见问题: 规则容易和本机环境绑定。 路径或变量变化后需要手工调整。 跨平台和多人协作维护成本高。 automake/autoconf 的价值在于: 你只需写少量声明式模板(configure.ac、Makefile.am)。 工具自动生成 configure 和 Makefil...
Jenkinsfile introduce
Jenkinsfile 是 CI/CD 流水线的“代码化配置文件”。 把构建、测试、发布流程写进仓库后,流水线就可以版本化、可复用、可审计。 1. Jenkinsfile 基本语法1.1. Pipeline 的定义方式Pipeline 通常有 3 种维护方式: 在 Blue Ocean 中可视化创建。 在 Jenkins 经典 UI 中直接配置脚本。 在代码仓库中维护 Jenkinsfile(推荐)。 最常见的是第 3 种:和代码一起评审、一起发布。 1.2. 一个最小可运行的声明式 Pipeline1234567891011121314151617181920212223242526272829pipeline { agent any environment { APP_NAME = "demo-app" } parameters { string(name: 'DEPLOY_ENV', defaultValue: 'staging', description: '部署环境') booleanParam(name: 'RUN_TEST', ...
Helm Introduction
Helm IntroductionHelm 是 Kubernetes 的包管理工具,可以把一组相关的 Kubernetes 资源打包成一个 Chart,并通过统一命令完成安装、升级、回滚与卸载。 1. Chart 基础1.1. 什么是 ChartChart 是一组描述 Kubernetes 资源的文件集合。你可以把它理解为“应用部署模板包”:既包含资源模板,也包含默认参数和值文件。 1.2. Chart 目录结构(Helm 3)12345678mychart/ Chart.yaml # Chart 元数据(必须) values.yaml # 默认配置(必须) charts/ # 依赖 chart 包(可选) templates/ # Kubernetes 模板文件目录(必须) templates/NOTES.txt # 安装后提示信息(可选) .helmignore # 打包时忽略规则(可选) Chart.lock # 依赖锁文件(可选) 2. C...
世上最好的共享内存
1. 宋宝华:世上最好的共享内存共享单车、共享充电宝、共享雨伞,世间的共享有千万种,而我独爱共享内存。 早期的共享内存,着重于强调把同一片内存,map到多个进程的虚拟地址空间(在相应进程找到一个VMA区域),以便于CPU可以在各个进程访问到这片内存。 现阶段广泛应用于多媒体、Graphics领域的共享内存方式,某种意义上不再强调映射到进程虚拟地址空间的概念(那无非是为了让CPU访问),而更强调以某种“句柄”的形式,让大家知道某一片视频、图形图像数据的存在并可以借助此“句柄”来跨进程引用这片内存,让视频encoder、decoder、GPU等可以跨进程访问内存。所以不同进程用的加速硬件其实是不同的,他们更在乎的是可以通过一个handle拿到这片内存,而不再特别在乎CPU访问它的虚拟地址(当然仍然可以映射到进程的虚拟地址空间供CPU访问)。 只要内存的拷贝(memcpy)仍然是一个占据内存带宽、CPU利用率的消耗大户存在,共享内存作为Linux进程间通信、计算机系统里各个不同硬件组件通信的最高效方法,都将持续繁荣。关于内存拷贝会大多程度地占据CPU利用率,这个可以最简单地尝试拷...
论一切都是文件之匿名inode
1. 宋宝华:论一切都是文件之匿名inode01 唯有文件得人心 当一个女生让你替她抓100只萤火虫,她一定不是为了折磨你,而是因为她爱上了你。当你们之间经历了无数的恩恩怨怨和彼此伤害,她再次让你替她抓100只萤火虫,那一定是因为她还爱着你。 为什么?因为这就是套路,是在下偶尔瞟一眼古装肥皂剧总结出来的套路。 Linux里面最大的套路,就是“一切都是文件”。爱一个人,就为她捉萤火虫;做一件事,就让它成为一个“文件”。 为什么自古深情留不住,唯有“文件”得人心呢?因为文件在用户态最直观的形式是随着一次open,获得一个fd,有了这个fd,长城内外,你基本可以为所欲为: 在本进程内,fd的最直观操作是open、close、mmap、ioctl、poll这些。 m map 让你具备把fd透射到内存的能力,所以你可以通过指针访问文件的内容。再者,这个mmap,如果底层透射的是framebuffer、V4L2、DRM等,则让我们具备了从用户态操作底层显存、多媒体数据等的能力;比如,无论是V4L2还是DRM,都支持把底层的dma_buf导出为fd。poll则提供给用户阻塞等待某事件...


