From 7923de8999de055c7f55c568d3354d4c36f830e5 Mon Sep 17 00:00:00 2001 From: Jianyong Wu Date: Wed, 19 Jul 2023 17:31:58 +0800 Subject: [PATCH] static-build: cross build kernel Prepare cross build environment based on current Dockerfile. Fixes: #6557 Signed-off-by: Jianyong Wu --- tools/packaging/kernel/build-kernel.sh | 8 +++++-- tools/packaging/kernel/kata_config_version | 2 +- .../packaging/static-build/kernel/Dockerfile | 5 +++- tools/packaging/static-build/kernel/build.sh | 24 +++++++++++++++---- 4 files changed, 30 insertions(+), 9 deletions(-) diff --git a/tools/packaging/kernel/build-kernel.sh b/tools/packaging/kernel/build-kernel.sh index 18725c1b8..8119be704 100755 --- a/tools/packaging/kernel/build-kernel.sh +++ b/tools/packaging/kernel/build-kernel.sh @@ -65,6 +65,8 @@ kernel_url="" #Linux headers for GPU guest fs module building linux_headers="" +CROSS_BUILD_ARG="" + MEASURED_ROOTFS=${MEASURED_ROOTFS:-no} packaging_scripts_dir="${script_dir}/../scripts" @@ -436,7 +438,7 @@ setup_kernel() { info "Copying config file from: ${kernel_config_path}" cp "${kernel_config_path}" ./.config - make oldconfig + ARCH=${arch_target} make oldconfig ${CROSS_BUILD_ARG} ) } @@ -447,7 +449,7 @@ build_kernel() { [ -n "${arch_target}" ] || arch_target="$(uname -m)" arch_target=$(arch_to_kernel "${arch_target}") pushd "${kernel_path}" >>/dev/null - make -j $(nproc ${CI:+--ignore 1}) ARCH="${arch_target}" + make -j $(nproc ${CI:+--ignore 1}) ARCH="${arch_target}" ${CROSS_BUILD_ARG} if [ "${conf_guest}" == "sev" ]; then make -j $(nproc ${CI:+--ignore 1}) INSTALL_MOD_STRIP=1 INSTALL_MOD_PATH=${kernel_path} modules_install fi @@ -658,6 +660,8 @@ main() { info "Kernel version: ${kernel_version}" + [ "${arch_target}" != "" -a "${arch_target}" != $(uname -m) ] && CROSS_BUILD_ARG="CROSS_COMPILE=${arch_target}-linux-gnu-" + case "${subcmd}" in build) build_kernel "${kernel_path}" diff --git a/tools/packaging/kernel/kata_config_version b/tools/packaging/kernel/kata_config_version index 58c9bdf9d..194b81caa 100644 --- a/tools/packaging/kernel/kata_config_version +++ b/tools/packaging/kernel/kata_config_version @@ -1 +1 @@ -111 +112 diff --git a/tools/packaging/static-build/kernel/Dockerfile b/tools/packaging/static-build/kernel/Dockerfile index 183f8a47e..c806e3574 100644 --- a/tools/packaging/static-build/kernel/Dockerfile +++ b/tools/packaging/static-build/kernel/Dockerfile @@ -5,6 +5,8 @@ FROM ubuntu:22.04 ENV DEBIAN_FRONTEND=noninteractive +ARG ARCH + # kernel deps RUN apt-get update && \ apt-get install -y --no-install-recommends \ @@ -23,4 +25,5 @@ RUN apt-get update && \ rsync \ cpio \ patch && \ - apt-get clean && apt-get autoclean + if [ "${ARCH}" != "$(uname -m)" ]; then apt-get install --no-install-recommends -y gcc-"${ARCH}"-linux-gnu binutils-"${ARCH}"-linux-gnu; fi && \ + apt-get clean && apt-get autoclean && rm -rf /var/lib/apt/lists/* diff --git a/tools/packaging/static-build/kernel/build.sh b/tools/packaging/static-build/kernel/build.sh index b36f06cff..b8deea4f0 100755 --- a/tools/packaging/static-build/kernel/build.sh +++ b/tools/packaging/static-build/kernel/build.sh @@ -14,12 +14,26 @@ source "${script_dir}/../../scripts/lib.sh" readonly kernel_builder="${repo_root_dir}/tools/packaging/kernel/build-kernel.sh" +BUILDX= +PLATFORM= + DESTDIR=${DESTDIR:-${PWD}} PREFIX=${PREFIX:-/opt/kata} container_image="${KERNEL_CONTAINER_BUILDER:-$(get_kernel_image_name)}" +if [ "${CROSS_BUILD}" == "true" ]; then + container_image="${container_image}-${ARCH}-cross-build" + # Need to build a s390x image due to an issue at + # https://github.com/kata-containers/kata-containers/pull/6586#issuecomment-1603189242 + if [ ${ARCH} == "s390x" ]; then + BUILDX="buildx" + PLATFORM="--platform=linux/s390x" + fi +fi + sudo docker pull ${container_image} || \ - (sudo docker build -t "${container_image}" "${script_dir}" && \ + (sudo docker ${BUILDX} build ${PLATFORM} \ + --build-arg ARCH=${ARCH} -t "${container_image}" "${script_dir}" && \ # No-op unless PUSH_TO_REGISTRY is exported as "yes" push_to_registry "${container_image}") @@ -27,21 +41,21 @@ sudo docker run --rm -i -v "${repo_root_dir}:${repo_root_dir}" \ -w "${PWD}" \ --env MEASURED_ROOTFS="${MEASURED_ROOTFS:-}" \ "${container_image}" \ - bash -c "${kernel_builder} $* setup" + bash -c "${kernel_builder} -a ${ARCH} $* setup" sudo docker run --rm -i -v "${repo_root_dir}:${repo_root_dir}" \ -w "${PWD}" \ "${container_image}" \ - bash -c "${kernel_builder} $* build" + bash -c "${kernel_builder} -a ${ARCH} $* build" sudo docker run --rm -i -v "${repo_root_dir}:${repo_root_dir}" \ -w "${PWD}" \ --env DESTDIR="${DESTDIR}" --env PREFIX="${PREFIX}" \ "${container_image}" \ - bash -c "${kernel_builder} $* install" + bash -c "${kernel_builder} -a ${ARCH} $* install" sudo docker run --rm -i -v "${repo_root_dir}:${repo_root_dir}" \ -w "${PWD}" \ --env DESTDIR="${DESTDIR}" --env PREFIX="${PREFIX}" \ "${container_image}" \ - bash -c "${kernel_builder} $* build-headers" + bash -c "${kernel_builder} -a ${ARCH} $* build-headers"