SerenityOS 与 Ladybird 的 GN 构建系统指南:从环境搭建到目标构建与运行

发布时间:2026/9/12 4:14:45

SerenityOS 与 Ladybird 的 GN 构建系统指南:从环境搭建到目标构建与运行 SerenityOS 与 Ladybird 的 GN 构建系统指南从环境搭建到目标构建与运行【免费下载链接】serenityThe Serenity Operating System 项目地址: https://gitcode.com/GitHub_Trending/se/serenity本指南以仓库中 Meta/gn/README.md 为骨架系统讲解 SerenityOS 项目中实验性的 GN 元构建系统如何安装 GN、生成 ninja 构建目录、编写args.gn、按目录前缀构建 Ladybird 与 LibWeb 等目标以及定位二进制产物并运行。GN 构建并非官方构建方式官方方案是 CMake因此本文同时结合仓库内的 GN 源码文件如 Meta/gn/secondary/BUILD.gn、Toolchain/BuildGN.sh逐层解释其实现细节帮助你判断何时该用 GN、出了问题如何自愈。一、认识 GN元构建系统与它在 SerenityOS 中的定位GNGenerate Ninja是一种元构建系统它本身不直接编译代码而是生成 ninja 构建文件再由 ninja 执行实际编译。除 ninja 之外GN 还能生成部分 IDE 工程MSVC、Xcode 等这些 IDE 工程在构建时依然会调用 ninja。在 SerenityOS 仓库中GN 构建处于**实验性experimental且尽力而为best-effort**的状态。原文档明确警告GN 构建可能无法正常工作如果你使用它需要具备自行修复的能力SerenityOS 的官方构建系统是 CMake拿不准时请使用 CMake。仓库还定下了一条协作约定作者新增文件时只需更新 CMake 构建不必更新 GN 构建文件评审者也不应要求作者维护 GN 构建——GN 构建文件的同步维护责任在使用它的人身上。这一约定说明 GN 构建是面向内部开发者与特定使用者的可选通道而不是面向所有贡献者的强制路径。GN 的整体设计理念、动机与灵感可参考 LLVM 项目中关于其 GN 构建的文档以及官方提供的 GN 概览详见原文档中的外部链接本文不展开外部内容。从仓库结构看GN 构建的根定义位于 Meta/gn/secondary/BUILD.gn它通过import引入 Meta/gn/build/toolchain/compiler.gni 并定义了若干顶层目标组而 Meta/gn/build/BUILDCONFIG.gn 则为所有二进制目标设置了默认配置compiler_defaults、no_exceptions、pic并规定默认工具链为//Meta/gn/build/toolchain:unix。理解这些根文件有助于在 GN 报错时定位问题。二、安装 GN从源码构建与获取预编译二进制使用 GN 构建前必须先安装 GN。部分 Linux 发行版的软件包仓库提供 GN但版本可能过旧——原文档以 Ubuntu 22.04 为例指出其主仓库中的 GN 版本不够新因此需要自行从源码构建或从 Google 获取二进制。从源码构建推荐路径仓库提供了现成的构建脚本 Toolchain/BuildGN.sh。脚本的核心逻辑如下将 GN 源码克隆到Toolchain/Tarballs/gn并固定 checkout 到提交fae280eabe5d31accc53100137459ece19a7a295保证可复现调用./build/gen.py --out-path$DIR/Build/gn --allow-warnings生成构建文件通过ninja -C $DIR/Build/gn编译 GN将产物复制到Toolchain/Local/gn/bin目录。也就是说运行该脚本后GN 二进制位于Toolchain/Local/gn/bin。注意脚本开头会检查是否以 root 运行exit_if_running_as_root因为以 root 运行会导致 Toolchain 目录部分文件归属 root影响后续使用。获取预编译二进制也可以按照 GN 官方文档googlesource 上的 Getting a binary 小节从 Google 下载预编译版本适用于不方便自行编译的场合。三、生成构建目录gn gen 与 ninja 的配合安装好 GN 后进入仓库根目录执行gn gen outgn gen out会在out目录中生成一套 ninja 构建文件。之后即可用 ninja 构建整个项目ninja -C out如果 GN 或 ninja 报告大量错误很可能是缺少args.gn配置——即没有为构建指定所需工具链。args.gn位于构建目录根即out/args.gn有两种处理方式在运行gn gen之前手动把args.gn放到构建目录中运行gn args build dir交互式编辑例如gn args out。需要特别注意的是如果你在gn args之外手动修改了args.gn必须重新运行gn gen以重新生成 ninja 文件否则修改不会生效。3.1 默认配置与工具链兜底从 Meta/gn/build/BUILDCONFIG.gn 可以看到仓库对executable、shared_library、static_library、source_set、loadable_module等目标类型统一注入了//Meta/gn/build:compiler_defaults、//Meta/gn/build:no_exceptions与//Meta/gn/build:pic三组默认 config并支持目标在本地configs中移除。target_os、target_cpu等未显式设置时会回退到宿主host值host_toolchain固定为//Meta/gn/build/toolchain:unix。这意味着在 macOS 上通常可以直接使用默认参数构建。四、编写 args.gn典型配置详解args.gn是 GN 构建的核心配置文件语法为name value注释以#开头。原文档给出了两个典型场景。macOS默认参数即可开箱即用。若通过 Homebrew 安装了 Qt6 且具备 Xcode 工具链编译 Ladybird 通常无需额外定制。Ubuntu及多数 Linux默认的cc/c很可能无法编译本项目编译 Ladybird 时一份典型args.gn如下# Set build arguments here. See gn help buildargs. # Chosen clang must be version 15.0.0 host_ccclang host_cxxclang is_clangtrue use_lldtrue qt_install_headers/usr/include/x86_64-linux-gnu/qt6/ qt_install_lib/usr/lib/x86_64-linux-gnu qt_install_libexec/usr/lib/qt6/libexec/各参数含义参数含义备注host_cc/host_cxx宿主编译器的 C/C 可执行文件必须选择 clang且版本≥ 15.0.0is_clang是否使用 clang 工具链置为true使 GN 使用 clang 相关的 flag 集合use_lld是否使用 lld 链接器置为true可显著提升链接速度与兼容性qt_install_headersQt6 头文件安装目录指向发行版 Qt6 头文件位置qt_install_libQt6 库文件安装目录用于链接 Qt6 库qt_install_libexecQt6 辅助程序moc/rcc所在目录构建时调用 moc、rcc 等工具这些 Qt 参数在源码中有对应的默认推导逻辑。查看 Meta/gn/secondary/Ladybird/qt_install_prefix.gni当未显式覆盖时qt_install_prefix在 macOS 上默认取/opt/homebrew/Homebrew 的 Apple Silicon 前缀在 Linux 上默认取/usr/qt_install_headers默认等于qt_install_prefix include/qt_install_lib默认等于qt_install_prefix libqt_install_libexec默认等于qt_install_prefix share/qt/libexec/macOS 上另有qt_install_frameworks指向qt_install_prefix Frameworks/。因此上面的 Linux 显式配置本质是在发行版实际目录与默认前缀不一致时做的覆盖。这些变量被以下 gni 模板实际消费Meta/gn/secondary/Ladybird/moc_qt_objects.gni调用qt_install_libexec moc对 Qt 头文件执行元对象编译器Meta/gn/secondary/Ladybird/compile_qt_resource_file.gni调用qt_install_libexec rcc编译ladybird.qrc资源文件Meta/gn/secondary/Ladybird/link_qt.gni以qt_install_headers与qt_install_lib设置 include 与 lib 搜索路径。另一个相关参数是enable_qt定义于 Meta/gn/secondary/Ladybird/enable_qt.gni默认enable_qt current_os ! mac即非 macOS 平台默认启用 Qt 界面macOS 使用 AppKit 界面。调试构建参数的通用方法与任何 GN 工程一样gn args build dir --list是你最好的朋友——它会列出当前构建目录中全部可用参数及其默认值用于确认哪些参数生效、哪些需要覆盖。五、按目标构建目录前缀命名规则GN 中目标名以声明所在目录为前缀。原文档给出的两个示例ninja -C out Ladybird ninja -C out Userland/Libraries/LibWebninja -C out Ladybird构建 Meta/gn/secondary/Ladybird/BUILD.gn 中声明的Ladybird目标组ninja -C out Userland/Libraries/LibWeb构建 LibWeb 库目标。查看 Meta/gn/secondary/Ladybird/BUILD.gn 可以看到该目标组的实现细节在 macOS 上Ladybird组依赖Ladybird.app通过create_bundle生成 .app 应用包其他平台则依赖ladybird_executable可执行文件Ladybird 的 Qt 界面由moc_qt_objects对 13 个 Qt 头文件执行 moc、compile_qt_resource_file编译Ladybird/Qt/ladybird.qrc与link_qt链接 Core、Gui、Widgets、Network 四个 Qt 组件三个模板支撑通过data_deps拉取 5 个辅助进程目标ImageDecoder、RequestServer、SQLServer、WebContent、WebWorker它们各自位于 Meta/gn/secondary/Ladybird/ 下的独立 BUILD.gn非 macOS 平台上还包含headless-browser无头浏览器目标以及一系列copy目标把 emoji、字体、图标、主题、Web 资源与模板来自Base/res/目录复制到out/share/Lagom/下的对应子目录供运行期加载。此外根目标组 Meta/gn/secondary/BUILD.gn 还提供了几个预置入口default默认目标聚合//Ladybird、//Meta/Lagom/Tools/CodeGenerators/IPCCompiler、//Tests、//Userland/Libraries/LibWeb、//Userland/Utilities:base64、//Userland/Utilities:js标记为testonlyserenity通过//Kernel(//Meta/gn/build/toolchain:serenity)指定 serenity 工具链来构建内核macpdf仅在 macOS 上构建 Meta/Lagom/Contrib/MacPDFconsolepool利用 ninja 内置的 console pool要求 GN 版本 ≥ 552353将某些任务串行化。六、SerenityOS 内核目标的 GN 支持未完成GN 构建对 SerenityOS 本身的支持仍不完整目前只能实验性地构建内核命令为ninja -C out serenity对应实现即 Meta/gn/secondary/BUILD.gn 中的serenity目标组它唯一依赖//Kernel(//Meta/gn/build/toolchain:serenity)——即使用名为serenity的工具链定义来编译 Meta/gn/secondary/Kernel/BUILD.gn 中的内核目标。从仓库结构看Kernel 的 GN 构建还包含 PrekernelMeta/gn/secondary/Kernel/Prekernel/BUILD.gn、generate_version_header.py与post_process_kernel.py等辅助脚本说明其仍处于搭建阶段切勿将其视为完整可用的内核构建通道。七、运行 GN 构建产物所有可执行文件被统一放到out/bin目录。构建完成后可直接运行./out/bin/Ladybird在 macOS 上产物是.app应用包可用open启动同时把标准输出/错误转发到当前终端open -W --stdout $(tty) --stderr $(tty) ./out/bin/Ladybird.app --args https://ladybird.dev其中--stdout $(tty) --stderr $(tty)用于把应用日志重定向回终端便于调试--args之后可以跟启动参数示例中传入了一个 URL。需要注意Ladybird 这类多进程程序在运行期还需要定位资源文件。根据 Meta/gn/secondary/Ladybird/BUILD.gn 的 copy 目标非 macOS 平台上 emoji、字体、图标、主题与 Web 资源会被复制到$root_out_dir/share/Lagom/下如share/Lagom/fonts/、share/Lagom/emoji/、share/Lagom/ladybird/等macOS 上则通过bundle_data打入.app包的Contents/Resources中。若运行二进制时出现找不到资源的问题可优先检查这些路径是否已正确生成。八、测试目标的 GN 入口与 GN 构建配套的测试聚合定义在 Meta/gn/secondary/Tests/BUILD.gnTests目标组聚合了//Tests/AK、//Tests/LibGfx、//Tests/LibJS、//Tests/LibURL、//Tests/LibWeb五个子测试目标并标记为testonly。构建测试可用ninja -C out Tests九、故障排查与维护建议综合原文档与仓库实现使用 GN 构建时建议遵循以下排查顺序确认 GN 版本至少满足仓库要求console pool 需要 GN ≥ 552353 对应的版本Ubuntu 22.04 仓库自带的 GN 版本过旧务必使用 Toolchain/BuildGN.sh 构建或下载预编译版确认工具链参数Linux 上确保args.gn指定了 clang≥ 15.0.0与use_lldtrue且 Qt 相关路径与发行版实际安装位置一致不确定时用gn args out --list核对所有参数默认值修改 args.gn 后重新生成手动编辑过args.gn必须重跑gn gen out否则 ninja 文件与参数不同步按目录前缀定位目标想构建哪个目录的功能就用ninja -C out 目录路径的形式指定目标不要凭猜测使用目标名认清实验性质GN 构建可能随时损坏且不属于评审维护范围遇到问题时按“使用者自行修复”的预期处理核心开发仍以 CMake 为准。总而言之GN 构建为 SerenityOS 与 Ladybird 提供了一条实验性的快速构建通道尤其适合不依赖完整 CMake 工程而希望按目录粒度增量构建 Ladybird、LibWeb 与测试的开发者。掌握gn gen、args.gn参数覆盖与目录前缀目标命名这三大要点即可在官方 CMake 之外多一条可用的构建路径。【免费下载链接】serenityThe Serenity Operating System 项目地址: https://gitcode.com/GitHub_Trending/se/serenity创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/12 4:14:45

SpringBoot影楼管理系统开发实战与架构解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/12 4:14:45

Redis OOM报错排查:maxmemory与内存淘汰策略实战解析

我在线上遇到过一次特别有代表性的Redis故障:业务量一上来,客户端就开始成片地抛异常,核心报错就一句话——OOM command not allowed when used memory > maxmemory。新同学第一次看到这行英文基本都是懵的:Redis不是号称高性能…

2026/9/12 4:14:45

MFA安全新挑战:IDN同形攻击与零宽字符钓鱼防御

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/12 4:39:48

Python tkinter Text组件选择事件深度解析与应用

1. 深入理解tkinter的Text组件与虚拟事件机制在Python GUI开发领域&#xff0c;tkinter作为标准库中的"常青树"&#xff0c;其Text组件堪称构建文本编辑功能的瑞士军刀。而<<Selection>>这个看似简单的虚拟事件&#xff0c;实则是处理文本选择操作的关键…

2026/9/12 4:39:48

Spring Boot集成asyncTool实现高并发任务编排

1. 项目概述在当今高并发的业务场景下&#xff0c;复杂任务的异步处理与编排能力已经成为后端开发的刚需。Spring Boot作为Java生态中最流行的应用框架&#xff0c;其默认的异步处理机制在面对多级依赖任务时往往显得力不从心。这正是asyncTool这类专业任务编排框架大显身手的场…

2026/9/12 4:39:47

用Grix把Codex变成群聊机器人:口袋里的技术专家

上个月我在外面出差&#xff0c;正好赶上团队群里有人贴了一段报错&#xff0c;问谁能看看。我盯着手机屏幕&#xff0c;脑子里已经排除了两个可能&#xff0c;但手边没有电脑&#xff0c;总不能靠语音给人家背代码。那天晚上我就决定&#xff0c;必须把手上这套 Codex 工作流搬…

2026/9/12 4:39:47

Rocky Linux部署ELK+Redis构建高可用日志收集系统

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/12 4:34:47

Java StringEntry接口设计与实现最佳实践

1. StringEntry接口的设计背景与核心诉求在软件开发中&#xff0c;数据结构的抽象与封装一直是提升代码复用性和可维护性的关键手段。StringEntry这个接口概念的提出&#xff0c;本质上是为了解决字符串类型数据在多种场景下的统一操作问题。我最近在重构一个历史遗留系统时&am…

2026/9/12 2:05:33

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊&#xff01;#雷神 #复联”这类调侃式短标题&#xff0c;第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里&#xff0c;但细想一下就能发现&#xff0c;它真正碰到的根本不是…

2026/9/12 3:55:12

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊&#xff0c;可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”&#xff0c;你会发现&#xff0c;这场比较本质上是两个不同 IP 策略的长期结果对比&#xff1a;超人赢在定义了整个超级英雄题材…

2026/9/9 16:31:09

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介&#xff1a;本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案&#xff0c;聚焦调制信号自动检测与识别这一典型无线通信任务&#xff0c;解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件&#xff08;10.73MB&#xff09;&…

2026/9/12 0:04:17

MATLAB仿生优化框架:长鼻浣熊算法多策略融合实现

简介&#xff1a;本资源是一份面向智能优化算法研究者与MATLAB初学者的仿生智能算法实践代码包&#xff0c;聚焦于长鼻浣熊优化算法&#xff08;COA&#xff09;的多策略改进与性能验证。针对传统COA易陷局部最优、收敛精度不足等问题&#xff0c;作者融合Circle映射初始化提升…

2026/9/12 0:04:17

【JAVA毕设源码分享】基于 JavaWeb 的校园一卡通管理系统的设计与实现 基于 JavaWeb 的校园卡业务管理系统(程序+文档+代码讲解+一条龙定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

2026/9/12 0:04:17

【JAVA毕设源码分享】基于 Java 的图书馆借阅管理平台的搭建与实现 基于 Java 的图书馆综合管理系统(程序+文档+代码讲解+一条龙定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

2026/9/10 12:32:02

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行&#xff0c;Type-C接口算是典型的“看着简单&#xff0c;做起来全坑”的东西。光引脚就24个&#xff0c;高低速信号、电源、控制线全部塞在一个小小的连接器里&#xff0c;如果PCB布局不做规划&#xff0c;打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/10 15:19:50

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/10 15:49:53

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码