Back to Qemu

Setup build environment

docs/devel/build-environment.rst

11.0.05.1 KB
Original Source

.. _setup-build-env:

Setup build environment

QEMU uses a lot of dependencies on the host system a large number of which are optional. At a minimum we expect to have a system C library (usually glibc but others can work), the glib2 library (used heavily in the code base) and a few other core libraries for interfacing with code modules and system build descriptions.

We use the libvirt-ci project to handle the mapping of dependencies to a wide variety output formats including system install scripts. For example:

.. code-block:: bash

THIS FILE WAS AUTO-GENERATED

$ lcitool buildenvscript debian-13 ./tests/lcitool/projects/qemu-minimal.yml

https://gitlab.com/libvirt/libvirt-ci

function install_buildenv() { export DEBIAN_FRONTEND=noninteractive apt-get update apt-get dist-upgrade -y apt-get install --no-install-recommends -y
bash
bc
bison
bzip2
ca-certificates
ccache
findutils
flex
gcc
git
libc6-dev
libfdt-dev
libffi-dev
libglib2.0-dev
libpixman-1-dev
locales
make
meson
ninja-build
pkgconf
python3
python3-venv
sed
tar sed -Ei 's,^# (en_US.UTF-8 .)$,\1,' /etc/locale.gen dpkg-reconfigure locales rm -f /usr/lib/python3*/EXTERNALLY-MANAGED dpkg-query --showformat '${Package}${Version}${Architecture}\n' --show > /packages.txt mkdir -p /usr/libexec/ccache-wrappers ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/cc ln -s /usr/bin/ccache /usr/libexec/ccache-wrappers/gcc }

export CCACHE_WRAPPERSDIR="/usr/libexec/ccache-wrappers" export LANG="en_US.UTF-8" export MAKE="/usr/bin/make" export NINJA="/usr/bin/ninja" export PYTHON="/usr/bin/python3"

If you instead select the qemu.yml project file you will get all the dependencies that the project can use.

Using you system package manager

.. note::

Installing dependencies using your package manager build dependencies may miss out on deps that have been newly introduced in qemu.git. It also misses deps the distribution has decided to exclude.

Systems with Package Managers +++++++++++++++++++++++++++++

.. list-table:: Package Manager Commands :widths: 10 50 40 :header-rows: 1

    • System
    • Command
    • Notes
    • Fedora
    • sudo dnf update && sudo dnf builddep qemu
    • Debian/Ubuntu
    • sudo apt update && sudo apt build-dep qemu
    • Must enable Sources List <https://wiki.debian.org/SourcesList>_ first
    • MacOS
    • brew update && brew install $(brew deps --include-build qemu)
    • Using Homebrew <https://brew.sh/>_.

Windows +++++++

You first need to install MSYS2 <https://www.msys2.org/>. MSYS2 offers different environments <https://www.msys2.org/docs/environments/>. x86_64 environments are based on GCC, while aarch64 is based on Clang.

We recommend to use MINGW64 for windows-x86_64 and CLANGARM64 for windows-aarch64 (only available on windows-aarch64 hosts).

Then, you can open a windows shell, and enter msys2 env using:

::

c:/msys64/msys2_shell.cmd -defterm -here -no-start -mingw64
# Replace -ucrt64 by -clangarm64 or -ucrt64 for other environments.

MSYS2 package manager does not offer a built-in way to install build dependencies. You can start with this list of packages using pacman:

Note: Dependencies need to be installed again if you use a different MSYS2 environment.

::

# update MSYS2 itself, you need to reopen your shell at the end.
pacman -Syu
pacman -S \
    base-devel binutils bison diffutils flex git grep make sed \
    ${MINGW_PACKAGE_PREFIX}-toolchain \
    ${MINGW_PACKAGE_PREFIX}-glib2 \
    ${MINGW_PACKAGE_PREFIX}-gtk3 \
    ${MINGW_PACKAGE_PREFIX}-libnfs \
    ${MINGW_PACKAGE_PREFIX}-libssh \
    ${MINGW_PACKAGE_PREFIX}-ninja \
    ${MINGW_PACKAGE_PREFIX}-pixman \
    ${MINGW_PACKAGE_PREFIX}-pkgconf \
    ${MINGW_PACKAGE_PREFIX}-python \
    ${MINGW_PACKAGE_PREFIX}-SDL2 \
    ${MINGW_PACKAGE_PREFIX}-zstd

If you want to install all dependencies, it's possible to use recipe used to build QEMU in MSYS2 itself.

::

pacman -S wget base-devel git
wget https://raw.githubusercontent.com/msys2/MINGW-packages/refs/heads/master/mingw-w64-qemu/PKGBUILD
# Some packages may be missing for your environment, installation will still
# be done though.
makepkg --syncdeps --nobuild PKGBUILD || true

Build on windows-aarch64


When trying to cross compile meson for x86_64 using UCRT64 or MINGW64 env,
configure will run into an error because the cpu detected is not correct.

Meson detects x86_64 processes emulated, so you need to manually set the cpu,
and force a cross compilation (with empty prefix).

::

    ./configure --cpu=x86_64 --cross-prefix=