恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
SerenityOS 如何切换到 Clang 工具链构建:BuildClang.sh 与 SERENITY_TOOLCHAIN 说明
首页
资讯中心
/
SerenityOS 如何切换到 Clang 工具链构建:BuildClang.sh 与 SERENITY_TOOLCHAIN 说明
SerenityOS 如何切换到 Clang 工具链构建:BuildClang.sh 与 SERENITY_TOOLCHAIN 说明
发布时间:2026/9/12 2:59:01
SerenityOS 如何切换到 Clang 工具链构建BuildClang.sh 与 SERENITY_TOOLCHAIN 说明【免费下载链接】serenityThe Serenity Operating System 项目地址: https://gitcode.com/GitHub_Trending/se/serenitySerenityOS 默认使用 GNU 工具链构建。如果你想改用实验性的 Clang 工具链——官方文档给出的理由有两点减少对编译器特定行为的依赖以及利用 Clang 内置静态分析器发现更多 bug——整个过程分两步先用Toolchain/BuildClang.sh构建出一套能同时编译宿主机与 Serenity 目标的 Clang 工具链再让构建系统选择Clang而不是默认的GNU。两种工具链编出的代码在大多数情况下行为一致但当前有一个明确限制ports 尚不能用 Clang 构建。构建 Clang 工具链前的准备BuildClang.sh 开头会检查一批宿主机依赖缺失时直接退出并给出提示ninja与cmake必需脚本检查不到就退出GNUpatch脚本会检查缺失时只提示安装、不退出可用的 C 与 C 编译器脚本会实际编译一个空程序来验证失败则退出LLD 链接器可选。检测到可用时输出Using LLD for linking LLVM.否则输出LLD not found. Using the default linker.并回退默认链接器。脚本还会从 LLVM 上游下载源码包到Toolchain/Tarballs/内置固定的 commit 与 MD5 校验如果本地已有 MD5 匹配的包会跳过下载并显示Skipped downloading LLVM。执行前需要知道三件事不要用 root 运行。脚本检测到 root 会直接退出Do not run BuildClang.sh as root否则Toolchain/下的部分文件会变成 root 所有。脚本会删除已有的Toolchain/Local/clang/再重建所以重跑脚本就是完整的“重建工具链”重新打补丁时它还会删除Toolchain/Build/clang。编译负载很高。AdvancedBuildInstructions.md 提醒构建期间机器可能明显变慢甚至短暂卡死尤其当 CPU 核心数多于空闲内存GB 数时。解决办法是把MAKEJOBS环境变量设为小于核心数的值以限制并行编译数不设时脚本默认使用全部核心。运行 BuildClang.sh在项目根目录执行等价于进入Toolchain目录运行BuildClang.sh# 常规构建 Toolchain/BuildClang.sh # CPU 核心数多于空闲内存(GB)时限制并行任务数 MAKEJOBS4 Toolchain/BuildClang.sh # 需要 clangd 时可选见“编辑器集成”一节 CLANG_ENABLE_CLANGDON Toolchain/BuildClang.sh脚本接受--dev与--ci两个互斥参数同时传会报错退出--dev改用 git 方式应用Toolchain/Patches/llvm/下的补丁并启用 ccache方便迭代补丁--ci面向 CI runner启用 ccache使用LLVM_CCACHE_DIR并放弃-marchnative因为共享缓存的 runner 之间 CPU 可能不同。脚本的实际工作大致是为x86_64、aarch64、riscv64三个架构链接 LibC 头文件写入Build/archclang/Root用 Ninja 编译并执行ninja install/strip把 LLVM/Clang 安装到Toolchain/Local/clang/最后在Toolchain/Local/clang/bin/下为每个架构生成clang/clang符号链接如x86_64-serenity-clang以及记录 sysroot 的arch-unknown-serenity.cfg。让构建系统选择 Clang 工具链工具链就位后有三种等价方式选 Clang。方式一给Meta/serenity.sh传 TOOLCHAIN 参数文档示例用法Meta/serenity.sh run x86_64 ClangMeta/serenity.sh 的用法是COMMAND [TARGET] [TOOLCHAIN] [ARGS...]TOOLCHAIN 只接受GNU或Clang传错值会报ERROR: unknown toolchain ...并退出。该参数只对非lagom目标生效——Lagom 是宿主机构建不涉及目标工具链选择。方式二用SERENITY_TOOLCHAIN环境变量SERENITY_TOOLCHAINClang Meta/serenity.sh run x86_64脚本的取值顺序是命令行 TOOLCHAIN 参数 SERENITY_TOOLCHAIN环境变量 默认GNU。适合想固定用 Clang 而不必每次敲参数的场景。方式三手动走 CMake 时传-DSERENITY_TOOLCHAINSERENITY_TOOLCHAIN同时是 Superbuild 中的 CMake 缓存选项默认GNU。手动构建时按文档给出的等效命令把工具链换成Clang、构建目录换成带clang后缀的目录cmake -GNinja -S Meta/CMake/Superbuild -B Build/superbuild-x86_64clang -DSERENITY_ARCHx86_64 -DSERENITY_TOOLCHAINClang cmake --build Build/superbuild-x86_64clang ninja -C Build/x86_64clang setup-and-run选 Clang 后Superbuild 会把 ClangToolchain.txt.in 实例化成构建目录中的CMakeToolchain.txtC/C 编译器指向Toolchain/Local/clang/bin/下的clang/clang目标三元组为arch-serenity链接器为ld.lldsysroot 指向Build/archclang/Root。另外如果Toolchain/Local/clang目录还不存在Meta/serenity.sh在构建前会自动调用Toolchain/BuildClang.sh把工具链建好不必手动先跑一遍。验证切换是否生效构建目录GNU 构建位于Build/x86_64Clang 构建位于Build/x86_64clangSuperbuild 对应Build/superbuild-x86_64与Build/superbuild-x86_64clang。带clang后缀的目录出现并开始在其中编译说明工具链选择已生效两套工具链的产物互不干扰可以共存。工具链产物构建完成后Toolchain/Local/clang/bin/下应能查到clang、clang、各架构的x86_64-serenity-clang等符号链接及arch-unknown-serenity.cfg内容为--sysrootBuild/archclang/Root。运行验证Meta/serenity.sh run x86_64 Clang会编译镜像并在 QEMU 中启动能正常进入系统即说明 Clang 构建的系统可用。编译器指向构建目录中的CMakeToolchain.txt里CMAKE_C_COMPILER等变量指向Toolchain/Local/clang/bin/可据此确认本次编译用的是自建 Clang 而非宿主机编译器。编辑器集成与已知限制构建 Clang 工具链时会一并构建意识到 SerenityOS 目标的 libTooling 工具clang-format、clang-tidy以及可选的clangd它们安装到Toolchain/Local/clang/bin。要把 clangd 包含进构建需先设CLANG_ENABLE_CLANGDON再运行Toolchain/BuildClang.sh。把这些工具连同一次 Clang 构建产生的compile_commands.json配到编辑器插件中可以获得比宿主机自带工具更丰富的错误报告使用工具链里编译出的Toolchain/Local/clang/bin/clang-format时meta-lint-ci的 pre-commit hook 也会自动拾取它。限制方面文档明确了两点ports 还不能用 Clang 构建CMake 选项ENABLE_USERSPACE_COVERAGE_COLLECTION用户态覆盖率收集目前只支持 Clang 构建。此外Meta/serenity.sh在构建前会检查Toolchain/Local/下是否残留旧三元组命名的文件*-pc-serenity*发现即中止并提示删除工具链与Build目录GNU 路径特有的 binutils ld 版本检查期望GNU ld (GNU Binutils) 2.46.0不符时提示rebuild-toolchain在 Clang 路径下不执行。【免费下载链接】serenityThe Serenity Operating System 项目地址: https://gitcode.com/GitHub_Trending/se/serenity创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考