资讯动态

Patches for open-adventure on SerenityOS

发布时间:2026/9/13 10:33:25 来源:尧图企业网站定制
Patches for open-adventure on SerenityOS【免费下载链接】serenityThe Serenity Operating System 项目地址: https://gitcode.com/GitHub_Trending/se/serenity0001-Use-libeditline-instead-of-libedit.patchUse libeditline instead of libedit它精确描述了两件事 - **补丁目标端口**open-adventure对应目录 [Ports/open-adventure](https://link.gitcode.com/i/e0a012ae8f3c8cffea203da8a4f36b20) - **补丁核心意图**把上游对 GNU libedit 的依赖替换为 libeditline。 这份 ReadMe.md 并非手写的孤立文档而是 SerenityOS 端口体系里的一种约定每个带补丁的端口目录下patches/ 文件夹都会配一份同名说明文件用于快速向维护者与读者交代为什么要打补丁、每份补丁做什么。类似的文档遍布其他端口例如 [Ports/SDL2/patches/ReadMe.md](https://link.gitcode.com/i/3b0824881a2b36b639869ab757cf3fb5)、[Ports/RetroArch/patches/ReadMe.md](https://link.gitcode.com/i/55f9d0d0193caadcefea6521caac2c22) 等格式完全一致。 ## 为什么需要这份补丁libedit 与 libeditline 的取舍 要理解补丁的必要性先看端口脚本声明的依赖关系。[Ports/open-adventure/package.sh](https://link.gitcode.com/i/20e98169e142f1d82a9f54e30d5cc453) 中 depends 数组明确写着 editline bash portopen-adventure version1.22 files( https://gitlab.com/esr/open-adventure/-/archive/${version}/open-adventure-${version}.zip#f81b69edb1aed61cfcbceef02173d217527e83b22a867ccdf8d65936ab9b05db ) depends( editline )即 SerenityOS 的端口树里提供的是 Ports/editline版本 2.1.0来自 troglobit 维护的 editline 实现并不提供 GNU libedit 端口。而上游 open-adventure 的构建脚本默认通过pkg-config查找libedit并在三个源码文件中包含editline/readline.h头文件。两者在头文件路径与链接库名上都不一致直接编译必然失败。此外SerenityOS 内核与用户态遵循自己的平台约定上游 Makefile 里针对 macOS 的-ledit特判LLVM/Clang 链接修正在 Serenity 上毫无意义属于应当被裁剪的噪音。这份补丁正是为弥合这些差异而生——它不是功能增强而是平台适配保持 open-adventure 的行为不变仅把命令行编辑的后端库从 libedit 换成 SerenityOS 实际打包的 libeditline。补丁逐段解析补丁文件 Ports/open-adventure/patches/0001-Use-libeditline-instead-of-libedit.patch 由git format-patch生成头部的From 0000... Mon Sep 17 00:00:00 2001是 format-patch 的零提交占位特征作者署名 Ninad Sachania日期 2024-11-14。它共改动 4 个文件Makefile、cheat.c、main.c、misc.c统计为 6 行插入、12 行删除。Makefile切换链接库与头文件搜索路径补丁对Makefile的核心改动是把pkg-config探测的目标从libedit换成libeditline-LIBS$(shell pkg-config --libs libedit) -INC$(shell pkg-config --cflags libedit) - -# LLVM/Clang on macOS seems to need -ledit flag for linking -UNAME_S : $(shell uname -s) -ifeq ($(UNAME_S),Darwin) - LIBS -ledit -endif LIBS$(shell pkg-config --libs libeditline) INC$(shell pkg-config --cflags libeditline)技术要点有三LIBS/INC通过pkg-config动态获取链接参数与编译参数不再写死而是依赖系统安装的libeditline.pc元数据文件输出-leditline与-I...路径。这意味着目标系统必须预装 editline 的 pkg-config 元数据这正是端口依赖链的设计意图删除 macOS 分支上游针对 Darwin 平台用 LLVM/Clang 链接时需要-ledit的特判代码被整段移除因为 SerenityOS 使用自己的交叉编译工具链与 libc该分支既不适用也是死代码未改动的编译行CCFLAGS中保留-stdc99 -Wall -Wextra -Werror -D_DEFAULT_SOURCE -O2 -D_FORTIFY_SOURCE2 -fstack-protector-all说明补丁只做平台适配不干预上游的编译选项与安全加固策略。头文件包含从 editline/readline.h 到 editline.hlibeditBSD libedit / NetBSD editline习惯将兼容头文件放在editline/readline.h子路径下而 SerenityOS 打包的 libeditline 2.1.0 把声明直接放在顶层editline.h。补丁对三个源文件做了统一替换cheat.c与main.c各 1 处-#include editline/readline.h #include editline.hmisc.c1 处并顺带规整了头文件顺序#include ctype.h -#include editline/readline.h #include stdio.h #include editline.h #include inttypes.h #include stdarg.h -#include stdio.h #include stdlib.h #include string.h #include strings.h注意misc.c的改动并非简单替换补丁把原先就存在但位置靠后的#include stdio.h提前与新增的#include editline.h一起按字典序归位符合 C 源码头文件排序的整洁要求。这种顺手整理在 SerenityOS 端口补丁中很常见因为端口补丁需要长期被社区维护可读性同样重要。功能层面的等价性从调用面看open-adventure 使用 libedit 提供的readline/add_history等命令行编辑 API用于冒险游戏的指令输入而 libeditline 是 troglobit 维护的、提供相同 readline 风格 API 的轻量实现二者函数签名兼容。因此补丁只改声明位置与链接目标不改任何函数调用代码——这是判断此类移植补丁是否正确的关键信号若改动波及业务逻辑说明两库 API 并不等价移植风险会显著上升。补丁如何被自动应用patch 机制的源码级还原补丁文件只是静态描述真正把改动落到 open-adventure 源码树上的是 Ports/.port_include.sh 中的patch_internal()函数。它被do_patch调用逻辑如下节选自 Ports/.port_include.shpatch_internal() { if [ -n ${IN_SERENITY_PORT_DEV:-} ]; then return fi # patch if it was not yet patched (applying patches multiple times doesnt work!) if [ -d ${PORT_META_DIR}/patches ]; then for filepath in ${PORT_META_DIR}/patches/*.patch; do filename$(basename $filepath) if [ -f $workdir/.${filename}_applied ]; then continue fi if [ -e ${workdir}/.git ]; then run git am --keep-cr --keep-non-patch ${filepath} else run patch -p$patchlevel $filepath run touch .${filename}_applied fi done fi ... }从这段代码可以提炼出四条可复用的规则幂等保护每个补丁应用成功后会在$workdir默认$port-$version即open-adventure-1.22下创建.${filename}_applied标记文件下次运行时直接跳过避免重复打补丁破坏源码树双通道应用若工作目录是 git 仓库则走git am --keep-cr --keep-non-patch保留 CR 与提交信息便于format-patch往返否则回退到经典patch -p$patchlevel其中patchlevel默认1见 Ports/.port_include.sh对应补丁内a/Makefile、b/Makefile前缀剥一层目录的路径格式开发模式豁免IN_SERENITY_PORT_DEV环境变量存在时直接跳过自动打补丁因为dev模式见下文已把补丁以 git 提交的形式导入目录约定补丁统一放在${PORT_META_DIR}/patches/*.patch即 Ports/open-adventure/patches 目录文件名匹配*.patch通配。ReadMe.md 从哪来补丁说明的自动生成机制Ports/open-adventure/patches/ReadMe.md可以由脚本自动生成而非手工维护。同一份 Ports/.port_include.sh 中定义了do_generate_patch_readmePorts/.port_include.sh其流程是遍历patches/*.patch对每份补丁调用git mailinfo解析出提交主题与正文即 commit message过滤掉Co-Authored-By:行后按固定模板写入## 补丁文件名 提交主题 提交正文若端口目录已有ReadMe.md会交互式询问是否覆盖N/y若patches/目录为空则自动删除ReadMe.md。对照 open-adventure 的实例0001-Use-libeditline-instead-of-libedit.patch的提交主题是 Use libeditline instead of libedit与补丁内Subject:行一致提交正文为空因此生成的ReadMe.md恰好是标题 一句主题描述与我们在文档开头看到的内容完全吻合。这解释了为什么这份说明文档如此简短——它不是残缺而是模板化的元数据摘要。触发再生成的方式有两种执行./package.sh generate_patch_readme命令Ports/.port_include.sh 中的parse_arguments将子命令映射到do_generate_patch_readme或在dev模式下退出时被自动调用见下节。dev 模式迭代补丁的推荐工作流对需要长期维护、跟随上游版本升级的端口Ports/README.md 建议使用./package.sh dev进入开发会话。其机制同样定义在 Ports/.port_include.sh 的do_devPorts/.port_include.sh中把源码工作目录初始化为 git 仓库提交基线并打source标签用git am --keep-cr --keep-non-patch --3way逐份导入patches/*.patch任一补丁应用失败会直接落入交互 shell 让你手工解决冲突打patched标签作为已补丁参考点用户退出 shell 后脚本比较patched与当前HEAD的哈希只要工作区有改动就自动用git format-patch --no-numbered --zero-commit --no-signature --full-index重新导出补丁并同步再生成ReadMe.mdPorts/.port_include.sh。这套闭环保证了补丁永远与最新源码保持同步ReadMe.md描述也始终与补丁实际内容一致。对本补丁而言若上游 open-adventure 未来升级版本开发者只需./package.sh dev处理冲突、重新提交文档即可自动更新。从补丁到可运行完整构建链路补丁最终服务于 open-adventure 的端到端移植。以 SerenityOS 源码目录为根标准安装流程是cd Ports/open-adventure ./package.sh不带参数时等价于依次执行installdepends、fetch、patch、configure、build、installPorts/.port_include.sh 中的do_all。结合 open-adventure 的 package.sh各阶段要点如下阶段行为关键证据installdepends先安装editline依赖端口2.1.0depends(editline)逻辑见 Ports/.port_include.shfetch下载open-adventure-1.22.zip并按 SHA256f81b69...b05db校验后解压files(...)条目patch遍历patches/*.patch应用0001-Use-libeditline-instead-of-libedit.patchpatch_internal()见上文configureopen-adventure 是纯 Makefile 工程useconfigure未开启直接跳过Ports/.port_include.sh 中do_configure的跳过分支buildexport PKG_CONFIG_PATH${SERENITY_INSTALL_ROOT}/usr/local/lib/pkgconfig/后执行makeopen-adventure 的build()函数installmkdir -p .../usr/local/bin并把advent复制到该目录open-adventure 的install()函数值得强调的是build()中的一行export PKG_CONFIG_PATH${SERENITY_INSTALL_ROOT}/usr/local/lib/pkgconfig/【免费下载链接】serenityThe Serenity Operating System 项目地址: https://gitcode.com/GitHub_Trending/se/serenity创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价