From 35d6d86ab57664b805b8acb0aed5bab94e23055f Mon Sep 17 00:00:00 2001 From: Jianyong Wu Date: Wed, 19 Jul 2023 17:41:42 +0800 Subject: [PATCH] static-build: enable cross-build for image build It's too long a time to cross build agent based on docker buildx, thus we cross build rootfs based on a container with cross compile toolchain of gcc and rust with musl libc. Then we get fast build just like native build. rootfs initrd cross build is disabled as no cross compile tolchain for rust with musl lib if found for alpine and based on docker buildx takes too long a time. Fixes: #6557 Signed-off-by: Jianyong Wu --- ci/install_libseccomp.sh | 3 ++- tools/osbuilder/image-builder/image_builder.sh | 14 +++++++++++++- tools/osbuilder/rootfs-builder/rootfs.sh | 10 ++++++++++ .../osbuilder/rootfs-builder/ubuntu/Dockerfile.in | 2 ++ tools/packaging/guest-image/build_image.sh | 8 +++++++- .../local-build/kata-deploy-binaries.sh | 2 ++ utils.mk | 4 ---- 7 files changed, 36 insertions(+), 7 deletions(-) diff --git a/ci/install_libseccomp.sh b/ci/install_libseccomp.sh index 3b1f8aa86fd8..683d0f65b12e 100755 --- a/ci/install_libseccomp.sh +++ b/ci/install_libseccomp.sh @@ -87,7 +87,8 @@ build_and_install_libseccomp() { curl -sLO "${libseccomp_tarball_url}" tar -xf "${libseccomp_tarball}" pushd "libseccomp-${libseccomp_version}" - ./configure --prefix="${libseccomp_install_dir}" CFLAGS="${cflags}" --enable-static --host="${arch}" + [ "${arch}" == $(uname -m) ] && cc_name="" || cc_name="${arch}-linux-gnu-gcc" + CC=${cc_name} ./configure --prefix="${libseccomp_install_dir}" CFLAGS="${cflags}" --enable-static --host="${arch}" make make install popd diff --git a/tools/osbuilder/image-builder/image_builder.sh b/tools/osbuilder/image-builder/image_builder.sh index 3e7f0babc067..26f37d122ab2 100755 --- a/tools/osbuilder/image-builder/image_builder.sh +++ b/tools/osbuilder/image-builder/image_builder.sh @@ -13,6 +13,16 @@ set -o pipefail DOCKER_RUNTIME=${DOCKER_RUNTIME:-runc} MEASURED_ROOTFS=${MEASURED_ROOTFS:-no} +#For cross build +CROSS_BUILD=${CROSS_BUILD:-false} +BUILDX="" +PLATFORM="" +TARGET_ARCH=${TARGET_ARCH:-$(uname -m)} +ARCH=${ARCH:-$(uname -m)} +[ "${TARGET_ARCH}" == "aarch64" ] && TARGET_ARCH=arm64 +TARGET_OS=${TARGET_OS:-linux} +[ "${CROSS_BUILD}" == "true" ] && BUILDX=buildx && PLATFORM="--platform=${TARGET_OS}/${TARGET_ARCH}" + readonly script_name="${0##*/}" readonly script_dir=$(dirname "$(readlink -f "$0")") readonly lib_file="${script_dir}/../scripts/lib.sh" @@ -154,7 +164,7 @@ build_with_container() { engine_build_args+=" --runtime ${DOCKER_RUNTIME}" fi - "${container_engine}" build \ + "${container_engine}" ${BUILDX} build ${PLATFORM} \ ${engine_build_args} \ --build-arg http_proxy="${http_proxy}" \ --build-arg https_proxy="${https_proxy}" \ @@ -189,6 +199,8 @@ build_with_container() { --env MEASURED_ROOTFS="${MEASURED_ROOTFS}" \ --env SELINUX="${SELINUX}" \ --env DEBUG="${DEBUG}" \ + --env ARCH="${ARCH}" \ + --env TARGET_ARCH="${TARGET_ARCH}" \ -v /dev:/dev \ -v "${script_dir}":"/osbuilder" \ -v "${script_dir}/../scripts":"/scripts" \ diff --git a/tools/osbuilder/rootfs-builder/rootfs.sh b/tools/osbuilder/rootfs-builder/rootfs.sh index 22940ee9945c..89efd388b565 100755 --- a/tools/osbuilder/rootfs-builder/rootfs.sh +++ b/tools/osbuilder/rootfs-builder/rootfs.sh @@ -31,6 +31,16 @@ SELINUX=${SELINUX:-"no"} lib_file="${script_dir}/../scripts/lib.sh" source "$lib_file" +#For cross build +CROSS_BUILD=${CROSS_BUILD:-false} +BUILDX="" +PLATFORM="" +TARGET_ARCH=${TARGET_ARCH:-$(uname -m)} +ARCH=${ARCH:-$(uname -m)} +[ "${TARGET_ARCH}" == "aarch64" ] && TARGET_ARCH=arm64 +TARGET_OS=${TARGET_OS:-linux} +[ "${CROSS_BUILD}" == "true" ] && BUILDX=buildx && PLATFORM="--platform=${TARGET_OS}/${TARGET_ARCH}" + handle_error() { local exit_code="${?}" local line_number="${1:-}" diff --git a/tools/osbuilder/rootfs-builder/ubuntu/Dockerfile.in b/tools/osbuilder/rootfs-builder/ubuntu/Dockerfile.in index 937ea89f4349..61307e95601c 100644 --- a/tools/osbuilder/rootfs-builder/ubuntu/Dockerfile.in +++ b/tools/osbuilder/rootfs-builder/ubuntu/Dockerfile.in @@ -8,6 +8,7 @@ FROM ${IMAGE_REGISTRY}/ubuntu:@OS_VERSION@ # makedev tries to mknod from postinst RUN [ -x /usr/bin/systemd-detect-virt ] || ( echo "echo docker" >/usr/bin/systemd-detect-virt && chmod +x /usr/bin/systemd-detect-virt ) +# hadolint ignore=DL3009,SC2046 RUN apt-get update && \ DEBIAN_FRONTEND=noninteractive \ apt-get --no-install-recommends -y install \ @@ -18,6 +19,7 @@ RUN apt-get update && \ libc_arch="$gcc_arch" && \ [ "$gcc_arch" = aarch64 ] && libc_arch=arm64; \ [ "$gcc_arch" = ppc64le ] && gcc_arch=powerpc64le && libc_arch=ppc64el; \ + [ "$gcc_arch" = s390x ] && gcc_arch=s390x && libc_arch=s390x; \ [ "$gcc_arch" = x86_64 ] && gcc_arch=x86-64 && libc_arch=amd64; \ echo "gcc-$gcc_arch-linux-gnu libc6-dev-$libc_arch-cross")) \ git \ diff --git a/tools/packaging/guest-image/build_image.sh b/tools/packaging/guest-image/build_image.sh index fad6646517ff..372ddf3a463a 100755 --- a/tools/packaging/guest-image/build_image.sh +++ b/tools/packaging/guest-image/build_image.sh @@ -21,7 +21,13 @@ readonly osbuilder_dir="$(cd "${repo_root_dir}/tools/osbuilder" && pwd)" export GOPATH=${GOPATH:-${HOME}/go} -arch_target="$(uname -m)" +ARCH=${ARCH:-$(uname -m)} +if [ $(uname -m) == "${ARCH}" ]; then + arch_target="$(uname -m)" +else + arch_target="${ARCH}" +fi + final_artifact_name="kata-containers" image_initrd_extension=".img" diff --git a/tools/packaging/kata-deploy/local-build/kata-deploy-binaries.sh b/tools/packaging/kata-deploy/local-build/kata-deploy-binaries.sh index 8f819166afee..a13f9c51f1b7 100755 --- a/tools/packaging/kata-deploy/local-build/kata-deploy-binaries.sh +++ b/tools/packaging/kata-deploy/local-build/kata-deploy-binaries.sh @@ -208,6 +208,8 @@ install_initrd() { local libseccomp_version="$(get_from_kata_deps "externals.libseccomp.version")" local rust_version="$(get_from_kata_deps "languages.rust.meta.newest-version")" + [[ "${ARCH}" == "aarch64" && "${CROSS_BUILD}" == "true" ]] && echo "warning: Don't cross build initrd for aarch64 as it's too slow" && exit 0 + install_cached_tarball_component \ "${component}" \ "${jenkins}" \ diff --git a/utils.mk b/utils.mk index 3c809cf544b4..1a153e26cc93 100644 --- a/utils.mk +++ b/utils.mk @@ -157,10 +157,6 @@ endif EXTRA_RUSTFLAGS := -ifeq ($(ARCH), aarch64) - override EXTRA_RUSTFLAGS = -C link-arg=-lgcc - $(warning "WARNING: aarch64-musl needs extra symbols from libgcc") -endif ifneq ($(HOST_ARCH),$(ARCH)) ifeq ($(CC),)