使用 docker 进行 QEMU W64 的交叉编译
本文记录在 Debian 12 上利用 docker 进行 QEMU W64 的交叉编译步骤
安装 docker 编译环境
首先,在Debian 12系统中通过以下命令可以安装Docker:
sudo apt update
sudo apt install docker.io
启动Docker服务:
sudo systemctl start docker
在 docker 新目录中创建 Dockerfile 文件
# 便用Debian 12作为基础镜像
FROM debian:12
# 设置工作目录
WORKDIR /app
# 更新apt源为国内镜像
RUN sed -i 's/deb.debian.org/mirrors.aliyun.com/g' /etc/apt/sources.list.d/debian.sources
#、安装软件包
RUN apt update
配置 docker 运行环境
首先配置 docker.io 的 registry 镜像,新建 /etc/docker/daemon.json 文件,内容如下:
{
"registry-mirrors": ["https://docker.1panel.dev"]
}
以上表示 docker daemon 使用 1panel.dev 的 docker 镜像
然后在 docker 新目录中运行以下命令:
docker build ./
docker 根据目录中的 Dockerfile 指令构建运行环境
准备 QEMU W64 编译环境
首先运行 docker 镜像,执行以下命令:
docker run --name qemu-w64 -it -d -v --rm debian:12 bash
然后,接入 docker 容器的控制台,执行以下命令:
docker attach qemu-w64
接下来安装交叉编译 QEMU W64 所需要的工具
apt update
apt install -y vim curl
apt install -y git ninja-build iasl bzip2 meson
apt install -y g++-mingw-w64 mingw-w64 mingw-w64-tools mingw-w64-x86-64-dev nsis mono-devel
apt install -y python3 python3-venv python3-sphinx python3-msmb-theme
然后下载安装 msys2 的 mingw64 软件包
apt install -y pacman-package-manager
pacman -Sy
1、
pacman -Syu
2、
pacman -Su
3、可选,基本编译工具,在 debian cross compile 中不需要
pacman -Sy --noconfirm base-devel mingw-w64-x86_64-toolchain git python ninja python-setuptools
pacman -Sy --noconfirm msys2-w32api-runtime
pacman -Sy --noconfirm base-devel mingw-w64-x86_64-toolchain git python ninja
cd /mingw64/bin
cp x86_64-w64-mingw32-gcc-ar.exe x86_64-w64-mingw32-ar.exe
cp x86_64-w64-mingw32-gcc-nm.exe x86_64-w64-mingw32-nm.exe
cp x86_64-w64-mingw32-gcc-ranlib.exe x86_64-w64-mingw32-ranlib.exe
cp widl.exe x86_64-w64-mingw32-widl.exe
cp windmc.exe x86_64-w64-mingw32-windmc.exe
cp windres.exe x86_64-w64-mingw32-windres.exe
4、基本库
pacman -Sy --noconfirm mingw-w64-x86_64-glib2
pacman -Sy --noconfirm mingw-w64-x86_64-pixman
pacman -Sy --noconfirm mingw-w64-x86_64-ncurses
5、GTK,SDL和SLiRP支持
pacman -Sy --noconfirm mingw-w64-x86_64-gtk3
pacman -Sy --noconfirm mingw-w64-x86_64-SDL2
pacman -Sy --noconfirm mingw-w64-x86_64-SDL2_gfx
pacman -Sy --noconfirm mingw-w64-x86_64-SDL2_image
pacman -Sy --noconfirm mingw-w64-x86_64-SDL2_mixer
pacman -Sy --noconfirm mingw-w64-x86_64-SDL2_net
pacman -Sy --noconfirm mingw-w64-x86_64-SDL2_pango
pacman -Sy --noconfirm mingw-w64-x86_64-SDL2_sound
pacman -Sy --noconfirm mingw-w64-x86_64-SDL2_ttf
pacman -Sy --noconfirm mingw-w64-x86_64-libslirp
6、SPICE和QXL支持
pacman -Sy --noconfirm mingw-w64-x86_64-spice-protocol
pacman -Sy --noconfirm mingw-w64-x86_64-spice
7、OpenGL支持
pacman -Sy --noconfirm mingw-w64-x86_64-virglrenderer
pacman -Sy --noconfirm mingw-w64-x86_64-libepoxy
8、capstone支持
pacman -Sy --noconfirm mingw-w64-x86_64-capstone
9、libssh支持
pacman -Sy --noconfirm mingw-w64-x86_64-libssh
10、libusb支持
pacman -Sy --noconfirm mingw-w64-x86_64-libusb
pacman -Sy --noconfirm mingw-w64-x86_64-libusb-win32
11、pthread支持
pacman -Sy --noconfirm mingw-w64-x86_64-libwinpthread-git
pacman -Sy --noconfirm mingw-w64-x86_64-winpthreads-git
12、document支持
pacman -Syu --noconfirm mingw-w64-x86_64-python-sphinx
pacman -Syu --noconfirm mingw-w64-x86_64-python-sphinx_rtd_theme
13、JACK支持
pacman -Syu --noconfirm mingw-w64-x86_64-jack2
14、USB net redir支持
pacman -Syu --noconfirm mingw-w64-x86_64-usbredir
15、SASL支持
pacman -Syu --noconfirm mingw-w64-x86_64-cyrus-sasl
16、libcbor支持
pacman -Syu --noconfirm mingw-w64-x86_64-libcbor
17、snappy支持
pacman -Syu --noconfirm mingw-w64-x86_64-snappy
18、libnfs支持
pacman -Syu --noconfirm mingw-w64-x86_64-libnfs
19、nettle支持
pacman -Syu --noconfirm mingw-w64-x86_64-nettle
20、libgcrypt支持
pacman -Syu --noconfirm mingw-w64-x86_64-libgcrypt
21、dtc支持
pacman -Syu --noconfirm mingw-w64-x86_64-dtc
8、设置 pkgconfig 环境变量
export PKG_CONFIG_PATH="/mingw64/share/pkgconfig/:/mingw64/lib/pkgconfig/:$PKG_CONFIG_PATH"
export PKG_CONFIG_LIBDIR="/mingw64/lib/pkgconfig/:$PKG_CONFIG_LIBDIR"
export PKG_CONFIG_SYSROOT_DIR=""
9、编译
./configure --cross-prefix=x86_64-w64-mingw32- --extra-cflags="-I/mingw64/include" --extra-cxxflags="-I/mingw64/include" --extra-ldflags="-L/mingw64/lib" --enable-gtk --enable-sdl --enable-opengl --enable-virglrenderer --enable-slirp --enable-nettle --enable-gnutls --enable-rng-none --enable-debug
./configure --cross-prefix=x86_64-w64-mingw32- --extra-cflags="-I/mingw64/include -D__MINGW32__ -D_FORTIFY_SOURCE=1 -D__OPTIMIZE__=0 -D__clang_major__=0 -D__clang_minor__=0" --extra-cxxflags="-I/mingw64/include -D__cplusplus=201103L" --extra-ldflags="-L/mingw64/lib" --enable-gtk --enable-sdl --enable-opengl --enable-virglrenderer --enable-slirp --enable-nettle --enable-gnutls --enable-rng-none --enable-debug
然后下载 cygwin 的软件包,转换为 deb 格式文件
git clone git@gitee.com:david921518/cyg2deb.git
cd cyg2deb
python3 -m venv env
通过以下命令激活 python 虚拟环境:
source env/bin/activate
安装 zstd 支持包
pip3 install xtarfile[zstd] --use-pep517
下载 cygwin 的软件包
python3 cyg2deb.py
安装 cygwin 的软件包
dpkg -i mingw64-x86_64-*
在 QEMU 根目录创建文件 x86_64-w64-mingw32.txt ,内容如下:
[binaries]
c = '/usr/bin/x86_64-w64-mingw32-gcc'
cpp = '/usr/bin/x86_64-w64-mingw32-g++'
ar = '/usr/bin/x86_64-w64-mingw32-ar'
strip = '/usr/bin/x86_64-w64-mingw32-strip'
pkgconfig = '/usr/bin/x86_64-w64-mingw32-pkg-config'
exe_wrapper = 'wine'
[host_machine]
system = 'windows'
cpu_family = 'x86_64'
cpu = 'x86_64'
endian = 'little'
获取 libslirp :
git clone https://gitlab.freedesktop.org/slirp/libslirp.git
获取 virgl 来实现 3D 硬件加速:
git clone https://gitlab.freedesktop.org/virgl/virglrenderer.git
创建新目录来存放编译后产生的 QEMU 依赖组件:
export CROSS_QEMU_DEPS="/home/david921518/data/docker/debian12/cross-qemu-deps"
mkdir -p $CROSS_QEMU_DEPS
安装 libslirp:
cd libslirp
meson setup --cross-file ../x86_64-w64-mingw32.txt --prefix "$CROSS_QEMU_DEPS" build-mingw/
meson compile -C build-mingw
cd build-mingw
ninja install
安装 virgl
cd ../../
cd virglrenderer
meson setup --cross-file ../x86_64-w64-mingw32.txt --prefix "$CROSS_QEMU_DEPS" build-mingw/
meson compile -C build-mingw
cd build-mingw
ninja install
Leave a Reply