在 macOS 14 (M1 Pro) 编译 QEMU 7.0.0

最近我在进行清华大学 rCore Tutorial 的实验。该实验的内容是用 Rust 编写一个运行在 RISC-V 上的操作系统,因此需要使用 QEMU 来模拟 RISC-V 环境。

但是,讲义里采用的环境是 Ubuntu x86 架构,而我打算在我的 MacBook Pro (M1 Pro) 上进行实验,所以就有了本教程。

本教程的系统环境是 macOS Sonoma 14.5 Beta (23F5049f),编译安装的是 QEMU 7.0.0。

首先需要确保电脑上安装了 Homebrew 包管理器,如果没有安装的话,参考官网安装。

安装依赖包,获取 QEMU 源代码并进行配置:

1
2
3
4
5
6
7
8
9
# 安装依赖环境
brew install ninja wget pkg-config libffi gettext glib pixman meson
# 获取 QEMU 源码
wget https://download.qemu.org/qemu-7.0.0.tar.xz
# 解压
tar xvJf qemu-7.0.0.tar.xz
# 配置 RISC-V 支持
cd qemu-7.0.0
./configure --target-list=riscv64-softmmu

直接在 macOS 14 上编译会遇到如下报错:

1
/Library/Developer/CommandLineTools/SDKs/MacOSX14.sdk/System/Library/Frameworks/Carbon.framework/Frameworks/HIToolbox.framework/Headers/Controls.h:477:5: error: unknown type name 'IconRef'

错误原因是 QEMU 7 源码里面用到的一些系统 API 在 macOS 14 中被 Apple 弃用了,因此我们需要将系统 SDK 切换为更旧的版本来进行编译。

首先进入 SDK 的目录查看当前系统里有哪些版本的 SDK:

1
cd /Library/Developer/CommandLineTools/SDKs && ls

./pics/2024-04-24-15-54-55.png

经过测试,MacOS13.sdk 是可以成功编译的。由于我的电脑是从 macOS 13 升级上来的,因此自带 MacOS13.sdk。如果没有的话需要自行搜索如何获得旧版本的 SDK。获得后将其解压到这个目录即可。

配置临时环境变量切换旧版本 SDK:

1
export SDKROOT=/Library/Developer/CommandLineTools/SDKs/MacOSX13.sdk

如果有特殊的需要,也可以将上面的代码添加到 .zshrc 文件来长时间生效。不过一般不建议这么做。

切换到刚才的 qemu-7.0.0 目录,进行编译:

1
make -j8

注意不能新建终端,不然上面配置的临时变量就会失效。

可以成功编译。编译出来的文件在 ./build 文件夹下。将其添加到 PATH 环境变量中,即可使用。

最终效果如下:

./pics/2024-04-24-16-06-19.png