# Copyright 2020 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE.makefile file.

# @ECLASS: cros-ish.eclass
# @MAINTAINER:
# Chromium OS Firmware Team
# @BUGREPORTS:
# Please report bugs via http://crbug.com/new (with label Build)
# @VCSURL: https://chromium.googlesource.com/chromiumos/overlays/chromiumos-overlay/+/HEAD/eclass/@ECLASS@
# @BLURB: helper eclass for building ISH firmware based on Chromium OS EC
# @DESCRIPTION:
# Builds the ISH firmware and installs into /lib/firmware/intel/<board>.bin
#
# NOTE: When making changes to this class, make sure to modify all the -9999
# ebuilds that inherit it (e.g., chromeos-ish) to work around
# http://crbug.com/220902.

# @ECLASS-VARIABLE: ISH_TARGETS
# @DESCRIPTION:
# An array of platform/ec boards that should be built based on build
# configuration (e.g. model.yaml or config.star)

# Check for EAPI 7+.
case "${EAPI:-0}" in
0|1|2|3|4|5|6) die "Unsupported EAPI=${EAPI:-0} (too old) for ${ECLASS}" ;;
*) ;;
esac

inherit toolchain-funcs cros-unibuild coreboot-sdk

IUSE="coreboot-sdk quiet test unibuild verbose"
REQUIRED_USE="unibuild"

# EC build requires libftdi, but not used for runtime (b:129129436).
DEPEND="
	dev-embedded/libftdi:1=
	chromeos-base/chromeos-config
	test? (
		dev-libs/libprotobuf-mutator:=
		dev-libs/openssl:=
		dev-libs/protobuf:=
	)
"

# @FUNCTION: cros-ish_src_unpack
# @DESCRIPTION:
# Get source files.
cros-ish_src_unpack() {
	cros-workon_src_unpack
	S+="/platform/ec"
}

# @FUNCTION: cros-ish_src_prepare
# @DESCRIPTION: Set compilation to EC source directory.
cros-ish_src_prepare() {
	default

	cros_use_gcc
}

# @FUNCTION: cros-ish_set_build_env
# @DESCRIPTION:
# Set toolchain and build options.
cros-ish_set_build_env() {
	# always use coreboot-sdk to build ISH
	export CROSS_COMPILE_i386=${COREBOOT_SDK_PREFIX_x86_32}
	export CROSS_COMPILE_coreboot_sdk_i386=${COREBOOT_SDK_PREFIX_x86_32}

	tc-export CC BUILD_CC
	export BUILDCC="${BUILD_CC}"

	ISH_TARGETS=($(cros_config_host get-firmware-build-targets ish))

	EC_OPTS=()
	use quiet && EC_OPTS+=( -s V=0 )
	use verbose && EC_OPTS+=( V=1 )
}

# @FUNCTION: cros-ish_src_compile
# @DESCRIPTION:
# Compile all boards specified in ISH_TARGETS array variable.
cros-ish_src_compile() {
	cros-ish_set_build_env

	local target
	einfo "Building targets:" "${ISH_TARGETS[@]}"
	for target in "${ISH_TARGETS[@]}"; do
		BOARD="${target}" emake "${EC_OPTS[@]}" clean
		BOARD="${target}" emake "${EC_OPTS[@]}" all
	done
}

# @FUNCTION: cros-ish_src_test
# @DESCRIPTION:
# Runs host tests for all boards in platform/ec (even if not ISH target)
cros-ish_src_test() {
	cros-ish_set_build_env

	emake "${EC_OPTS[@]}" runhosttests
}

# @FUNCTION: cros-ec_src_install
# @DESCRIPTION:
# Install all ISH firmware targets into /lib/firmware/intel/<board>.bin
cros-ish_src_install() {
	cros-ish_set_build_env

	local target
	insinto "/lib/firmware/intel/"

	einfo "Installing targets:" "${ISH_TARGETS[@]}"
	for target in "${ISH_TARGETS[@]}"; do
		newins "build/${target}/ec.bin" "${target}.bin"
	done
}

EXPORT_FUNCTIONS src_unpack src_prepare src_compile src_test src_install
