ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

`0001-Don-t-build-misc-stuff.patch`

`0001-Don-t-build-misc-stuff.patch` 0001-Don-t-build-misc-stuff.patch【免费下载链接】serenityThe Serenity Operating System 项目地址: https://gitcode.com/GitHub_Trending/se/serenityDont build misc stuffSkip building the examples, docs and avoid the checks.该补丁的核心意图一句话即可概括**跳过 examples、docs 等附属内容的构建并避免运行 checks测试**。之所以需要这样做是因为 SerenityOS 是一个从零实现的类 Unix 操作系统其 libc、shell、工具链与 GNU/Linux 存在差异GNU m4 源码树中大量面向开发者和宿主平台的目录示例、文档、国际化、测试套件在移植时既无必要又会引入兼容性负担因此直接裁剪。 ## 补丁全文解析SUBDIRS 裁剪 补丁文件 [Ports/m4/patches/0001-Don-t-build-misc-stuff.patch](https://link.gitcode.com/i/72b567794eb232571ad1823ca7ecccde) 由开发者 AnicJov 于 2021 年 3 月提交改动极小却非常精准它同时修改了 Makefile.amautomake 源文件与 Makefile.inconfigure 生成 Makefile 的模板将顶层目录列表从 7 项收缩为 3 项 diff -SUBDIRS . examples lib src doc checks po tests SUBDIRS . lib src对Makefile.am与Makefile.in做同步修改是 GNU 构建系统移植的关键细节automake 生成的Makefile.in通常不随发布包重新生成configure 脚本直接基于Makefile.in生成最终Makefile因此只改.am而不改.in实际构建时裁剪不会生效。同时修改两者可确保无论走 automake 再生成流程还是直接 configure行为一致。被裁掉的子目录各自承担什么examplesm4 的示例程序面向教学演示与运行时无关docTexinfo 格式的文档源构建会引入 makeinfo 等文档工具依赖而这些工具未必存在于 SerenityOS 的交叉编译环境中checksm4 自带的测试套件check 目标在移植初期这些测试往往因系统差异而无法全部通过且运行测试需要构建中间产物之外的大量辅助脚本pogettext 国际化翻译目录需要 msgfmt 等工具生成.mo消息文件tests功能测试目录与checks一样属于验证环节而非交付内容。裁剪后仅保留.顶层、libgnulib 兼容库、srcm4 本体恰好构成编译出可执行m4二进制的最小集合编译时间与失败面都大幅收窄。这正是补丁提交信息中 Skip building the examples, docs and avoid the checks 的字面含义与工程动机。package.sh端口构建的入口配置补丁本身只是裁剪真正把 m4变成一个 SerenityOS 端口的是 Ports/m4/package.sh全文如下#!/usr/bin/env -S bash ../.port_include.sh portm4 version1.4.20 files( mirror://gnu/m4/m4-${version}.tar.gz#6ac4fc31ce440debe63987c2ebbf9d7b6634e67a7c3279257dc7361de8bdb3ef ) useconfiguretrue # Stack overflow detection needs siginfo and sbrk, neither of which we support export M4_cv_use_stackovfno逐项拆解shebang 与port/version脚本以 Ports/.port_include.sh 作为解释器执行声明端口名为m4、版本1.4.20二者组合出默认工作目录m4-1.4.20见.port_include.sh中: ${workdir:$port-$version}。files使用mirror://gnu/...镜像协议定位 GNU 官方发布源并附带 64 位 SHA256 校验值。.port_include.sh中的FILES_SIMPLE_PATTERN正则^(https?:\/\/.|mirror://[^/]/.)#([0-9a-f]{64})$会解析该条目下载后以 sha256sum 严格校验防止源码被篡改或下载损坏。useconfiguretrue开启 configure 步骤。.port_include.sh的默认configure函数会执行./configure --host${SERENITY_ARCH}-serenity即以 SerenityOS 作为交叉编译目标主机。M4_cv_use_stackovfno这是 m4 的 autoconf 缓存变量。注释点明了根因——m4 的栈溢出stack overflow检测机制依赖siginfo与sbrk而 SerenityOS 当时均不支持。将该变量预置为no会写入 config.cache使 configure 跳过对这两项能力的探测避免在缺失的系统调用上编译失败或误报。这是移植中用 configure 缓存变量主动关停不支持特性的典型手法与补丁裁剪一脉相承。补丁是如何被自动应用的补丁不会由开发者手工打入而是由端口构建框架统一处理。在 Ports/.port_include.sh 的patch_internal函数中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关键机制有三点幂等标记每个补丁应用成功后会在工作目录生成.0001-Don-t-build-misc-stuff.patch_applied标记文件后续构建检测到该文件即跳过避免重复打补丁导致冲突。两种应用路径若源码目录是 git 仓库dev模式会初始化走git am保留补丁提交元数据普通构建则用patch -p1应用patchlevel默认为 1恰好匹配本补丁中a/、b/前缀的 diff 格式。自动编排执行./package.sh不带参数时构建流程按installdepends → fetch → patch → configure → build → install顺序进行见.port_include.sh的do_all补丁在 configure 之前落地保证裁剪在配置阶段就已生效。使用dev模式迭代补丁当 m4 上游升级、或需要在系统上验证新特性时可进入端口开发模式cd Ports/m4 ./package.sh devdo_dev会拉取源码、以git am引导式地应用全部补丁应用失败会直接掉入交互 shell 供手工解决退出开发 shell 后自动用git format-patch重新生成patches/*.patch并调用do_generate_patch_readme依据各补丁的提交信息重建本 ReadMe.md——这也是本文所读文档的自动生成来源其生成逻辑位于.port_include.sh的do_generate_patch_readme用git mailinfo解析补丁头、Subject与正文拼装 Markdown。m4 在 SerenityOS 生态中的位置m4 不是孤立存在的端口它是工具链依赖链的一环。在 Ports/flex/package.sh 中可以看到depends(m4 pcre2)【免费下载链接】serenityThe Serenity Operating System 项目地址: https://gitcode.com/GitHub_Trending/se/serenity创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表