使用 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 -DMINGW32 -D_FORTIFY_SOURCE=1 -DOPTIMIZE=0 -Dclang_major=0 -Dclang_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


评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

zh_CN简体中文