【免费下载链接】Eglantine
VERY experimental Nintendo Switch 2 emulator
本文是一份面向新手与开发者的 Eglantine 构建系统完整指南:详解 CMake 构建选项、CPM 依赖管理(cpmfile.json)机制与交叉编译流程,帮助你从零源码构建 Switch 2 模拟器 Eglantine,并快速定位 configure 阶段的各种问题。
Eglantine 是基于 yuzu 分支的 Switch 2 模拟器,构建体系以CMake 3.31+为骨架、Ninja为推荐生成器、C++20为标准(CMakeLists.txt)。整个工程横跨 Windows、macOS、Linux、BSD 甚至 HaikuOS,因此它的 CMake 配置里藏着大量平台分支逻辑,而依赖管理则全部交给一个叫 CPMUtil 的自研封装层。下面带你一层层拆开它。
全局架构:构建流程一图看懂
配置阶段(cmake -S . -B build)大致经历 4 步:
- 平台探测:
DetectPlatform/DetectArchitecture模块识别系统与 CPU 架构(CMakeModules/),失败会直接报错终止 - 默认值与选项解析:
DefaultConfig、LTO、ccache、快速链接器等一系列工具开关 - 依赖解析:通过 CPMUtil 的
AddJsonPackage()逐个解析 cpmfile.json,先找系统库、找不到则自动下载打包 - 源码组织:最终
add_subdirectory(src)挂入核心代码(CMakeLists.txt),产物统一输出到build/bin/(如eden-cli、eden-room,见 src/CMakeLists.txt)
💡 提示:如果你只是普通用户,建议直接使用官方 Release 包;以下内容更适合开发者和打包者,官方构建文档位于 docs/Build.md。
快速上手:两条命令完成源码构建
在已装好依赖(C++ 编译器、CMake、Git、Python3,详见 docs/Deps.md)的前提下:
git clone https://gitcode.com/gh_mirrors/eg/Eglantine cd Eglantine cmake -S . -B build -DCMAKE_BUILD_TYPE=Release -G Ninja cmake --build build构建完成后,可执行文件位于:
- Windows:
build/bin/eden.exe - macOS:
build/bin/eden.app/Contents/MacOS/eden - Linux 等其他系统:
build/bin/eden
🧰 图形化用户可以直接用Qt Creator:打开根目录CMakeLists.txt,选择 kit(推荐RelWithDebInfo或Release),点击 Configure Project 后等待 CMake 配置完成即可,官方推荐流程同样写在 docs/Build.md。Windows 用户若用 MSVC,请先加载 Visual C++ 环境(仓库自带便捷脚本 tools/windows/load-msvc-env.ps1)。
CMake 选项清单:按需定制你的构建行为
所有选项均可通过-D选项名=值在 configure 时传入,完整清单见 docs/Options.md。下面是新手最常用的几个(定义于 CMakeLists.txt):
| 选项 | 默认值 | 作用 |
|---|---|---|
ENABLE_QT | ON | 启用 Qt 图形前端(推荐保持开启) |
YUZU_USE_BUNDLED_QT | MSVC 上ON | 自动下载打包好的 Qt 二进制,免手动装 Qt |
YUZU_CMD | 非 AndroidON | 编译 SDL 无界面前端eden-cli |
YUZU_BUILD_PRESET | custom | CPU 微架构预设:generic/v3/zen2/zen4/native/ ARMarmv9等,直接影响-march/-mtune(CMakeLists.txt) |
ENABLE_DEBUG_TOOLS | OFF | 编译 Maxwell 反汇编器、SPIR-V 转换器等调试工具(tools/) |
ENABLE_WERROR | ON | 警告视为错误 |
YUZU_STATIC_BUILD | OFF | 尽量使用静态库(不支持 Linux) |
ENABLE_LIBUSB | ON | libusb 输入后端,手柄支持强烈推荐开启 |
ENABLE_RESHADE | ON | 启用 ReShade FX 后处理效果 |
# 示例:关闭 Qt、只编译命令行前端,并用 Zen4 预设优化 cmake -S . -B build -G Ninja -DENABLE_QT=OFF -DYUZU_CMD=ON -DYUZU_BUILD_PRESET=zen4⚠️ 注意:
YUZU_LEGACY、NIGHTLY_BUILD、YUZU_STATIC_ROOM等选项面向 CI 或特定发行版场景,普通构建无需改动,默认值通常就是最佳体验。
CPM 依赖管理:一个 cpmfile.json 锁定全部第三方库
Eglantine 没有让开发者手动装一堆依赖,而是用 CPMUtil(CPM 的封装层,实现于 CMakeModules/CPMUtil.cmake)统一管理。所有第三方库的仓库、版本、SHA512 校验和都集中在 cpmfile.json 中,代码里只需用一行AddJsonPackage(fmt)之类的调用引入(CMakeLists.txt)。
它的解析逻辑非常清晰:
- 先执行
find_package查找系统已装的同名库(需满足min_version) - 找不到时,按 JSON 里的
repo+version自动下载到缓存目录.cache/cpm/(由CPM_SOURCE_CACHE控制) - 校验SHA512哈希,不符则拒绝继续 —— 这是防供应链攻击的核心防线
- 依次应用
patches中列出的补丁、注入options里的 CMake 参数,再纳入构建树
以 cpmfile.json 中的 Boost 为例,每条定义包含repo(仓库)、version(tag 或 10 位 commit)、hash(校验和)、min_version(系统库最低版本);还支持patches(如 openssl-cmake 的 4 个补丁)、options、artifact(发布产物名,可用%VERSION%占位)等字段。
几个值得注意的设计:
- CI 预编译包:
"ci": true的条目(如ffmpeg-ci、openssl-ci、sdl3-ci)直接下载按平台/架构预构建好的静态库,大幅缩短编译时间(cpmfile.json) - 依赖组合一致性:
AddDependentPackages()强制 Vulkan Headers 与 Utility Libraries 等关联包「全系统或全捆绑」,避免版本错配(docs/CPMUtil.md) - 依赖清单可视化:配置阶段 CPMUtil 会记录全部依赖的名称/版本/仓库,由 CMakeModules/GenerateDepHashes.cmake 生成
dep_hashes.h(模板见 src/dep_hashes.h.in),最终在应用「依赖」对话框中展示给用户 - 维护工具:仓库提供 tools/cpmutil.sh 脚本,支持
package hash(计算校验和)、package reset(清缓存)、package patch(制作补丁)等子命令
完整机制(缓存目录结构、打包者沙箱模式、供应链安全三件套等)详见 docs/CPMUtil.md。
交叉编译实战:Gentoo 工具链文件编译 AArch64
Eglantine 官方为 Gentoo 用户提供了现成的交叉工具链文件 CMakeModules/toolchains/GentooCross.cmake,它只需一个CROSS_TARGET参数,就会自动拼出<目标>-unknown-linux-gnu前缀的交叉编译器(gcc 或 clang)与 sysroot,并配置好CMAKE_FIND_ROOT_PATH_MODE三大搜索模式,防止把宿主机的库链进目标产物。
典型流程(完整指南见 docs/CrossCompile.md):
# 1. 准备交叉环境(Gentoo 示例) sudo emerge -a sys-devel/crossdev sudo crossdev aarch64 # 2. 交叉编译 cmake -S . -B build/aarch64 -GNinja \ -DCMAKE_TOOLCHAIN_FILE=CMakeModules/toolchains/GentooCross.cmake \ -DCROSS_TARGET=aarch64 -DENABLE_OPENGL=OFF # 3. 构建并用 QEMU 运行验证 cmake --build build/aarch64 qemu-aarch64 build/aarch64/bin/eden几个实战要点:
- 🔌强烈建议关闭 OpenGL(
-DENABLE_OPENGL=OFF),交叉环境下图形栈最容易出问题 - 📦 交叉 sysroot 中只需安装标准系统库 + Qt(
dev-qt/qtbase:6、dev-qt/qtcharts:6),其余依赖交给 CPMUtil 自动补齐;保险起见可加-DCPMUTIL_FORCE_BUNDLED=ON - 🖥️ 不想折腾交叉工具链?官方还给了「无痛」方案:直接用 QEMU 起一个 Debian ARM64 虚拟机在里面原生编译
故障排查清单:configure 失败怎么办
按 docs/Build.md 的排障建议,多数问题可以按下面顺序解决:
- 重读依赖文档:确认 docs/Deps.md 中的版本要求(CMake 3.31+、Python3 10+ 等)
- 清缓存重试:删除
.cache/cpm(CPM 依赖缓存)和build/CMakeCache.txt(CMake 缓存) - 强制切换依赖来源:
-DCPMUTIL_FORCE_SYSTEM=ON:全部强制用系统库(适合 nixOS/Gentoo 沙箱环境)-D<包名>_FORCE_BUNDLED=ON:单独强制捆绑某个库,如-Dfmt_FORCE_BUNDLED=ON-D<包名>_CUSTOM_DIR=/path/to/dir:指向本地已解压的依赖
- 查看报错定位选项:CMake 报错中通常会提示「可用
cpmutil.sh查看该包缓存目录」,对照 docs/CPMUtil.md 的 Addendum 章节按需处理
另外,如果你要参与开发,配置阶段会自动把 hooks/pre-commit 安装为 Git 钩子,在提交时检查src/与CMakeLists.txt的空白字符规范。
总结
Eglantine 的构建系统可以概括为三层:CMake 选项(-D参数控制前端、图形后端、CPU 预设等构建行为)、CPMUtil 依赖管理(cpmfile.json 一个文件锁定全部第三方库版本与 SHA512 校验和,系统库优先、缺则自动下载)、工具链文件(GentooCross.cmake 让交叉编译只需指定目标架构)。理解这三层,你就能在任何平台自信地构建、裁剪和交叉编译这个 Switch 2 模拟器了。
更多细节可继续查阅 docs/Build.md、docs/Options.md、docs/CPMUtil.md 与 docs/CrossCompile.md。
【免费下载链接】Eglantine
VERY experimental Nintendo Switch 2 emulator
相关推荐
Dogecoin 跨平台依赖构建系统(depends)实战指南:从零编译多平台依赖与交叉编译配置
Dogecoin 跨平台依赖构建系统(depends)实战指南:从零编译多平台依赖与交叉编译配置 本文以 Dogecoin 仓库中的 depends 系统说明
区块链libhv 构建指南:Makefile / CMake / Bazel 三种构建体系与交叉编译实战
libhv 构建指南:Makefile / CMake / Bazel 三种构建体系与交叉编译实战 libhv 是一个用 C/C++ 编写的跨平台网络库,覆盖
后端网络通信Monero 依赖构建系统(contrib/depends)完全指南:跨平台交叉编译与依赖缓存
Monero 依赖构建系统(contrib/depends)完全指南:跨平台交叉编译与依赖缓存 导读 本文围绕 Monero 仓库中 contrib/depen
区块链金融科技
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考