# 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-ec.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
