* [PATCH] docs/devel: Add cross-compiling doc
@ 2023-07-26 12:07 Andrew Jones
2023-07-26 12:22 ` Daniel Henrique Barboza
` (4 more replies)
0 siblings, 5 replies; 7+ messages in thread
From: Andrew Jones @ 2023-07-26 12:07 UTC (permalink / raw)
To: qemu-devel, qemu-riscv
Cc: alistair.francis, palmer, bin.meng, peter.maydell,
Daniel Henrique Barboza
Add instructions for how to cross-compile QEMU for RISC-V. The
file is named generically because there's no reason not to collect
other architectures steps into the same file, especially because
several subsections like those for cross-compiling QEMU dependencies
using meson and a cross-file could be shared. Additionally, other
approaches to creating sysroots, such as with debootstrap, may be
documented in this file in the future.
Signed-off-by: Andrew Jones <ajones@ventanamicro.com>
---
docs/devel/cross-compiling.rst | 221 +++++++++++++++++++++++++++++++++
1 file changed, 221 insertions(+)
create mode 100644 docs/devel/cross-compiling.rst
diff --git a/docs/devel/cross-compiling.rst b/docs/devel/cross-compiling.rst
new file mode 100644
index 000000000000..1b988ba54e4c
--- /dev/null
+++ b/docs/devel/cross-compiling.rst
@@ -0,0 +1,221 @@
+.. SPDX-License-Identifier: GPL-2.0-or-later
+
+====================
+Cross-compiling QEMU
+====================
+
+Cross-compiling QEMU first requires the preparation of a cross-toolchain
+and the cross-compiling of QEMU's dependencies. While the steps will be
+similar across architectures, each architecture will have its own specific
+recommendations. This document collects architecture-specific procedures
+and hints that may be used to cross-compile QEMU, where typically the host
+environment is x86.
+
+RISC-V
+======
+
+Toolchain
+---------
+
+Select a root directory for the cross environment
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Export an environment variable pointing to a root directory
+for the cross environment. For example, ::
+
+ $ export PREFIX="$HOME/opt/riscv"
+
+Create a work directory
+^^^^^^^^^^^^^^^^^^^^^^^
+
+Tools and several components will need to be downloaded and built. Create
+a directory for all the work, ::
+
+ $ export WORK_DIR="$HOME/work/xqemu"
+ $ mkdir -p "$WORK_DIR"
+
+Select and prepare the toolchain
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Select a toolchain such as [riscv-toolchain]_ and follow its instructions
+for building and installing it to ``$PREFIX``, e.g. ::
+
+ $ cd "$WORK_DIR"
+ $ git clone https://github.com/riscv/riscv-gnu-toolchain
+ $ cd riscv-gnu-toolchain
+ $ ./configure --prefix="$PREFIX"
+ $ make -j$(nproc) linux
+
+Set the ``$CROSS_COMPILE`` environment variable to the prefix of the cross
+tools and add the tools to ``$PATH``, ::
+
+$ export CROSS_COMPILE=riscv64-unknown-linux-gnu-
+$ export PATH="$PREFIX/bin:$PATH"
+
+Also set ``$SYSROOT``, where all QEMU cross-compiled dependencies will be
+installed. The toolchain installation likely created a 'sysroot' directory
+at ``$PREFIX/sysroot``, which is the default location for most cross
+tools, making it a good location, ::
+
+ $ mkdir -p "$PREFIX/sysroot"
+ $ export SYSROOT="$PREFIX/sysroot"
+
+Create a pkg-config wrapper
+^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The build processes of QEMU and some of its dependencies depend on
+pkg-config. Create a wrapper script for it which works for the cross
+environment: ::
+
+ $ cat <<EOF >"$PREFIX/bin/${CROSS_COMPILE}pkg-config"
+ #!/bin/sh
+
+ [ "\$SYSROOT" ] || exit 1
+
+ export PKG_CONFIG_PATH=
+ export PKG_CONFIG_LIBDIR="\${SYSROOT}/usr/lib/pkgconfig:\${SYSROOT}/usr/lib64/pkgconfig:\${SYSROOT}/usr/share/pkgconfig"
+
+ exec pkg-config "\$@"
+ EOF
+ $ chmod +x "$PREFIX/bin/${CROSS_COMPILE}pkg-config"
+
+Create a cross-file for meson builds
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+meson setup, used by some of QEMU's dependencies, needs a "cross-file" to
+configure the cross environment. Create one, ::
+
+ $ cd "$WORK_DIR"
+ $ cat <<EOF >cross_file.txt
+ [host_machine]
+ system = 'linux'
+ cpu_family = 'riscv64'
+ cpu = 'riscv64'
+ endian = 'little'
+
+ [binaries]
+ c = '${CROSS_COMPILE}gcc'
+ cpp = '${CROSS_COMPILE}g++'
+ ar = '${CROSS_COMPILE}ar'
+ ld = '${CROSS_COMPILE}ld'
+ objcopy = '${CROSS_COMPILE}objcopy'
+ strip = '${CROSS_COMPILE}strip'
+ pkgconfig = '${CROSS_COMPILE}pkg-config'
+ EOF
+
+Cross-compile dependencies
+--------------------------
+
+glibc
+^^^^^
+
+If [riscv-toolchain]_ was selected for the toolchain then this step is
+already complete and glibc has already been installed into ``$SYSROOT``.
+Otherwise, cross-compile glibc and install it to ``$SYSROOT``.
+
+libffi
+^^^^^^
+
+::
+
+ $ cd "$WORK_DIR"
+ $ git clone https://gitlab.freedesktop.org/gstreamer/meson-ports/libffi.git
+ $ cd libffi
+ $ meson setup --cross-file ../cross_file.txt --prefix="$SYSROOT/usr" _build
+ $ ninja -C _build
+ $ ninja -C _build install
+
+*Building libffi seperately avoids a compilation error generated when
+building it as a subproject of glib.*
+
+glib
+^^^^
+
+::
+
+ $ cd "$WORK_DIR"
+ $ git clone https://github.com/GNOME/glib.git
+ $ cd glib
+ $ meson setup --cross-file ../cross_file.txt --prefix="$SYSROOT/usr" _build
+ $ ninja -C _build
+ $ ninja -C _build install
+
+libslirp [optional]
+^^^^^^^^^^^^^^^^^^^
+
+::
+
+ $ cd "$WORK_DIR"
+ $ git clone https://gitlab.com/qemu-project/libslirp.git
+ $ cd libslirp
+ $ meson setup --cross-file ../cross_file.txt --prefix="$SYSROOT/usr" _build
+ $ ninja -C _build
+ $ ninja -C _build install
+
+pixman
+^^^^^^
+
+First ensure the 'libtool' package is installed, e.g.
+``sudo dnf install libtool`` or ``sudo apt install libtool``
+
+::
+
+ $ cd "$WORK_DIR"
+ $ git clone https://gitlab.freedesktop.org/pixman/pixman
+ $ cd pixman
+ $ ./autogen.sh
+ $ ./configure --prefix="$SYSROOT/usr" --host=riscv64-unknown-linux-gnu
+ $ make -j$(nproc)
+ $ make install
+
+Cross-compile QEMU
+------------------
+
+::
+
+ $ cd "$WORK_DIR"
+ $ git clone https://gitlab.com/qemu-project/qemu.git
+ $ cd qemu
+ $ mkdir -p build/install_dir
+ $ cd build
+ $ ../configure --target-list=riscv64-softmmu --cross-prefix=$CROSS_COMPILE --prefix="$PWD/install_dir"
+ $ make -j$(nproc)
+ $ make install
+
+*Cross-compiling QEMU with different configurations may require more
+dependencies to be built and installed in the sysroot.*
+
+Running QEMU
+------------
+
+``build/install_dir`` may now be copied to the target and its bin
+directory may be added to the target user's PATH. Prior to running
+QEMU, ensure all the libraries it depends on are present, ::
+
+ $ ldd /path/to/bin/qemu-system-riscv64
+
+For example, it may necessary to install zlib libraries, e.g.
+``sudo dnf install zlib-devel`` or ``sudo apt install zlib1g-dev``
+
+Subsequent QEMU Cross-compiling
+-------------------------------
+
+Unless it's necessary to update and recompile the toolchain or
+dependencies, then most steps do not need to be repeated for subsequent
+compiles. Simply ensure the toolchain is in ``$PATH``, ``$SYSROOT`` points
+at the sysroot, and then follow the QEMU cross-compile steps in
+"Cross-compile QEMU". For example, ::
+
+ $ export PATH="$HOME/opt/riscv/bin:$PATH"
+ $ export SYSROOT="$HOME/opt/riscv/sysroot"
+ $ cd /path/to/qemu
+ $ mkdir -p build/install_dir
+ $ cd build
+ $ ../configure --target-list=riscv64-softmmu --cross-prefix=riscv64-unknown-linux-gnu- --prefix="$PWD/install_dir"
+ $ make -j
+ $ make install
+
+References
+----------
+
+.. [riscv-toolchain] https://github.com/riscv/riscv-gnu-toolchain
--
2.41.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH] docs/devel: Add cross-compiling doc
2023-07-26 12:07 [PATCH] docs/devel: Add cross-compiling doc Andrew Jones
@ 2023-07-26 12:22 ` Daniel Henrique Barboza
2023-09-07 2:25 ` Alistair Francis
` (3 subsequent siblings)
4 siblings, 0 replies; 7+ messages in thread
From: Daniel Henrique Barboza @ 2023-07-26 12:22 UTC (permalink / raw)
To: Andrew Jones, qemu-devel, qemu-riscv
Cc: alistair.francis, palmer, bin.meng, peter.maydell
On 7/26/23 09:07, Andrew Jones wrote:
> Add instructions for how to cross-compile QEMU for RISC-V. The
> file is named generically because there's no reason not to collect
> other architectures steps into the same file, especially because
> several subsections like those for cross-compiling QEMU dependencies
> using meson and a cross-file could be shared. Additionally, other
> approaches to creating sysroots, such as with debootstrap, may be
> documented in this file in the future.
>
> Signed-off-by: Andrew Jones <ajones@ventanamicro.com>
> ---
Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
I've also tested the steps and it works. Not having to compile QEMU inside an
emulated risc-v instance will be a dramatic increase in my lifespan. This is
the best doc entry of the year for sure.
Tested-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
> docs/devel/cross-compiling.rst | 221 +++++++++++++++++++++++++++++++++
> 1 file changed, 221 insertions(+)
> create mode 100644 docs/devel/cross-compiling.rst
>
> diff --git a/docs/devel/cross-compiling.rst b/docs/devel/cross-compiling.rst
> new file mode 100644
> index 000000000000..1b988ba54e4c
> --- /dev/null
> +++ b/docs/devel/cross-compiling.rst
> @@ -0,0 +1,221 @@
> +.. SPDX-License-Identifier: GPL-2.0-or-later
> +
> +====================
> +Cross-compiling QEMU
> +====================
> +
> +Cross-compiling QEMU first requires the preparation of a cross-toolchain
> +and the cross-compiling of QEMU's dependencies. While the steps will be
> +similar across architectures, each architecture will have its own specific
> +recommendations. This document collects architecture-specific procedures
> +and hints that may be used to cross-compile QEMU, where typically the host
> +environment is x86.
> +
> +RISC-V
> +======
> +
> +Toolchain
> +---------
> +
> +Select a root directory for the cross environment
> +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> +
> +Export an environment variable pointing to a root directory
> +for the cross environment. For example, ::
> +
> + $ export PREFIX="$HOME/opt/riscv"
> +
> +Create a work directory
> +^^^^^^^^^^^^^^^^^^^^^^^
> +
> +Tools and several components will need to be downloaded and built. Create
> +a directory for all the work, ::
> +
> + $ export WORK_DIR="$HOME/work/xqemu"
> + $ mkdir -p "$WORK_DIR"
> +
> +Select and prepare the toolchain
> +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> +
> +Select a toolchain such as [riscv-toolchain]_ and follow its instructions
> +for building and installing it to ``$PREFIX``, e.g. ::
> +
> + $ cd "$WORK_DIR"
> + $ git clone https://github.com/riscv/riscv-gnu-toolchain
> + $ cd riscv-gnu-toolchain
> + $ ./configure --prefix="$PREFIX"
> + $ make -j$(nproc) linux
> +
> +Set the ``$CROSS_COMPILE`` environment variable to the prefix of the cross
> +tools and add the tools to ``$PATH``, ::
> +
> +$ export CROSS_COMPILE=riscv64-unknown-linux-gnu-
> +$ export PATH="$PREFIX/bin:$PATH"
> +
> +Also set ``$SYSROOT``, where all QEMU cross-compiled dependencies will be
> +installed. The toolchain installation likely created a 'sysroot' directory
> +at ``$PREFIX/sysroot``, which is the default location for most cross
> +tools, making it a good location, ::
> +
> + $ mkdir -p "$PREFIX/sysroot"
> + $ export SYSROOT="$PREFIX/sysroot"
> +
> +Create a pkg-config wrapper
> +^^^^^^^^^^^^^^^^^^^^^^^^^^^
> +
> +The build processes of QEMU and some of its dependencies depend on
> +pkg-config. Create a wrapper script for it which works for the cross
> +environment: ::
> +
> + $ cat <<EOF >"$PREFIX/bin/${CROSS_COMPILE}pkg-config"
> + #!/bin/sh
> +
> + [ "\$SYSROOT" ] || exit 1
> +
> + export PKG_CONFIG_PATH=
> + export PKG_CONFIG_LIBDIR="\${SYSROOT}/usr/lib/pkgconfig:\${SYSROOT}/usr/lib64/pkgconfig:\${SYSROOT}/usr/share/pkgconfig"
> +
> + exec pkg-config "\$@"
> + EOF
> + $ chmod +x "$PREFIX/bin/${CROSS_COMPILE}pkg-config"
> +
> +Create a cross-file for meson builds
> +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> +
> +meson setup, used by some of QEMU's dependencies, needs a "cross-file" to
> +configure the cross environment. Create one, ::
> +
> + $ cd "$WORK_DIR"
> + $ cat <<EOF >cross_file.txt
> + [host_machine]
> + system = 'linux'
> + cpu_family = 'riscv64'
> + cpu = 'riscv64'
> + endian = 'little'
> +
> + [binaries]
> + c = '${CROSS_COMPILE}gcc'
> + cpp = '${CROSS_COMPILE}g++'
> + ar = '${CROSS_COMPILE}ar'
> + ld = '${CROSS_COMPILE}ld'
> + objcopy = '${CROSS_COMPILE}objcopy'
> + strip = '${CROSS_COMPILE}strip'
> + pkgconfig = '${CROSS_COMPILE}pkg-config'
> + EOF
> +
> +Cross-compile dependencies
> +--------------------------
> +
> +glibc
> +^^^^^
> +
> +If [riscv-toolchain]_ was selected for the toolchain then this step is
> +already complete and glibc has already been installed into ``$SYSROOT``.
> +Otherwise, cross-compile glibc and install it to ``$SYSROOT``.
> +
> +libffi
> +^^^^^^
> +
> +::
> +
> + $ cd "$WORK_DIR"
> + $ git clone https://gitlab.freedesktop.org/gstreamer/meson-ports/libffi.git
> + $ cd libffi
> + $ meson setup --cross-file ../cross_file.txt --prefix="$SYSROOT/usr" _build
> + $ ninja -C _build
> + $ ninja -C _build install
> +
> +*Building libffi seperately avoids a compilation error generated when
> +building it as a subproject of glib.*
> +
> +glib
> +^^^^
> +
> +::
> +
> + $ cd "$WORK_DIR"
> + $ git clone https://github.com/GNOME/glib.git
> + $ cd glib
> + $ meson setup --cross-file ../cross_file.txt --prefix="$SYSROOT/usr" _build
> + $ ninja -C _build
> + $ ninja -C _build install
> +
> +libslirp [optional]
> +^^^^^^^^^^^^^^^^^^^
> +
> +::
> +
> + $ cd "$WORK_DIR"
> + $ git clone https://gitlab.com/qemu-project/libslirp.git
> + $ cd libslirp
> + $ meson setup --cross-file ../cross_file.txt --prefix="$SYSROOT/usr" _build
> + $ ninja -C _build
> + $ ninja -C _build install
> +
> +pixman
> +^^^^^^
> +
> +First ensure the 'libtool' package is installed, e.g.
> +``sudo dnf install libtool`` or ``sudo apt install libtool``
> +
> +::
> +
> + $ cd "$WORK_DIR"
> + $ git clone https://gitlab.freedesktop.org/pixman/pixman
> + $ cd pixman
> + $ ./autogen.sh
> + $ ./configure --prefix="$SYSROOT/usr" --host=riscv64-unknown-linux-gnu
> + $ make -j$(nproc)
> + $ make install
> +
> +Cross-compile QEMU
> +------------------
> +
> +::
> +
> + $ cd "$WORK_DIR"
> + $ git clone https://gitlab.com/qemu-project/qemu.git
> + $ cd qemu
> + $ mkdir -p build/install_dir
> + $ cd build
> + $ ../configure --target-list=riscv64-softmmu --cross-prefix=$CROSS_COMPILE --prefix="$PWD/install_dir"
> + $ make -j$(nproc)
> + $ make install
> +
> +*Cross-compiling QEMU with different configurations may require more
> +dependencies to be built and installed in the sysroot.*
> +
> +Running QEMU
> +------------
> +
> +``build/install_dir`` may now be copied to the target and its bin
> +directory may be added to the target user's PATH. Prior to running
> +QEMU, ensure all the libraries it depends on are present, ::
> +
> + $ ldd /path/to/bin/qemu-system-riscv64
> +
> +For example, it may necessary to install zlib libraries, e.g.
> +``sudo dnf install zlib-devel`` or ``sudo apt install zlib1g-dev``
> +
> +Subsequent QEMU Cross-compiling
> +-------------------------------
> +
> +Unless it's necessary to update and recompile the toolchain or
> +dependencies, then most steps do not need to be repeated for subsequent
> +compiles. Simply ensure the toolchain is in ``$PATH``, ``$SYSROOT`` points
> +at the sysroot, and then follow the QEMU cross-compile steps in
> +"Cross-compile QEMU". For example, ::
> +
> + $ export PATH="$HOME/opt/riscv/bin:$PATH"
> + $ export SYSROOT="$HOME/opt/riscv/sysroot"
> + $ cd /path/to/qemu
> + $ mkdir -p build/install_dir
> + $ cd build
> + $ ../configure --target-list=riscv64-softmmu --cross-prefix=riscv64-unknown-linux-gnu- --prefix="$PWD/install_dir"
> + $ make -j
> + $ make install
> +
> +References
> +----------
> +
> +.. [riscv-toolchain] https://github.com/riscv/riscv-gnu-toolchain
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] docs/devel: Add cross-compiling doc
2023-07-26 12:07 [PATCH] docs/devel: Add cross-compiling doc Andrew Jones
2023-07-26 12:22 ` Daniel Henrique Barboza
@ 2023-09-07 2:25 ` Alistair Francis
2023-09-07 2:29 ` Alistair Francis
` (2 subsequent siblings)
4 siblings, 0 replies; 7+ messages in thread
From: Alistair Francis @ 2023-09-07 2:25 UTC (permalink / raw)
To: Andrew Jones
Cc: qemu-devel, qemu-riscv, alistair.francis, palmer, bin.meng,
peter.maydell, Daniel Henrique Barboza
On Wed, Jul 26, 2023 at 10:08 PM Andrew Jones <ajones@ventanamicro.com> wrote:
>
> Add instructions for how to cross-compile QEMU for RISC-V. The
> file is named generically because there's no reason not to collect
> other architectures steps into the same file, especially because
> several subsections like those for cross-compiling QEMU dependencies
> using meson and a cross-file could be shared. Additionally, other
> approaches to creating sysroots, such as with debootstrap, may be
> documented in this file in the future.
>
> Signed-off-by: Andrew Jones <ajones@ventanamicro.com>
Acked-by: Alistair Francis <alistair.francis@wdc.com>
Alistair
> ---
> docs/devel/cross-compiling.rst | 221 +++++++++++++++++++++++++++++++++
> 1 file changed, 221 insertions(+)
> create mode 100644 docs/devel/cross-compiling.rst
>
> diff --git a/docs/devel/cross-compiling.rst b/docs/devel/cross-compiling.rst
> new file mode 100644
> index 000000000000..1b988ba54e4c
> --- /dev/null
> +++ b/docs/devel/cross-compiling.rst
> @@ -0,0 +1,221 @@
> +.. SPDX-License-Identifier: GPL-2.0-or-later
> +
> +====================
> +Cross-compiling QEMU
> +====================
> +
> +Cross-compiling QEMU first requires the preparation of a cross-toolchain
> +and the cross-compiling of QEMU's dependencies. While the steps will be
> +similar across architectures, each architecture will have its own specific
> +recommendations. This document collects architecture-specific procedures
> +and hints that may be used to cross-compile QEMU, where typically the host
> +environment is x86.
> +
> +RISC-V
> +======
> +
> +Toolchain
> +---------
> +
> +Select a root directory for the cross environment
> +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> +
> +Export an environment variable pointing to a root directory
> +for the cross environment. For example, ::
> +
> + $ export PREFIX="$HOME/opt/riscv"
> +
> +Create a work directory
> +^^^^^^^^^^^^^^^^^^^^^^^
> +
> +Tools and several components will need to be downloaded and built. Create
> +a directory for all the work, ::
> +
> + $ export WORK_DIR="$HOME/work/xqemu"
> + $ mkdir -p "$WORK_DIR"
> +
> +Select and prepare the toolchain
> +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> +
> +Select a toolchain such as [riscv-toolchain]_ and follow its instructions
> +for building and installing it to ``$PREFIX``, e.g. ::
> +
> + $ cd "$WORK_DIR"
> + $ git clone https://github.com/riscv/riscv-gnu-toolchain
> + $ cd riscv-gnu-toolchain
> + $ ./configure --prefix="$PREFIX"
> + $ make -j$(nproc) linux
> +
> +Set the ``$CROSS_COMPILE`` environment variable to the prefix of the cross
> +tools and add the tools to ``$PATH``, ::
> +
> +$ export CROSS_COMPILE=riscv64-unknown-linux-gnu-
> +$ export PATH="$PREFIX/bin:$PATH"
> +
> +Also set ``$SYSROOT``, where all QEMU cross-compiled dependencies will be
> +installed. The toolchain installation likely created a 'sysroot' directory
> +at ``$PREFIX/sysroot``, which is the default location for most cross
> +tools, making it a good location, ::
> +
> + $ mkdir -p "$PREFIX/sysroot"
> + $ export SYSROOT="$PREFIX/sysroot"
> +
> +Create a pkg-config wrapper
> +^^^^^^^^^^^^^^^^^^^^^^^^^^^
> +
> +The build processes of QEMU and some of its dependencies depend on
> +pkg-config. Create a wrapper script for it which works for the cross
> +environment: ::
> +
> + $ cat <<EOF >"$PREFIX/bin/${CROSS_COMPILE}pkg-config"
> + #!/bin/sh
> +
> + [ "\$SYSROOT" ] || exit 1
> +
> + export PKG_CONFIG_PATH=
> + export PKG_CONFIG_LIBDIR="\${SYSROOT}/usr/lib/pkgconfig:\${SYSROOT}/usr/lib64/pkgconfig:\${SYSROOT}/usr/share/pkgconfig"
> +
> + exec pkg-config "\$@"
> + EOF
> + $ chmod +x "$PREFIX/bin/${CROSS_COMPILE}pkg-config"
> +
> +Create a cross-file for meson builds
> +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> +
> +meson setup, used by some of QEMU's dependencies, needs a "cross-file" to
> +configure the cross environment. Create one, ::
> +
> + $ cd "$WORK_DIR"
> + $ cat <<EOF >cross_file.txt
> + [host_machine]
> + system = 'linux'
> + cpu_family = 'riscv64'
> + cpu = 'riscv64'
> + endian = 'little'
> +
> + [binaries]
> + c = '${CROSS_COMPILE}gcc'
> + cpp = '${CROSS_COMPILE}g++'
> + ar = '${CROSS_COMPILE}ar'
> + ld = '${CROSS_COMPILE}ld'
> + objcopy = '${CROSS_COMPILE}objcopy'
> + strip = '${CROSS_COMPILE}strip'
> + pkgconfig = '${CROSS_COMPILE}pkg-config'
> + EOF
> +
> +Cross-compile dependencies
> +--------------------------
> +
> +glibc
> +^^^^^
> +
> +If [riscv-toolchain]_ was selected for the toolchain then this step is
> +already complete and glibc has already been installed into ``$SYSROOT``.
> +Otherwise, cross-compile glibc and install it to ``$SYSROOT``.
> +
> +libffi
> +^^^^^^
> +
> +::
> +
> + $ cd "$WORK_DIR"
> + $ git clone https://gitlab.freedesktop.org/gstreamer/meson-ports/libffi.git
> + $ cd libffi
> + $ meson setup --cross-file ../cross_file.txt --prefix="$SYSROOT/usr" _build
> + $ ninja -C _build
> + $ ninja -C _build install
> +
> +*Building libffi seperately avoids a compilation error generated when
> +building it as a subproject of glib.*
> +
> +glib
> +^^^^
> +
> +::
> +
> + $ cd "$WORK_DIR"
> + $ git clone https://github.com/GNOME/glib.git
> + $ cd glib
> + $ meson setup --cross-file ../cross_file.txt --prefix="$SYSROOT/usr" _build
> + $ ninja -C _build
> + $ ninja -C _build install
> +
> +libslirp [optional]
> +^^^^^^^^^^^^^^^^^^^
> +
> +::
> +
> + $ cd "$WORK_DIR"
> + $ git clone https://gitlab.com/qemu-project/libslirp.git
> + $ cd libslirp
> + $ meson setup --cross-file ../cross_file.txt --prefix="$SYSROOT/usr" _build
> + $ ninja -C _build
> + $ ninja -C _build install
> +
> +pixman
> +^^^^^^
> +
> +First ensure the 'libtool' package is installed, e.g.
> +``sudo dnf install libtool`` or ``sudo apt install libtool``
> +
> +::
> +
> + $ cd "$WORK_DIR"
> + $ git clone https://gitlab.freedesktop.org/pixman/pixman
> + $ cd pixman
> + $ ./autogen.sh
> + $ ./configure --prefix="$SYSROOT/usr" --host=riscv64-unknown-linux-gnu
> + $ make -j$(nproc)
> + $ make install
> +
> +Cross-compile QEMU
> +------------------
> +
> +::
> +
> + $ cd "$WORK_DIR"
> + $ git clone https://gitlab.com/qemu-project/qemu.git
> + $ cd qemu
> + $ mkdir -p build/install_dir
> + $ cd build
> + $ ../configure --target-list=riscv64-softmmu --cross-prefix=$CROSS_COMPILE --prefix="$PWD/install_dir"
> + $ make -j$(nproc)
> + $ make install
> +
> +*Cross-compiling QEMU with different configurations may require more
> +dependencies to be built and installed in the sysroot.*
> +
> +Running QEMU
> +------------
> +
> +``build/install_dir`` may now be copied to the target and its bin
> +directory may be added to the target user's PATH. Prior to running
> +QEMU, ensure all the libraries it depends on are present, ::
> +
> + $ ldd /path/to/bin/qemu-system-riscv64
> +
> +For example, it may necessary to install zlib libraries, e.g.
> +``sudo dnf install zlib-devel`` or ``sudo apt install zlib1g-dev``
> +
> +Subsequent QEMU Cross-compiling
> +-------------------------------
> +
> +Unless it's necessary to update and recompile the toolchain or
> +dependencies, then most steps do not need to be repeated for subsequent
> +compiles. Simply ensure the toolchain is in ``$PATH``, ``$SYSROOT`` points
> +at the sysroot, and then follow the QEMU cross-compile steps in
> +"Cross-compile QEMU". For example, ::
> +
> + $ export PATH="$HOME/opt/riscv/bin:$PATH"
> + $ export SYSROOT="$HOME/opt/riscv/sysroot"
> + $ cd /path/to/qemu
> + $ mkdir -p build/install_dir
> + $ cd build
> + $ ../configure --target-list=riscv64-softmmu --cross-prefix=riscv64-unknown-linux-gnu- --prefix="$PWD/install_dir"
> + $ make -j
> + $ make install
> +
> +References
> +----------
> +
> +.. [riscv-toolchain] https://github.com/riscv/riscv-gnu-toolchain
> --
> 2.41.0
>
>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] docs/devel: Add cross-compiling doc
2023-07-26 12:07 [PATCH] docs/devel: Add cross-compiling doc Andrew Jones
2023-07-26 12:22 ` Daniel Henrique Barboza
2023-09-07 2:25 ` Alistair Francis
@ 2023-09-07 2:29 ` Alistair Francis
2023-09-07 3:13 ` Alistair Francis
2023-09-07 9:16 ` Alex Bennée
4 siblings, 0 replies; 7+ messages in thread
From: Alistair Francis @ 2023-09-07 2:29 UTC (permalink / raw)
To: Andrew Jones
Cc: qemu-devel, qemu-riscv, alistair.francis, palmer, bin.meng,
peter.maydell, Daniel Henrique Barboza
On Wed, Jul 26, 2023 at 10:08 PM Andrew Jones <ajones@ventanamicro.com> wrote:
>
> Add instructions for how to cross-compile QEMU for RISC-V. The
> file is named generically because there's no reason not to collect
> other architectures steps into the same file, especially because
> several subsections like those for cross-compiling QEMU dependencies
> using meson and a cross-file could be shared. Additionally, other
> approaches to creating sysroots, such as with debootstrap, may be
> documented in this file in the future.
>
> Signed-off-by: Andrew Jones <ajones@ventanamicro.com>
Thanks!
Applied to riscv-to-apply.next
Alistair
> ---
> docs/devel/cross-compiling.rst | 221 +++++++++++++++++++++++++++++++++
> 1 file changed, 221 insertions(+)
> create mode 100644 docs/devel/cross-compiling.rst
>
> diff --git a/docs/devel/cross-compiling.rst b/docs/devel/cross-compiling.rst
> new file mode 100644
> index 000000000000..1b988ba54e4c
> --- /dev/null
> +++ b/docs/devel/cross-compiling.rst
> @@ -0,0 +1,221 @@
> +.. SPDX-License-Identifier: GPL-2.0-or-later
> +
> +====================
> +Cross-compiling QEMU
> +====================
> +
> +Cross-compiling QEMU first requires the preparation of a cross-toolchain
> +and the cross-compiling of QEMU's dependencies. While the steps will be
> +similar across architectures, each architecture will have its own specific
> +recommendations. This document collects architecture-specific procedures
> +and hints that may be used to cross-compile QEMU, where typically the host
> +environment is x86.
> +
> +RISC-V
> +======
> +
> +Toolchain
> +---------
> +
> +Select a root directory for the cross environment
> +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> +
> +Export an environment variable pointing to a root directory
> +for the cross environment. For example, ::
> +
> + $ export PREFIX="$HOME/opt/riscv"
> +
> +Create a work directory
> +^^^^^^^^^^^^^^^^^^^^^^^
> +
> +Tools and several components will need to be downloaded and built. Create
> +a directory for all the work, ::
> +
> + $ export WORK_DIR="$HOME/work/xqemu"
> + $ mkdir -p "$WORK_DIR"
> +
> +Select and prepare the toolchain
> +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> +
> +Select a toolchain such as [riscv-toolchain]_ and follow its instructions
> +for building and installing it to ``$PREFIX``, e.g. ::
> +
> + $ cd "$WORK_DIR"
> + $ git clone https://github.com/riscv/riscv-gnu-toolchain
> + $ cd riscv-gnu-toolchain
> + $ ./configure --prefix="$PREFIX"
> + $ make -j$(nproc) linux
> +
> +Set the ``$CROSS_COMPILE`` environment variable to the prefix of the cross
> +tools and add the tools to ``$PATH``, ::
> +
> +$ export CROSS_COMPILE=riscv64-unknown-linux-gnu-
> +$ export PATH="$PREFIX/bin:$PATH"
> +
> +Also set ``$SYSROOT``, where all QEMU cross-compiled dependencies will be
> +installed. The toolchain installation likely created a 'sysroot' directory
> +at ``$PREFIX/sysroot``, which is the default location for most cross
> +tools, making it a good location, ::
> +
> + $ mkdir -p "$PREFIX/sysroot"
> + $ export SYSROOT="$PREFIX/sysroot"
> +
> +Create a pkg-config wrapper
> +^^^^^^^^^^^^^^^^^^^^^^^^^^^
> +
> +The build processes of QEMU and some of its dependencies depend on
> +pkg-config. Create a wrapper script for it which works for the cross
> +environment: ::
> +
> + $ cat <<EOF >"$PREFIX/bin/${CROSS_COMPILE}pkg-config"
> + #!/bin/sh
> +
> + [ "\$SYSROOT" ] || exit 1
> +
> + export PKG_CONFIG_PATH=
> + export PKG_CONFIG_LIBDIR="\${SYSROOT}/usr/lib/pkgconfig:\${SYSROOT}/usr/lib64/pkgconfig:\${SYSROOT}/usr/share/pkgconfig"
> +
> + exec pkg-config "\$@"
> + EOF
> + $ chmod +x "$PREFIX/bin/${CROSS_COMPILE}pkg-config"
> +
> +Create a cross-file for meson builds
> +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> +
> +meson setup, used by some of QEMU's dependencies, needs a "cross-file" to
> +configure the cross environment. Create one, ::
> +
> + $ cd "$WORK_DIR"
> + $ cat <<EOF >cross_file.txt
> + [host_machine]
> + system = 'linux'
> + cpu_family = 'riscv64'
> + cpu = 'riscv64'
> + endian = 'little'
> +
> + [binaries]
> + c = '${CROSS_COMPILE}gcc'
> + cpp = '${CROSS_COMPILE}g++'
> + ar = '${CROSS_COMPILE}ar'
> + ld = '${CROSS_COMPILE}ld'
> + objcopy = '${CROSS_COMPILE}objcopy'
> + strip = '${CROSS_COMPILE}strip'
> + pkgconfig = '${CROSS_COMPILE}pkg-config'
> + EOF
> +
> +Cross-compile dependencies
> +--------------------------
> +
> +glibc
> +^^^^^
> +
> +If [riscv-toolchain]_ was selected for the toolchain then this step is
> +already complete and glibc has already been installed into ``$SYSROOT``.
> +Otherwise, cross-compile glibc and install it to ``$SYSROOT``.
> +
> +libffi
> +^^^^^^
> +
> +::
> +
> + $ cd "$WORK_DIR"
> + $ git clone https://gitlab.freedesktop.org/gstreamer/meson-ports/libffi.git
> + $ cd libffi
> + $ meson setup --cross-file ../cross_file.txt --prefix="$SYSROOT/usr" _build
> + $ ninja -C _build
> + $ ninja -C _build install
> +
> +*Building libffi seperately avoids a compilation error generated when
> +building it as a subproject of glib.*
> +
> +glib
> +^^^^
> +
> +::
> +
> + $ cd "$WORK_DIR"
> + $ git clone https://github.com/GNOME/glib.git
> + $ cd glib
> + $ meson setup --cross-file ../cross_file.txt --prefix="$SYSROOT/usr" _build
> + $ ninja -C _build
> + $ ninja -C _build install
> +
> +libslirp [optional]
> +^^^^^^^^^^^^^^^^^^^
> +
> +::
> +
> + $ cd "$WORK_DIR"
> + $ git clone https://gitlab.com/qemu-project/libslirp.git
> + $ cd libslirp
> + $ meson setup --cross-file ../cross_file.txt --prefix="$SYSROOT/usr" _build
> + $ ninja -C _build
> + $ ninja -C _build install
> +
> +pixman
> +^^^^^^
> +
> +First ensure the 'libtool' package is installed, e.g.
> +``sudo dnf install libtool`` or ``sudo apt install libtool``
> +
> +::
> +
> + $ cd "$WORK_DIR"
> + $ git clone https://gitlab.freedesktop.org/pixman/pixman
> + $ cd pixman
> + $ ./autogen.sh
> + $ ./configure --prefix="$SYSROOT/usr" --host=riscv64-unknown-linux-gnu
> + $ make -j$(nproc)
> + $ make install
> +
> +Cross-compile QEMU
> +------------------
> +
> +::
> +
> + $ cd "$WORK_DIR"
> + $ git clone https://gitlab.com/qemu-project/qemu.git
> + $ cd qemu
> + $ mkdir -p build/install_dir
> + $ cd build
> + $ ../configure --target-list=riscv64-softmmu --cross-prefix=$CROSS_COMPILE --prefix="$PWD/install_dir"
> + $ make -j$(nproc)
> + $ make install
> +
> +*Cross-compiling QEMU with different configurations may require more
> +dependencies to be built and installed in the sysroot.*
> +
> +Running QEMU
> +------------
> +
> +``build/install_dir`` may now be copied to the target and its bin
> +directory may be added to the target user's PATH. Prior to running
> +QEMU, ensure all the libraries it depends on are present, ::
> +
> + $ ldd /path/to/bin/qemu-system-riscv64
> +
> +For example, it may necessary to install zlib libraries, e.g.
> +``sudo dnf install zlib-devel`` or ``sudo apt install zlib1g-dev``
> +
> +Subsequent QEMU Cross-compiling
> +-------------------------------
> +
> +Unless it's necessary to update and recompile the toolchain or
> +dependencies, then most steps do not need to be repeated for subsequent
> +compiles. Simply ensure the toolchain is in ``$PATH``, ``$SYSROOT`` points
> +at the sysroot, and then follow the QEMU cross-compile steps in
> +"Cross-compile QEMU". For example, ::
> +
> + $ export PATH="$HOME/opt/riscv/bin:$PATH"
> + $ export SYSROOT="$HOME/opt/riscv/sysroot"
> + $ cd /path/to/qemu
> + $ mkdir -p build/install_dir
> + $ cd build
> + $ ../configure --target-list=riscv64-softmmu --cross-prefix=riscv64-unknown-linux-gnu- --prefix="$PWD/install_dir"
> + $ make -j
> + $ make install
> +
> +References
> +----------
> +
> +.. [riscv-toolchain] https://github.com/riscv/riscv-gnu-toolchain
> --
> 2.41.0
>
>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] docs/devel: Add cross-compiling doc
2023-07-26 12:07 [PATCH] docs/devel: Add cross-compiling doc Andrew Jones
` (2 preceding siblings ...)
2023-09-07 2:29 ` Alistair Francis
@ 2023-09-07 3:13 ` Alistair Francis
2023-09-07 8:48 ` Andrew Jones
2023-09-07 9:16 ` Alex Bennée
4 siblings, 1 reply; 7+ messages in thread
From: Alistair Francis @ 2023-09-07 3:13 UTC (permalink / raw)
To: Andrew Jones
Cc: qemu-devel, qemu-riscv, alistair.francis, palmer, bin.meng,
peter.maydell, Daniel Henrique Barboza
On Wed, Jul 26, 2023 at 10:08 PM Andrew Jones <ajones@ventanamicro.com> wrote:
>
> Add instructions for how to cross-compile QEMU for RISC-V. The
> file is named generically because there's no reason not to collect
> other architectures steps into the same file, especially because
> several subsections like those for cross-compiling QEMU dependencies
> using meson and a cross-file could be shared. Additionally, other
> approaches to creating sysroots, such as with debootstrap, may be
> documented in this file in the future.
>
> Signed-off-by: Andrew Jones <ajones@ventanamicro.com>
I get a warning when building this:
qemu/docs/devel/cross-compiling.rst: WARNING: document isn't included
in any toctree
Do you mind adding a toc reference to it and sending a v2?
Alistair
> ---
> docs/devel/cross-compiling.rst | 221 +++++++++++++++++++++++++++++++++
> 1 file changed, 221 insertions(+)
> create mode 100644 docs/devel/cross-compiling.rst
>
> diff --git a/docs/devel/cross-compiling.rst b/docs/devel/cross-compiling.rst
> new file mode 100644
> index 000000000000..1b988ba54e4c
> --- /dev/null
> +++ b/docs/devel/cross-compiling.rst
> @@ -0,0 +1,221 @@
> +.. SPDX-License-Identifier: GPL-2.0-or-later
> +
> +====================
> +Cross-compiling QEMU
> +====================
> +
> +Cross-compiling QEMU first requires the preparation of a cross-toolchain
> +and the cross-compiling of QEMU's dependencies. While the steps will be
> +similar across architectures, each architecture will have its own specific
> +recommendations. This document collects architecture-specific procedures
> +and hints that may be used to cross-compile QEMU, where typically the host
> +environment is x86.
> +
> +RISC-V
> +======
> +
> +Toolchain
> +---------
> +
> +Select a root directory for the cross environment
> +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> +
> +Export an environment variable pointing to a root directory
> +for the cross environment. For example, ::
> +
> + $ export PREFIX="$HOME/opt/riscv"
> +
> +Create a work directory
> +^^^^^^^^^^^^^^^^^^^^^^^
> +
> +Tools and several components will need to be downloaded and built. Create
> +a directory for all the work, ::
> +
> + $ export WORK_DIR="$HOME/work/xqemu"
> + $ mkdir -p "$WORK_DIR"
> +
> +Select and prepare the toolchain
> +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> +
> +Select a toolchain such as [riscv-toolchain]_ and follow its instructions
> +for building and installing it to ``$PREFIX``, e.g. ::
> +
> + $ cd "$WORK_DIR"
> + $ git clone https://github.com/riscv/riscv-gnu-toolchain
> + $ cd riscv-gnu-toolchain
> + $ ./configure --prefix="$PREFIX"
> + $ make -j$(nproc) linux
> +
> +Set the ``$CROSS_COMPILE`` environment variable to the prefix of the cross
> +tools and add the tools to ``$PATH``, ::
> +
> +$ export CROSS_COMPILE=riscv64-unknown-linux-gnu-
> +$ export PATH="$PREFIX/bin:$PATH"
> +
> +Also set ``$SYSROOT``, where all QEMU cross-compiled dependencies will be
> +installed. The toolchain installation likely created a 'sysroot' directory
> +at ``$PREFIX/sysroot``, which is the default location for most cross
> +tools, making it a good location, ::
> +
> + $ mkdir -p "$PREFIX/sysroot"
> + $ export SYSROOT="$PREFIX/sysroot"
> +
> +Create a pkg-config wrapper
> +^^^^^^^^^^^^^^^^^^^^^^^^^^^
> +
> +The build processes of QEMU and some of its dependencies depend on
> +pkg-config. Create a wrapper script for it which works for the cross
> +environment: ::
> +
> + $ cat <<EOF >"$PREFIX/bin/${CROSS_COMPILE}pkg-config"
> + #!/bin/sh
> +
> + [ "\$SYSROOT" ] || exit 1
> +
> + export PKG_CONFIG_PATH=
> + export PKG_CONFIG_LIBDIR="\${SYSROOT}/usr/lib/pkgconfig:\${SYSROOT}/usr/lib64/pkgconfig:\${SYSROOT}/usr/share/pkgconfig"
> +
> + exec pkg-config "\$@"
> + EOF
> + $ chmod +x "$PREFIX/bin/${CROSS_COMPILE}pkg-config"
> +
> +Create a cross-file for meson builds
> +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> +
> +meson setup, used by some of QEMU's dependencies, needs a "cross-file" to
> +configure the cross environment. Create one, ::
> +
> + $ cd "$WORK_DIR"
> + $ cat <<EOF >cross_file.txt
> + [host_machine]
> + system = 'linux'
> + cpu_family = 'riscv64'
> + cpu = 'riscv64'
> + endian = 'little'
> +
> + [binaries]
> + c = '${CROSS_COMPILE}gcc'
> + cpp = '${CROSS_COMPILE}g++'
> + ar = '${CROSS_COMPILE}ar'
> + ld = '${CROSS_COMPILE}ld'
> + objcopy = '${CROSS_COMPILE}objcopy'
> + strip = '${CROSS_COMPILE}strip'
> + pkgconfig = '${CROSS_COMPILE}pkg-config'
> + EOF
> +
> +Cross-compile dependencies
> +--------------------------
> +
> +glibc
> +^^^^^
> +
> +If [riscv-toolchain]_ was selected for the toolchain then this step is
> +already complete and glibc has already been installed into ``$SYSROOT``.
> +Otherwise, cross-compile glibc and install it to ``$SYSROOT``.
> +
> +libffi
> +^^^^^^
> +
> +::
> +
> + $ cd "$WORK_DIR"
> + $ git clone https://gitlab.freedesktop.org/gstreamer/meson-ports/libffi.git
> + $ cd libffi
> + $ meson setup --cross-file ../cross_file.txt --prefix="$SYSROOT/usr" _build
> + $ ninja -C _build
> + $ ninja -C _build install
> +
> +*Building libffi seperately avoids a compilation error generated when
> +building it as a subproject of glib.*
> +
> +glib
> +^^^^
> +
> +::
> +
> + $ cd "$WORK_DIR"
> + $ git clone https://github.com/GNOME/glib.git
> + $ cd glib
> + $ meson setup --cross-file ../cross_file.txt --prefix="$SYSROOT/usr" _build
> + $ ninja -C _build
> + $ ninja -C _build install
> +
> +libslirp [optional]
> +^^^^^^^^^^^^^^^^^^^
> +
> +::
> +
> + $ cd "$WORK_DIR"
> + $ git clone https://gitlab.com/qemu-project/libslirp.git
> + $ cd libslirp
> + $ meson setup --cross-file ../cross_file.txt --prefix="$SYSROOT/usr" _build
> + $ ninja -C _build
> + $ ninja -C _build install
> +
> +pixman
> +^^^^^^
> +
> +First ensure the 'libtool' package is installed, e.g.
> +``sudo dnf install libtool`` or ``sudo apt install libtool``
> +
> +::
> +
> + $ cd "$WORK_DIR"
> + $ git clone https://gitlab.freedesktop.org/pixman/pixman
> + $ cd pixman
> + $ ./autogen.sh
> + $ ./configure --prefix="$SYSROOT/usr" --host=riscv64-unknown-linux-gnu
> + $ make -j$(nproc)
> + $ make install
> +
> +Cross-compile QEMU
> +------------------
> +
> +::
> +
> + $ cd "$WORK_DIR"
> + $ git clone https://gitlab.com/qemu-project/qemu.git
> + $ cd qemu
> + $ mkdir -p build/install_dir
> + $ cd build
> + $ ../configure --target-list=riscv64-softmmu --cross-prefix=$CROSS_COMPILE --prefix="$PWD/install_dir"
> + $ make -j$(nproc)
> + $ make install
> +
> +*Cross-compiling QEMU with different configurations may require more
> +dependencies to be built and installed in the sysroot.*
> +
> +Running QEMU
> +------------
> +
> +``build/install_dir`` may now be copied to the target and its bin
> +directory may be added to the target user's PATH. Prior to running
> +QEMU, ensure all the libraries it depends on are present, ::
> +
> + $ ldd /path/to/bin/qemu-system-riscv64
> +
> +For example, it may necessary to install zlib libraries, e.g.
> +``sudo dnf install zlib-devel`` or ``sudo apt install zlib1g-dev``
> +
> +Subsequent QEMU Cross-compiling
> +-------------------------------
> +
> +Unless it's necessary to update and recompile the toolchain or
> +dependencies, then most steps do not need to be repeated for subsequent
> +compiles. Simply ensure the toolchain is in ``$PATH``, ``$SYSROOT`` points
> +at the sysroot, and then follow the QEMU cross-compile steps in
> +"Cross-compile QEMU". For example, ::
> +
> + $ export PATH="$HOME/opt/riscv/bin:$PATH"
> + $ export SYSROOT="$HOME/opt/riscv/sysroot"
> + $ cd /path/to/qemu
> + $ mkdir -p build/install_dir
> + $ cd build
> + $ ../configure --target-list=riscv64-softmmu --cross-prefix=riscv64-unknown-linux-gnu- --prefix="$PWD/install_dir"
> + $ make -j
> + $ make install
> +
> +References
> +----------
> +
> +.. [riscv-toolchain] https://github.com/riscv/riscv-gnu-toolchain
> --
> 2.41.0
>
>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] docs/devel: Add cross-compiling doc
2023-09-07 3:13 ` Alistair Francis
@ 2023-09-07 8:48 ` Andrew Jones
0 siblings, 0 replies; 7+ messages in thread
From: Andrew Jones @ 2023-09-07 8:48 UTC (permalink / raw)
To: Alistair Francis
Cc: qemu-devel, qemu-riscv, alistair.francis, palmer, bin.meng,
peter.maydell, Daniel Henrique Barboza
On Thu, Sep 07, 2023 at 01:13:33PM +1000, Alistair Francis wrote:
> On Wed, Jul 26, 2023 at 10:08 PM Andrew Jones <ajones@ventanamicro.com> wrote:
> >
> > Add instructions for how to cross-compile QEMU for RISC-V. The
> > file is named generically because there's no reason not to collect
> > other architectures steps into the same file, especially because
> > several subsections like those for cross-compiling QEMU dependencies
> > using meson and a cross-file could be shared. Additionally, other
> > approaches to creating sysroots, such as with debootstrap, may be
> > documented in this file in the future.
> >
> > Signed-off-by: Andrew Jones <ajones@ventanamicro.com>
>
> I get a warning when building this:
>
> qemu/docs/devel/cross-compiling.rst: WARNING: document isn't included
> in any toctree
>
> Do you mind adding a toc reference to it and sending a v2?
Ah, I forgot to try an --enable-docs build. Sorry about that. I've just
sent v2.
Thanks,
drew
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] docs/devel: Add cross-compiling doc
2023-07-26 12:07 [PATCH] docs/devel: Add cross-compiling doc Andrew Jones
` (3 preceding siblings ...)
2023-09-07 3:13 ` Alistair Francis
@ 2023-09-07 9:16 ` Alex Bennée
4 siblings, 0 replies; 7+ messages in thread
From: Alex Bennée @ 2023-09-07 9:16 UTC (permalink / raw)
To: Andrew Jones
Cc: qemu-riscv, alistair.francis, palmer, bin.meng, peter.maydell,
Daniel Henrique Barboza, qemu-devel
Andrew Jones <ajones@ventanamicro.com> writes:
> Add instructions for how to cross-compile QEMU for RISC-V. The
> file is named generically because there's no reason not to collect
> other architectures steps into the same file, especially because
> several subsections like those for cross-compiling QEMU dependencies
> using meson and a cross-file could be shared. Additionally, other
> approaches to creating sysroots, such as with debootstrap, may be
> documented in this file in the future.
Generally QEMU can be cross compiled with one of our suite of
cross-compile docker images, e.g.:
make docker-test-build@debian-riscv64-cross J=9 V=1
see:
make docker-help
for the details. The only thing that makes riscv64 a little tricky is we
currently rely on sid+ports for the toolchain and deps. Now riscv64 is a
target architecture for trixy we should soon be able to move to a better image
with all the binary dependencies.
>
> Signed-off-by: Andrew Jones <ajones@ventanamicro.com>
> ---
> docs/devel/cross-compiling.rst | 221 +++++++++++++++++++++++++++++++++
> 1 file changed, 221 insertions(+)
> create mode 100644 docs/devel/cross-compiling.rst
>
> diff --git a/docs/devel/cross-compiling.rst b/docs/devel/cross-compiling.rst
> new file mode 100644
> index 000000000000..1b988ba54e4c
> --- /dev/null
> +++ b/docs/devel/cross-compiling.rst
> @@ -0,0 +1,221 @@
> +.. SPDX-License-Identifier: GPL-2.0-or-later
> +
> +====================
> +Cross-compiling QEMU
> +====================
> +
> +Cross-compiling QEMU first requires the preparation of a cross-toolchain
> +and the cross-compiling of QEMU's dependencies. While the steps will be
> +similar across architectures, each architecture will have its own specific
> +recommendations. This document collects architecture-specific procedures
> +and hints that may be used to cross-compile QEMU, where typically the host
> +environment is x86.
> +
> +RISC-V
> +======
> +
> +Toolchain
> +---------
> +
> +Select a root directory for the cross environment
> +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> +
> +Export an environment variable pointing to a root directory
> +for the cross environment. For example, ::
> +
> + $ export PREFIX="$HOME/opt/riscv"
> +
> +Create a work directory
> +^^^^^^^^^^^^^^^^^^^^^^^
> +
> +Tools and several components will need to be downloaded and built. Create
> +a directory for all the work, ::
> +
> + $ export WORK_DIR="$HOME/work/xqemu"
> + $ mkdir -p "$WORK_DIR"
> +
> +Select and prepare the toolchain
> +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> +
> +Select a toolchain such as [riscv-toolchain]_ and follow its instructions
> +for building and installing it to ``$PREFIX``, e.g. ::
> +
> + $ cd "$WORK_DIR"
> + $ git clone https://github.com/riscv/riscv-gnu-toolchain
> + $ cd riscv-gnu-toolchain
> + $ ./configure --prefix="$PREFIX"
> + $ make -j$(nproc) linux
> +
> +Set the ``$CROSS_COMPILE`` environment variable to the prefix of the cross
> +tools and add the tools to ``$PATH``, ::
> +
> +$ export CROSS_COMPILE=riscv64-unknown-linux-gnu-
> +$ export PATH="$PREFIX/bin:$PATH"
> +
> +Also set ``$SYSROOT``, where all QEMU cross-compiled dependencies will be
> +installed. The toolchain installation likely created a 'sysroot' directory
> +at ``$PREFIX/sysroot``, which is the default location for most cross
> +tools, making it a good location, ::
> +
> + $ mkdir -p "$PREFIX/sysroot"
> + $ export SYSROOT="$PREFIX/sysroot"
> +
> +Create a pkg-config wrapper
> +^^^^^^^^^^^^^^^^^^^^^^^^^^^
> +
> +The build processes of QEMU and some of its dependencies depend on
> +pkg-config. Create a wrapper script for it which works for the cross
> +environment: ::
> +
> + $ cat <<EOF >"$PREFIX/bin/${CROSS_COMPILE}pkg-config"
> + #!/bin/sh
> +
> + [ "\$SYSROOT" ] || exit 1
> +
> + export PKG_CONFIG_PATH=
> + export
> PKG_CONFIG_LIBDIR="\${SYSROOT}/usr/lib/pkgconfig:\${SYSROOT}/usr/lib64/pkgconfig:\${SYSROOT}/usr/share/pkgconfig"
> +
> + exec pkg-config "\$@"
> + EOF
> + $ chmod +x "$PREFIX/bin/${CROSS_COMPILE}pkg-config"
> +
> +Create a cross-file for meson builds
> +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> +
> +meson setup, used by some of QEMU's dependencies, needs a "cross-file" to
> +configure the cross environment. Create one, ::
> +
> + $ cd "$WORK_DIR"
> + $ cat <<EOF >cross_file.txt
> + [host_machine]
> + system = 'linux'
> + cpu_family = 'riscv64'
> + cpu = 'riscv64'
> + endian = 'little'
> +
> + [binaries]
> + c = '${CROSS_COMPILE}gcc'
> + cpp = '${CROSS_COMPILE}g++'
> + ar = '${CROSS_COMPILE}ar'
> + ld = '${CROSS_COMPILE}ld'
> + objcopy = '${CROSS_COMPILE}objcopy'
> + strip = '${CROSS_COMPILE}strip'
> + pkgconfig = '${CROSS_COMPILE}pkg-config'
> + EOF
> +
> +Cross-compile dependencies
> +--------------------------
> +
> +glibc
> +^^^^^
> +
> +If [riscv-toolchain]_ was selected for the toolchain then this step is
> +already complete and glibc has already been installed into ``$SYSROOT``.
> +Otherwise, cross-compile glibc and install it to ``$SYSROOT``.
> +
> +libffi
> +^^^^^^
> +
> +::
> +
> + $ cd "$WORK_DIR"
> + $ git clone https://gitlab.freedesktop.org/gstreamer/meson-ports/libffi.git
> + $ cd libffi
> + $ meson setup --cross-file ../cross_file.txt --prefix="$SYSROOT/usr" _build
> + $ ninja -C _build
> + $ ninja -C _build install
> +
> +*Building libffi seperately avoids a compilation error generated when
> +building it as a subproject of glib.*
> +
> +glib
> +^^^^
> +
> +::
> +
> + $ cd "$WORK_DIR"
> + $ git clone https://github.com/GNOME/glib.git
> + $ cd glib
> + $ meson setup --cross-file ../cross_file.txt --prefix="$SYSROOT/usr" _build
> + $ ninja -C _build
> + $ ninja -C _build install
> +
> +libslirp [optional]
> +^^^^^^^^^^^^^^^^^^^
> +
> +::
> +
> + $ cd "$WORK_DIR"
> + $ git clone https://gitlab.com/qemu-project/libslirp.git
> + $ cd libslirp
> + $ meson setup --cross-file ../cross_file.txt --prefix="$SYSROOT/usr" _build
> + $ ninja -C _build
> + $ ninja -C _build install
> +
> +pixman
> +^^^^^^
> +
> +First ensure the 'libtool' package is installed, e.g.
> +``sudo dnf install libtool`` or ``sudo apt install libtool``
> +
> +::
> +
> + $ cd "$WORK_DIR"
> + $ git clone https://gitlab.freedesktop.org/pixman/pixman
> + $ cd pixman
> + $ ./autogen.sh
> + $ ./configure --prefix="$SYSROOT/usr" --host=riscv64-unknown-linux-gnu
> + $ make -j$(nproc)
> + $ make install
> +
> +Cross-compile QEMU
> +------------------
> +
> +::
> +
> + $ cd "$WORK_DIR"
> + $ git clone https://gitlab.com/qemu-project/qemu.git
> + $ cd qemu
> + $ mkdir -p build/install_dir
> + $ cd build
> + $ ../configure --target-list=riscv64-softmmu --cross-prefix=$CROSS_COMPILE --prefix="$PWD/install_dir"
> + $ make -j$(nproc)
> + $ make install
> +
> +*Cross-compiling QEMU with different configurations may require more
> +dependencies to be built and installed in the sysroot.*
> +
> +Running QEMU
> +------------
> +
> +``build/install_dir`` may now be copied to the target and its bin
> +directory may be added to the target user's PATH. Prior to running
> +QEMU, ensure all the libraries it depends on are present, ::
> +
> + $ ldd /path/to/bin/qemu-system-riscv64
> +
> +For example, it may necessary to install zlib libraries, e.g.
> +``sudo dnf install zlib-devel`` or ``sudo apt install zlib1g-dev``
> +
> +Subsequent QEMU Cross-compiling
> +-------------------------------
> +
> +Unless it's necessary to update and recompile the toolchain or
> +dependencies, then most steps do not need to be repeated for subsequent
> +compiles. Simply ensure the toolchain is in ``$PATH``, ``$SYSROOT`` points
> +at the sysroot, and then follow the QEMU cross-compile steps in
> +"Cross-compile QEMU". For example, ::
> +
> + $ export PATH="$HOME/opt/riscv/bin:$PATH"
> + $ export SYSROOT="$HOME/opt/riscv/sysroot"
> + $ cd /path/to/qemu
> + $ mkdir -p build/install_dir
> + $ cd build
> + $ ../configure --target-list=riscv64-softmmu
> --cross-prefix=riscv64-unknown-linux-gnu- --prefix="$PWD/install_dir"
> + $ make -j
> + $ make install
> +
> +References
> +----------
> +
> +.. [riscv-toolchain] https://github.com/riscv/riscv-gnu-toolchain
--
Alex Bennée
Virtualisation Tech Lead @ Linaro
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2023-09-07 9:21 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-07-26 12:07 [PATCH] docs/devel: Add cross-compiling doc Andrew Jones
2023-07-26 12:22 ` Daniel Henrique Barboza
2023-09-07 2:25 ` Alistair Francis
2023-09-07 2:29 ` Alistair Francis
2023-09-07 3:13 ` Alistair Francis
2023-09-07 8:48 ` Andrew Jones
2023-09-07 9:16 ` Alex Bennée
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).