ARTICLE DETAIL

资讯详情

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

如何为Madeira构建LLVM iOS工具链:耗时数小时的编译完整指南

如何为Madeira构建LLVM iOS工具链:耗时数小时的编译完整指南 如何为Madeira构建LLVM iOS工具链耗时数小时的编译完整指南【免费下载链接】MadeiraRun x86-64 Windows PC games on jailed iOS via FEX-Emu Wine DXMT项目地址: https://gitcode.com/GitHub_Trending/mad/MadeiraMadeira是一个在越狱限制下的 iPhone 上运行 x86-64 Windows PC 游戏的开源项目技术栈为 FEX-Emu Wine DXMT。其中 DXMT 负责把 DirectX 11 指令翻译成 Apple Metal而它内置的airconv 着色器编译器依赖 LLVM 15 的静态库——这意味着你必须亲手编译一套LLVM iOS 交叉工具链这也是整个构建流程中最耗时的一环通常需要数小时。本文手把手带你看懂每一步。为什么 Madeira 需要一套自建 LLVM iOS 工具链在开始编译前先理解这套工具链的用途你就不容易迷路着色器翻译DXMT 的airconv模块把 DXBC 着色器编译为 Apple AIR基于 LLVM IR再输出 Metal 库它直接链接 LLVM 15 的core、bitreader、bitwriter等库。iOS 目标平台这套 LLVM 不是装在你的 Mac 上给 Mac 用的而是交叉编译产物——目标三元组为arm64-apple-ios17.0最终随libdxmt_combined.a一起链接进 Madeira.app。PE 侧另有工具链Windows 侧的 PE DLLd3d11.dll、winemetal.dll 等用的是现成的 llvm-mingw不需要你编译真正要熬几个小时的是 iOS 侧这套。⏳ 心理准备iOS 目标的 LLVM 全量静态库编译在 Apple Silicon 上通常也需要数小时中途请勿休眠。相关设计文档可先阅读 ARCHITECTURE_ANALYSIS.md了解 DXMT 在整体架构中的位置。编译前置准备环境与源码1. 准备 macOS 开发机macOS Xcode需能访问iphoneosSDK即xcrun --sdk iphoneos --show-sdk-path可用CMake、Ninja、Python 3Metal Toolchain 组件xcodebuild -downloadComponent MetalToolchain2. 克隆 Madeira 仓库含子模块git clone --recurse-submodules https://gitcode.com/GitHub_Trending/mad/Madeira cd Madeira注意FEX、wine、research/dxmt是指向定制分支的子模块必须递归初始化。3. 获取 LLVM 源码官方构建记录把 LLVM 钉在上游 commit8dfdcc7b7[libc] Fix memory leaks when throwing inside std::vector constructor对应 LLVM 15.0.7源码放在toolchains/llvm-project/构建输出分别放在目录用途toolchains/llvm-host-build/Mac 宿主版 LLVM提供llvm-tblgenairconv 测试也用它toolchains/llvm-ios-build/iOS 交叉版 LLVM 静态库本文主角这些目录均为 git 忽略内容需要你自己构建。完整说明见 docs/BUILDING.md 的 Inputs that are not in the repository 一节。第一步构建宿主版 llvm-tblgen30 分钟级LLVM 构建有个经典的两阶段问题编译 LLVM 自身需要llvm-tblgen而交叉构建时 iOS 版 tablegen 没法在 Mac 上运行。所以先做一遍精简的宿主构建只为拿到 tablegencmake -S toolchains/llvm-project/llvm -B toolchains/llvm-host-build \ -DCMAKE_BUILD_TYPERelease \ -DLLVM_TARGETS_TO_BUILDARM \ -DLLVM_BUILD_TOOLSOff ninja -C toolchains/llvm-host-build llvm-tblgendocs/BUILDING.md 中记录了该宿主构建目录llvm-host-build的存在与用途。另外research/madeira-d3d12/tests/offline/README.md 提到离线着色器测试也链接这份宿主构建用ninja补齐 airconv 需要的 34 个归档所以这份构建值得保留完整。第二步配置 iOS 交叉构建核心步骤这是整条工具链的心脏。官方从现存的 CMakeCache 中读回的配置参数如下即被验证过的配方cmake -S toolchains/llvm-project/llvm -B toolchains/llvm-ios-build \ -DCMAKE_SYSTEM_NAMEiOS \ -DCMAKE_OSX_ARCHITECTURESarm64 \ -DCMAKE_OSX_SYSROOTiphoneos \ -DCMAKE_BUILD_TYPERelease \ -DLLVM_HOST_TRIPLEarm64-apple-ios17.0 \ -DLLVM_DEFAULT_TARGET_TRIPLEarm64-apple-ios17.0 \ -DLLVM_TARGET_ARCHhost \ -DLLVM_TARGETS_TO_BUILD \ -DLLVM_ENABLE_PROJECTS \ -DLLVM_BUILD_TOOLSOff \ -DLLVM_INCLUDE_TESTSOff \ -DLLVM_ENABLE_ZLIBOff逐条解释关键参数的含义-DCMAKE_SYSTEM_NAMEiOS告诉 CMake 这是 iOS 交叉编译-DLLVM_HOST_TRIPLEarm64-apple-ios17.0目标最低部署 iOS 17-DLLVM_TARGETS_TO_BUILD留空-DLLVM_TARGET_ARCHhost不编译任何后端——因为 airconv 只需要 LLVM 前端/IR 基础设施bitcode reader/writer、IR 变换不需要生成机器码这是省时间的大头-DLLVM_BUILD_TOOLSOff、-DLLVM_INCLUDE_TESTSOff、-DLLVM_ENABLE_ZLIBOff进一步裁剪减少无用编译量。build/dxmt-ios/README.md 也印证了同样的思路iOS 阶段使用-DCMAKE_SYSTEM_NAMEiOS、-DCMAKE_OSX_SYSROOTiphoneos、LLVM_BUILD_UTILSOff和空目标列表。必做的一个 CMake 补丁Apple 的链接器不认识 GCC 风格的--gc-sections。你需要给llvm/cmake/modules/AddLLVM.cmake打一个一行小补丁把MATCHES Darwin改为MATCHES Darwin|iOS这样在 iOS 平台上会改用 Apple ld 支持的-dead_strip。这个坑在 build/dxmt-ios/README.md 的 Prerequisites 一节有明确记录。第三步启动数小时编译ninja -C toolchains/llvm-ios-build全程保持 Mac 不休眠caffeinate -s或系统设置里调长进度可关注lib/libLLVMCore.a、libLLVMBitReader.a等归档的生成完成后目录中应有include/头文件和lib/一堆.a静态库这正是消费方脚本要的两个路径LLVM_SRC$REPO_ROOT/toolchains/llvm-project/llvm # 头文件 LLVM_BUILD$REPO_ROOT/toolchains/llvm-ios-build # 静态库见 build/dxmt-ios/build.sh 第 12-13 行。第四步验证——把它链进 libdxmt_combined.a工具链是否成功的判据只有一个DXMT 的 iOS 侧能正常编译并合成归档。./build/dxmt-ios/build.sh该脚本会用xcrun -sdk iphoneos clang编译 DXMT 的 winemetal unix 侧、airconvC20-I$LLVM_BUILD/include -I$LLVM_SRC/include引入你刚构建的 LLVM 头文件和 DXBCParser归档出libdxmt_unix.a并原地刷新libdxmt_combined.a——这个combined归档 DXMT 目标文件 llvm-ios-build/lib 下的全部 LLVM 静态库复制到app/Madeira/libdxmt_combined.a供 Xcode 链接。合并归档的命令在 build/dxmt-ios/README.md 中xcrun -sdk iphoneos libtool -static -o libdxmt_combined.a \ obj/*.o ../../toolchains/llvm-ios-build/lib/*.a若build.sh全部显示OK且日志出现 Staged: .../app/Madeira/libdxmt_combined.a恭喜数小时的编译正式落地 常见问题排查避坑清单现象原因与解法CMake 配置报 target 相关错误检查-DLLVM_TARGETS_TO_BUILD是否为空带等号、无值链接阶段报--gc-sections不被识别忘了打AddLLVM.cmake的Darwin\|iOS一行补丁airconv 编译时找不到llvm/Bitcode/Reader/BitcodeReader.hLLVM_SRC指向了错误路径应为toolchains/llvm-project/llvm编译数小时后ninja被系统杀死内存不足Mac 上关闭其他大型应用或用caffeinate防止休眠只重跑了 dxmt-ios 但 App 行为没变必须同步刷新libdxmt_combined.a脚本已自动处理但手动操作时容易漏 小技巧build/dxmt-ios/build.sh支持MADEIRA_ONLY目标名环境变量只重编单个目标文件——因为madeira_ir_unix里带__DATE__时间戳缓存键全量重编会导致设备上着色器全部重编译。许可说明LLVM 采用 Apache 2.0含 LLVM 例外条款其许可证文本已随仓库归档在 app/Madeira/licenses/LLVM-Apache-2.0-with-exception.txt。总结三步走完数小时编译宿主构建Release 版llvm-tblgen约半小时iOS 交叉构建空目标列表 iOS 17 三元组 一行 CMake 补丁ninja挂机数小时验证落地跑build/dxmt-ios/build.sh把 LLVM 静态库合并进libdxmt_combined.a。全部权威参数与状态哪些步骤已在干净克隆上复验、哪些标记 UNVERIFIED以 docs/BUILDING.md 为准DXMT 侧细节看 build/dxmt-ios/README.md。祝一次通过【免费下载链接】MadeiraRun x86-64 Windows PC games on jailed iOS via FEX-Emu Wine DXMT项目地址: https://gitcode.com/GitHub_Trending/mad/Madeira创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表