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 <jianyong.wu@arm.com>
This commit is contained in:
Jianyong Wu 2023-04-02 09:25:22 +00:00 committed by Fabiano Fidêncio
parent 35d6d86ab5
commit 7ffc0c1225
3 changed files with 62 additions and 25 deletions

View File

@ -8,8 +8,23 @@ from ubuntu:20.04
# This is required to keep build dependencies with security fixes. # This is required to keep build dependencies with security fixes.
ARG CACHE_TIMEOUT ARG CACHE_TIMEOUT
ARG DEBIAN_FRONTEND=noninteractive ARG DEBIAN_FRONTEND=noninteractive
ARG DPKG_ARCH
ARG ARCH
ARG GCC_ARCH
ARG PREFIX
SHELL ["/bin/bash", "-o", "pipefail", "-c"] 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 && \ RUN apt-get update && apt-get upgrade -y && \
apt-get --no-install-recommends install -y \ apt-get --no-install-recommends install -y \
apt-utils \ apt-utils \
@ -19,37 +34,43 @@ RUN apt-get update && apt-get upgrade -y && \
bison \ bison \
ca-certificates \ ca-certificates \
cpio \ cpio \
dpkg-dev \
flex \ flex \
gawk \ gawk \
libaudit-dev \ libaudit-dev${DPKG_ARCH} \
libblkid-dev \ libblkid-dev${DPKG_ARCH} \
libcap-dev \ libcap-dev${DPKG_ARCH} \
libcap-ng-dev \ libcap-ng-dev${DPKG_ARCH} \
libdw-dev \ libdw-dev${DPKG_ARCH} \
libelf-dev \ libelf-dev${DPKG_ARCH} \
libffi-dev \ libffi-dev${DPKG_ARCH} \
libglib2.0-0 \ libglib2.0-0${DPKG_ARCH} \
libglib2.0-dev \ libglib2.0-dev${DPKG_ARCH} \
libglib2.0-dev git \ libglib2.0-dev${DPKG_ARCH} git \
libltdl-dev \ libltdl-dev${DPKG_ARCH} \
libmount-dev \ libmount-dev${DPKG_ARCH} \
libpixman-1-dev \ libpixman-1-dev${DPKG_ARCH} \
libselinux1-dev \ libselinux1-dev${DPKG_ARCH} \
libtool \ libtool${DPKG_ARCH} \
make \ make \
ninja-build \ ninja-build \
pkg-config \ pkg-config${DPKG_ARCH} \
libseccomp-dev \ libseccomp-dev${DPKG_ARCH} \
libseccomp2 \ libseccomp2${DPKG_ARCH} \
patch \ patch \
python \ python \
python-dev \ python-dev \
rsync \ rsync \
zlib1g-dev && \ zlib1g-dev${DPKG_ARCH} && \
if [ "$(uname -m)" != "s390x" ]; then apt-get install -y --no-install-recommends libpmem-dev; fi && \ 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/ apt-get clean && rm -rf /var/lib/apt/lists/
RUN git clone https://github.com/axboe/liburing/ ~/liburing && \ RUN git clone https://github.com/axboe/liburing/ ~/liburing && \
cd ~/liburing && \ cd ~/liburing && \
git checkout tags/liburing-2.1 && \ 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 make && make install && ldconfig

View File

@ -14,6 +14,12 @@ readonly qemu_builder="${script_dir}/build-qemu.sh"
source "${script_dir}/../../scripts/lib.sh" source "${script_dir}/../../scripts/lib.sh"
source "${script_dir}/../qemu.blacklist" 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}/../.." packaging_dir="${script_dir}/../.."
qemu_destdir="/tmp/qemu-static/" qemu_destdir="/tmp/qemu-static/"
container_engine="${USE_PODMAN:+podman}" 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" [ -n "${build_suffix}" ] && PKGVERSION="kata-static-${build_suffix}" || PKGVERSION="kata-static"
container_image="${QEMU_CONTAINER_BUILDER:-$(get_qemu_image_name)}" 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 \ sudo docker pull ${container_image} || (sudo "${container_engine}" build \
--build-arg CACHE_TIMEOUT="${CACHE_TIMEOUT}" \ --build-arg CACHE_TIMEOUT="${CACHE_TIMEOUT}" \
--build-arg http_proxy="${http_proxy}" \ --build-arg http_proxy="${http_proxy}" \
--build-arg https_proxy="${https_proxy}" \ --build-arg https_proxy="${https_proxy}" \
--build-arg DPKG_ARCH="${dpkg_arch}" \
--build-arg ARCH="${ARCH}" \
"${packaging_dir}" \ "${packaging_dir}" \
-f "${script_dir}/Dockerfile" \ -f "${script_dir}/Dockerfile" \
-t "${container_image}" && \ -t "${container_image}" && \
@ -54,13 +63,14 @@ sudo "${container_engine}" run \
--rm \ --rm \
-i \ -i \
--env BUILD_SUFFIX="${build_suffix}" \ --env BUILD_SUFFIX="${build_suffix}" \
--env HYPERVISOR_NAME="${HYPERVISOR_NAME}" \
--env PKGVERSION="${PKGVERSION}" \ --env PKGVERSION="${PKGVERSION}" \
--env QEMU_DESTDIR="${qemu_destdir}" \ --env QEMU_DESTDIR="${qemu_destdir}" \
--env QEMU_REPO="${qemu_repo}" \ --env QEMU_REPO="${qemu_repo}" \
--env QEMU_VERSION="${qemu_version}" \
--env QEMU_TARBALL="${qemu_tar}" \ --env QEMU_TARBALL="${qemu_tar}" \
--env PREFIX="${prefix}" \ --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 "${repo_root_dir}:/root/kata-containers" \
-v "${PWD}":/share "${container_image}" \ -v "${PWD}":/share "${container_image}" \
bash -c "/root/kata-containers/tools/packaging/static-build/qemu/build-qemu.sh" bash -c "/root/kata-containers/tools/packaging/static-build/qemu/build-qemu.sh"

View File

@ -14,13 +14,19 @@ kata_packaging_scripts="${kata_packaging_dir}/scripts"
kata_static_build_dir="${kata_packaging_dir}/static-build" kata_static_build_dir="${kata_packaging_dir}/static-build"
kata_static_build_scripts="${kata_static_build_dir}/scripts" kata_static_build_scripts="${kata_static_build_dir}/scripts"
ARCH=${ARCH:-$(uname -m)}
git clone --depth=1 "${QEMU_REPO}" qemu git clone --depth=1 "${QEMU_REPO}" qemu
pushd qemu pushd qemu
git fetch --depth=1 origin "${QEMU_VERSION}" git fetch --depth=1 origin "${QEMU_VERSION_NUM}"
git checkout FETCH_HEAD git checkout FETCH_HEAD
scripts/git-submodule.sh update meson capstone scripts/git-submodule.sh update meson capstone
${kata_packaging_scripts}/patch_qemu.sh "${QEMU_VERSION}" "${kata_packaging_dir}/qemu/patches" ${kata_packaging_scripts}/patch_qemu.sh "${QEMU_VERSION_NUM}" "${kata_packaging_dir}/qemu/patches"
PREFIX="${PREFIX}" ${kata_packaging_scripts}/configure-hypervisor.sh -s "${HYPERVISOR_NAME}" | xargs ./configure --with-pkgversion="${PKGVERSION}" 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 -j"$(nproc +--ignore 1)"
make install DESTDIR="${QEMU_DESTDIR}" make install DESTDIR="${QEMU_DESTDIR}"
popd popd