| # Copyright 2022 The ChromiumOS Authors |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| EAPI=7 |
| |
| CROS_WORKON_PROJECT=("chromiumos/platform/crdyboot" "chromiumos/platform/vboot_reference") |
| CROS_WORKON_LOCALNAME=("../platform/crdyboot" "../platform/vboot_reference") |
| CROS_WORKON_DESTDIR=("${S}" "${S}/third_party/vboot_reference") |
| SRC_URI="test? ( gs://chromeos-localmirror/distfiles/crdyboot_test_data_2d09372b.tar.xz )" |
| |
| # We're not building for CrOS userspace. |
| # This is used by cros-rust.eclass, so disable 'unused' complaints |
| # shellcheck disable=SC2034 |
| CROS_RUST_FORCE_STATIC_LINK=1 |
| |
| inherit cros-workon cros-rust |
| |
| DESCRIPTION="UEFI bootloaders for ChromeOS Flex" |
| |
| LICENSE="BSD-Google" |
| SLOT="0" |
| KEYWORDS="~*" |
| IUSE="crdyshim_dev_key" |
| |
| DEPEND=" |
| dev-libs/nss:= |
| dev-rust/third-party-crates-src:= |
| " |
| RDEPEND="${DEPEND}" |
| |
| # Clear the subdir so that we stay in the root of the repo. |
| CROS_RUST_SUBDIR="" |
| |
| UEFI_TARGET_I686="i686-unknown-uefi" |
| UEFI_TARGET_X64_64="x86_64-unknown-uefi" |
| UEFI_TARGETS=( |
| "${UEFI_TARGET_I686}" |
| "${UEFI_TARGET_X64_64}" |
| ) |
| |
| src_prepare() { |
| # Drop some packages that are not needed. |
| sed -i 's:"tools/enroller",::' "${S}/Cargo.toml" || die |
| sed -i 's:"tools/uefi_test_tool",::' "${S}/Cargo.toml" || die |
| sed -i 's:"xtask",::' "${S}/Cargo.toml" || die |
| |
| default |
| } |
| |
| src_configure() { |
| # Remove flags that come from BOARD_RUSTFLAGS and are |
| # incompatible with the uefi targets. |
| unset CROS_BASE_RUSTFLAGS |
| |
| cros-rust_src_configure |
| |
| # ECARGO_HOME is defined in cros-rust.eclass |
| # shellcheck disable=SC2154 |
| local ecargo_config="${ECARGO_HOME}/config" |
| |
| # Enable the c_variadic feature, used for logging from vboot. |
| sed -i 's/-Zallow-features=/&c_variadic,/' "${ecargo_config}" || die |
| |
| # Set the appropriate linker for UEFI targets. |
| cat <<- EOF >> "${ecargo_config}" |
| [target.i686-unknown-uefi] |
| linker = "lld-link" |
| |
| [target.x86_64-unknown-uefi] |
| linker = "lld-link" |
| EOF |
| } |
| |
| src_compile() { |
| # Skip this phase when code coverage is enabled. The UEFI |
| # targets are no-std, so they are not trivially compatible with |
| # `-Cinstrument-coverage`. Since the actual code coverage is |
| # provided by the test phase (which uses a non-UEFI target), |
| # skipping compilation here does not affect code coverage. |
| if use rust-coverage; then |
| return 0 |
| fi |
| |
| # We need to pass in a `--target` to the C compiler, but the |
| # compiler-wrapper for the board's CC appends the board target |
| # at the end, overriding that setting. Use |
| # `x86_64-pc-linux-gnu-clang` instead, as the host wrapper |
| # happens to not suffix a target. See |
| # `compiler_wrapper/clang_flags.go` at the end of |
| # `processClangFlags`. |
| export CC="x86_64-pc-linux-gnu-clang" |
| |
| local cargo_args=( |
| build |
| --offline |
| --release |
| --package crdyboot |
| --package crdyshim |
| ) |
| |
| # Default to embedding the release public key in crdyshim. If |
| # `USE=crdyshim_dev_key` is set, use the crdyshim dev key from |
| # vboot_reference instead. |
| if use crdyshim_dev_key; then |
| cargo_args+=( --features use_dev_pubkey ) |
| fi |
| |
| for uefi_target in "${UEFI_TARGETS[@]}"; do |
| ecargo "${cargo_args[@]}" --target="${uefi_target}" |
| done |
| } |
| |
| # Get the standard suffix for a UEFI boot executable. |
| uefi_arch_suffix() { |
| local uefi_target="$1" |
| if [[ "${uefi_target}" == "${UEFI_TARGET_I686}" ]]; then |
| echo "ia32.efi" |
| elif [[ "${uefi_target}" == "${UEFI_TARGET_X64_64}" ]]; then |
| echo "x64.efi" |
| else |
| die "unknown arch: ${uefi_target}" |
| fi |
| } |
| |
| src_install() { |
| # Skip this phase when code coverage is enabled. Since the |
| # compile phase was skipped, there's nothing to install. |
| if use rust-coverage; then |
| return 0 |
| fi |
| |
| for uefi_target in "${UEFI_TARGETS[@]}"; do |
| # CARGO_TARGET_DIR is defined in an eclass |
| # shellcheck disable=SC2154 |
| local release_dir="${CARGO_TARGET_DIR}/${uefi_target}/release" |
| |
| # Install crdyboot to the boot dir on the rootfs. |
| insinto /boot/efi/boot |
| newins "${release_dir}/crdyboot.efi" \ |
| "crdyboot$(uefi_arch_suffix "${uefi_target}")" |
| |
| # Install the unsigned crdyshim executables to a |
| # location outside the boot dir. These executables are |
| # built here so they can be extracted from the image and |
| # signed, but are otherwise unused. |
| insinto /usr/share/crdyshim |
| newins "${release_dir}/crdyshim.efi" \ |
| "crdyshim$(uefi_arch_suffix "${uefi_target}")" |
| done |
| } |