# 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/+/master/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
