From 7ffc0c1225c3972efd2c227504e5194f7866ddf6 Mon Sep 17 00:00:00 2001 From: Jianyong Wu Date: Sun, 2 Apr 2023 09:25:22 +0000 Subject: [PATCH] static-build: enable cross build for qemu Depends on mutiarch feature of ubuntu, we can set up cross build environment easily and achive as good build performance as native build. Fixes: #6557 Signed-off-by: Jianyong Wu --- tools/packaging/static-build/qemu/Dockerfile | 61 +++++++++++++------ .../static-build/qemu/build-base-qemu.sh | 14 ++++- .../packaging/static-build/qemu/build-qemu.sh | 12 +++- 3 files changed, 62 insertions(+), 25 deletions(-) diff --git a/tools/packaging/static-build/qemu/Dockerfile b/tools/packaging/static-build/qemu/Dockerfile index 930a907817..f5e812c915 100644 --- a/tools/packaging/static-build/qemu/Dockerfile +++ b/tools/packaging/static-build/qemu/Dockerfile @@ -8,8 +8,23 @@ from ubuntu:20.04 # This is required to keep build dependencies with security fixes. ARG CACHE_TIMEOUT ARG DEBIAN_FRONTEND=noninteractive +ARG DPKG_ARCH +ARG ARCH +ARG GCC_ARCH +ARG PREFIX SHELL ["/bin/bash", "-o", "pipefail", "-c"] + +RUN if [ "${ARCH}" != "$(uname -m)" ]; then sed -i 's/^deb/deb [arch=amd64]/g' /etc/apt/sources.list && \ + dpkg --add-architecture "${DPKG_ARCH#:}" && \ + echo "deb [arch=${DPKG_ARCH#:}] http://ports.ubuntu.com/ focal main restricted" >> /etc/apt/sources.list && \ + echo "deb [arch=${DPKG_ARCH#:}] http://ports.ubuntu.com/ focal-updates main restricted" >> /etc/apt/sources.list && \ + echo "deb [arch=${DPKG_ARCH#:}] http://ports.ubuntu.com/ focal universe" >> /etc/apt/sources.list && \ + echo "deb [arch=${DPKG_ARCH#:}] http://ports.ubuntu.com/ focal-updates universe" >> /etc/apt/sources.list && \ + echo "deb [arch=${DPKG_ARCH#:}] http://ports.ubuntu.com/ focal multiverse" >> /etc/apt/sources.list && \ + echo "deb [arch=${DPKG_ARCH#:}] http://ports.ubuntu.com/ focal-updates multiverse" >> /etc/apt/sources.list && \ + echo "deb [arch=${DPKG_ARCH#:}] http://ports.ubuntu.com/ focal-backports main restricted universe multiverse" >> /etc/apt/sources.list; fi + RUN apt-get update && apt-get upgrade -y && \ apt-get --no-install-recommends install -y \ apt-utils \ @@ -19,37 +34,43 @@ RUN apt-get update && apt-get upgrade -y && \ bison \ ca-certificates \ cpio \ + dpkg-dev \ flex \ gawk \ - libaudit-dev \ - libblkid-dev \ - libcap-dev \ - libcap-ng-dev \ - libdw-dev \ - libelf-dev \ - libffi-dev \ - libglib2.0-0 \ - libglib2.0-dev \ - libglib2.0-dev git \ - libltdl-dev \ - libmount-dev \ - libpixman-1-dev \ - libselinux1-dev \ - libtool \ + libaudit-dev${DPKG_ARCH} \ + libblkid-dev${DPKG_ARCH} \ + libcap-dev${DPKG_ARCH} \ + libcap-ng-dev${DPKG_ARCH} \ + libdw-dev${DPKG_ARCH} \ + libelf-dev${DPKG_ARCH} \ + libffi-dev${DPKG_ARCH} \ + libglib2.0-0${DPKG_ARCH} \ + libglib2.0-dev${DPKG_ARCH} \ + libglib2.0-dev${DPKG_ARCH} git \ + libltdl-dev${DPKG_ARCH} \ + libmount-dev${DPKG_ARCH} \ + libpixman-1-dev${DPKG_ARCH} \ + libselinux1-dev${DPKG_ARCH} \ + libtool${DPKG_ARCH} \ make \ ninja-build \ - pkg-config \ - libseccomp-dev \ - libseccomp2 \ + pkg-config${DPKG_ARCH} \ + libseccomp-dev${DPKG_ARCH} \ + libseccomp2${DPKG_ARCH} \ patch \ python \ python-dev \ rsync \ - zlib1g-dev && \ - if [ "$(uname -m)" != "s390x" ]; then apt-get install -y --no-install-recommends libpmem-dev; fi && \ + zlib1g-dev${DPKG_ARCH} && \ + if [ "${ARCH}" != s390x ]; then apt-get install -y --no-install-recommends libpmem-dev${DPKG_ARCH}; fi && \ + GCC_ARCH="${ARCH}" && if [ "${ARCH}" = "ppc64le" ]; then GCC_ARCH="powerpc64le"; fi && \ + if [ "${ARCH}" != "$(uname -m)" ]; then apt-get install --no-install-recommends -y gcc-"${GCC_ARCH}"-linux-gnu; fi && \ apt-get clean && rm -rf /var/lib/apt/lists/ RUN git clone https://github.com/axboe/liburing/ ~/liburing && \ cd ~/liburing && \ git checkout tags/liburing-2.1 && \ + GCC_ARCH="${ARCH}" && if [ "${ARCH}" = "ppc64le" ]; then GCC_ARCH="powerpc64le"; fi && \ + if [ "${ARCH}" != "$(uname -m)" ]; then PREFIX="${GCC_ARCH}-linux-gnu"; fi && \ + ./configure --cc=${GCC_ARCH}-linux-gnu-gcc --cxx=${GCC_ARCH}-linux-gnu-cpp --prefix=/usr/${PREFIX}/ && \ make && make install && ldconfig diff --git a/tools/packaging/static-build/qemu/build-base-qemu.sh b/tools/packaging/static-build/qemu/build-base-qemu.sh index 9767e5d548..1514419d78 100755 --- a/tools/packaging/static-build/qemu/build-base-qemu.sh +++ b/tools/packaging/static-build/qemu/build-base-qemu.sh @@ -14,6 +14,12 @@ readonly qemu_builder="${script_dir}/build-qemu.sh" source "${script_dir}/../../scripts/lib.sh" source "${script_dir}/../qemu.blacklist" +ARCH=${ARCH:-$(uname -m)} +dpkg_arch=":${ARCH}" +[ ${dpkg_arch} == ":aarch64" ] && dpkg_arch=":arm64" +[ ${dpkg_arch} == ":x86_64" ] && dpkg_arch="" +[ "${dpkg_arch}" == ":ppc64le" ] && dpkg_arch=":ppc64el" + packaging_dir="${script_dir}/../.." qemu_destdir="/tmp/qemu-static/" container_engine="${USE_PODMAN:+podman}" @@ -39,11 +45,14 @@ CACHE_TIMEOUT=$(date +"%Y-%m-%d") [ -n "${build_suffix}" ] && PKGVERSION="kata-static-${build_suffix}" || PKGVERSION="kata-static" container_image="${QEMU_CONTAINER_BUILDER:-$(get_qemu_image_name)}" +[ "${CROSS_BUILD}" == "true" ] && container_image="${container_image}-cross-build" sudo docker pull ${container_image} || (sudo "${container_engine}" build \ --build-arg CACHE_TIMEOUT="${CACHE_TIMEOUT}" \ --build-arg http_proxy="${http_proxy}" \ --build-arg https_proxy="${https_proxy}" \ + --build-arg DPKG_ARCH="${dpkg_arch}" \ + --build-arg ARCH="${ARCH}" \ "${packaging_dir}" \ -f "${script_dir}/Dockerfile" \ -t "${container_image}" && \ @@ -54,13 +63,14 @@ sudo "${container_engine}" run \ --rm \ -i \ --env BUILD_SUFFIX="${build_suffix}" \ - --env HYPERVISOR_NAME="${HYPERVISOR_NAME}" \ --env PKGVERSION="${PKGVERSION}" \ --env QEMU_DESTDIR="${qemu_destdir}" \ --env QEMU_REPO="${qemu_repo}" \ - --env QEMU_VERSION="${qemu_version}" \ --env QEMU_TARBALL="${qemu_tar}" \ --env PREFIX="${prefix}" \ + --env HYPERVISOR_NAME="${HYPERVISOR_NAME}" \ + --env QEMU_VERSION_NUM="${qemu_version}" \ + --env ARCH="${ARCH}" \ -v "${repo_root_dir}:/root/kata-containers" \ -v "${PWD}":/share "${container_image}" \ bash -c "/root/kata-containers/tools/packaging/static-build/qemu/build-qemu.sh" diff --git a/tools/packaging/static-build/qemu/build-qemu.sh b/tools/packaging/static-build/qemu/build-qemu.sh index edab348910..cab5f251b1 100755 --- a/tools/packaging/static-build/qemu/build-qemu.sh +++ b/tools/packaging/static-build/qemu/build-qemu.sh @@ -14,13 +14,19 @@ kata_packaging_scripts="${kata_packaging_dir}/scripts" kata_static_build_dir="${kata_packaging_dir}/static-build" kata_static_build_scripts="${kata_static_build_dir}/scripts" +ARCH=${ARCH:-$(uname -m)} + git clone --depth=1 "${QEMU_REPO}" qemu pushd qemu -git fetch --depth=1 origin "${QEMU_VERSION}" +git fetch --depth=1 origin "${QEMU_VERSION_NUM}" git checkout FETCH_HEAD scripts/git-submodule.sh update meson capstone -${kata_packaging_scripts}/patch_qemu.sh "${QEMU_VERSION}" "${kata_packaging_dir}/qemu/patches" -PREFIX="${PREFIX}" ${kata_packaging_scripts}/configure-hypervisor.sh -s "${HYPERVISOR_NAME}" | xargs ./configure --with-pkgversion="${PKGVERSION}" +${kata_packaging_scripts}/patch_qemu.sh "${QEMU_VERSION_NUM}" "${kata_packaging_dir}/qemu/patches" +if [ "$(uname -m)" != "${ARCH}" ] && [ "${ARCH}" == "s390x" ]; then + PREFIX="${PREFIX}" ${kata_packaging_scripts}/configure-hypervisor.sh -s "${HYPERVISOR_NAME}" "${ARCH}" | xargs ./configure --with-pkgversion="${PKGVERSION}" --cc=s390x-linux-gnu-gcc --cross-prefix=s390x-linux-gnu- --prefix="${PREFIX}" --target-list=s390x-softmmu +else + PREFIX="${PREFIX}" ${kata_packaging_scripts}/configure-hypervisor.sh -s "${HYPERVISOR_NAME}" "${ARCH}" | xargs ./configure --with-pkgversion="${PKGVERSION}" +fi make -j"$(nproc +--ignore 1)" make install DESTDIR="${QEMU_DESTDIR}" popd