From f0b58e38d26f1b84ec51e28f2173d3d79290a331 Mon Sep 17 00:00:00 2001 From: Alex Carter Date: Mon, 25 Apr 2022 10:08:22 -0500 Subject: [PATCH] static-build: Add build script for OVMF Introduces a build script for OVMF. Defaults to X86_64 build (x64 in OVMF) Fixes: #4169 Signed-off-by: Alex Carter --- tools/packaging/static-build/ovmf/Dockerfile | 21 +++++++ .../packaging/static-build/ovmf/build-ovmf.sh | 61 +++++++++++++++++++ tools/packaging/static-build/ovmf/build.sh | 53 ++++++++++++++++ versions.yaml | 9 +++ 4 files changed, 144 insertions(+) create mode 100644 tools/packaging/static-build/ovmf/Dockerfile create mode 100755 tools/packaging/static-build/ovmf/build-ovmf.sh create mode 100755 tools/packaging/static-build/ovmf/build.sh diff --git a/tools/packaging/static-build/ovmf/Dockerfile b/tools/packaging/static-build/ovmf/Dockerfile new file mode 100644 index 0000000000..cffeb2ffb2 --- /dev/null +++ b/tools/packaging/static-build/ovmf/Dockerfile @@ -0,0 +1,21 @@ +# Copyright (c) 2022 IBM +# +# SPDX-License-Identifier: Apache-2.0 + +FROM ubuntu:20.04 +ENV DEBIAN_FRONTEND=noninteractive + +RUN apt-get update && \ + apt-get install -y --no-install-recommends \ + ca-certificates \ + curl \ + g++ \ + gcc \ + git \ + iasl \ + make \ + nasm \ + python \ + python3 \ + uuid-dev && \ + apt-get clean && rm -rf /var/lib/lists/ diff --git a/tools/packaging/static-build/ovmf/build-ovmf.sh b/tools/packaging/static-build/ovmf/build-ovmf.sh new file mode 100755 index 0000000000..988af19d2a --- /dev/null +++ b/tools/packaging/static-build/ovmf/build-ovmf.sh @@ -0,0 +1,61 @@ +#!/bin/bash +# +# Copyright (c) 2022 IBM +# +# SPDX-License-Identifier: Apache-2.0 + +set -o errexit +set -o nounset +set -o pipefail + +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +source "${script_dir}/../../scripts/lib.sh" + +# disabling set -u because scripts attempt to expand undefined variables +set +u +ovmf_repo="${ovmf_repo:-}" +ovmf_dir="edk2" +ovmf_version="${ovmf_version:-}" +ovmf_package="${ovmf_package:-}" +package_output_dir="${package_output_dir:-}" +DESTDIR=${DESTDIR:-${PWD}} +PREFIX="${PREFIX:-/opt/kata}" +architecture="${architecture:-X64}" +toolchain="${toolchain:-GCC5}" +build_target="${build_target:-RELEASE}" + +[ -n "$ovmf_repo" ] || die "failed to get ovmf repo" +[ -n "$ovmf_version" ] || die "failed to get ovmf version or commit" +[ -n "$ovmf_package" ] || die "failed to get ovmf package or commit" +[ -n "$package_output_dir" ] || die "failed to get ovmf package or commit" + +info "Build ${ovmf_repo} version: ${ovmf_version}" + +build_root=$(mktemp -d) +pushd $build_root +git clone "${ovmf_repo}" +cd "${ovmf_dir}" +git checkout "${ovmf_version}" +git submodule init +git submodule update + +info "Using BaseTools make target" +make -C BaseTools/ + +info "Calling edksetup script" +source edksetup.sh + +info "Building ovmf" +build -b "${build_target}" -t "${toolchain}" -a "${architecture}" -p "${ovmf_package}" + +info "Done Building" + +build_path="Build/${package_output_dir}/${build_target}_${toolchain}/FV/OVMF.fd" +stat "${build_path}" + +#need to leave tmp dir +popd + +info "Install fd to destdir" +mkdir -p "$DESTDIR/$PREFIX/share/ovmf" +cp $build_root/$ovmf_dir/"${build_path}" "$DESTDIR/$PREFIX/share/ovmf" \ No newline at end of file diff --git a/tools/packaging/static-build/ovmf/build.sh b/tools/packaging/static-build/ovmf/build.sh new file mode 100755 index 0000000000..2cc3c8f10e --- /dev/null +++ b/tools/packaging/static-build/ovmf/build.sh @@ -0,0 +1,53 @@ +#!/usr/bin/env bash +# +# Copyright (c) 2022 IBM +# +# SPDX-License-Identifier: Apache-2.0 + +set -o errexit +set -o nounset +set -o pipefail + +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +readonly repo_root_dir="$(cd "${script_dir}/../../../.." && pwd)" +readonly ovmf_builder="${script_dir}/build-ovmf.sh" + +source "${script_dir}/../../scripts/lib.sh" + +DESTDIR=${DESTDIR:-${PWD}} +PREFIX=${PREFIX:-/opt/kata} +container_image="kata-ovmf-builder" +ovmf_build="${ovmf_build:-x86_64}" +kata_version="${kata_version:-}" +ovmf_repo="${ovmf_repo:-}" +ovmf_version="${ovmf_version:-}" +ovmf_package="${ovmf_package:-}" +package_output_dir="${package_output_dir:-}" + +if [ -z "$ovmf_repo" ]; then + ovmf_repo=$(get_from_kata_deps "externals.ovmf.url" "${kata_version}") +fi + +[ -n "$ovmf_repo" ] || die "failed to get ovmf repo" + +if [ "${ovmf_build}" == "x86_64" ]; then + [ -n "$ovmf_version" ] || ovmf_version=$(get_from_kata_deps "externals.ovmf.x86_64.version" "${kata_version}") + [ -n "$ovmf_package" ] || ovmf_package=$(get_from_kata_deps "externals.ovmf.x86_64.package" "${kata_version}") + [ -n "$package_output_dir" ] || package_output_dir=$(get_from_kata_deps "externals.ovmf.x86_64.package_output_dir" "${kata_version}") +fi + +[ -n "$ovmf_version" ] || die "failed to get ovmf version or commit" +[ -n "$ovmf_package" ] || die "failed to get ovmf package or commit" +[ -n "$package_output_dir" ] || die "failed to get ovmf package or commit" + +sudo docker build -t "${container_image}" "${script_dir}" + +sudo docker run --rm -i -v "${repo_root_dir}:${repo_root_dir}" \ + -w "${PWD}" \ + --env DESTDIR="${DESTDIR}" --env PREFIX="${PREFIX}" \ + --env ovmf_repo="${ovmf_repo}" \ + --env ovmf_version="${ovmf_version}" \ + --env ovmf_package="${ovmf_package}" \ + --env package_output_dir="${package_output_dir}" \ + "${container_image}" \ + bash -c "${ovmf_builder}" diff --git a/versions.yaml b/versions.yaml index 4df02678d5..075ce8e89d 100644 --- a/versions.yaml +++ b/versions.yaml @@ -243,6 +243,15 @@ externals: url: "https://github.com/containerd/nydus-snapshotter" version: "v0.1.0" + ovmf: + description: "Firmware, implementation of UEFI for virtual machines." + url: "https://github.com/tianocore/edk2" + x86_64: + description: "Vanilla firmware build" + version: "edk2-stable202202" + package: "OvmfPkg/OvmfPkgX64.dsc" + package_output_dir: "OvmfX64" + virtiofsd: description: "vhost-user virtio-fs device backend written in Rust" url: "https://gitlab.com/virtio-fs/virtiofsd"