# Copyright 2019 The Chromium OS Authors. All rights reserved.
# Distributed under the terms of the GNU General Public License v2

# @ECLASS: cros-ec-release.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 Chromium OS release firmware
# @DESCRIPTION:
# Release firmware using the EC code base needs to be built from specific
# branches/commits and must be signed by the signing daemon. This eclass
# provides a standardized mechanism for that process by building for a specific
# EC "board" and installing it into /build/<board>/<FPMCU_board>/release
# so that the signer can pick it up. Note that this doesn't install the
# firmware into the rootfs; that has to be done by a separate ebuild since the
# signer runs after the build.
#
# NOTE: When making changes to this class, make sure to modify all the -9999
# ebuilds that inherit it (e.g., chromeos-fpmcu-release*) to work around
# http://crbug.com/220902.

if [[ -z "${_ECLASS_CROS_EC_RELEASE}" ]]; then
_ECLASS_CROS_EC_RELEASE="1"

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

# @ECLASS-VARIABLE: FIRMWARE_EC_BOARD
# @DEFAULT_UNSET
# @DESCRIPTION:
# EC "board" to build.
: "${FIRMWARE_EC_BOARD:=}"

if [[ -z "${FIRMWARE_EC_BOARD}" ]]; then
	die "FIRMWARE_EC_BOARD must be specified in ebuild."
fi

# @ECLASS-VARIABLE: FIRMWARE_EC_RELEASE_REPLACE_RO
# @DEFAULT_UNSET
# @DESCRIPTION:
# By default the RO version in the binary will match the RW version. Use this
# variable to tell the build to replace the RO version with the factory-shipped
# version.
: "${FIRMWARE_EC_RELEASE_REPLACE_RO:="no"}"

inherit cros-ec cros-ec-merge-ro

DESCRIPTION="Chrome OS EC release firmware for ${FIRMWARE_EC_BOARD}."

# Avoid all modification of the firmware binaries; the binaries installed on
# the rootfs by this ebuild must exactly match the binaries copied from git.
#
# binchecks: disable all QA checks for binaries
# strip: final binaries will not be stripped of debug symbols
RESTRICT+="binchecks strip"

# @FUNCTION: get_ec_boards
# @INTERNAL
# @DESCRIPTION:
# This function overrides the get_ec_boards in cros-ec-board.eclass.
get_ec_boards() {
	EC_BOARDS=("${FIRMWARE_EC_BOARD}")
	einfo "Building for board: ${EC_BOARDS[*]}"
}

# @FUNCTION: cros-ec-release_src_prepare
# @DESCRIPTION:
# Override src_prepare in cros-ec-board.eclass.
# Set compilation to EC source directory and make sure private
# source files are in source directory (if private source is available).
cros-ec-release_src_prepare() {
	debug-print-function "${FUNCNAME[0]}" "$@"

	eapply_user

	# We want compilation to happen in the EC source directory.
	S+="/platform/ec"

	# Link the private sources in the private/ sub-directory.
	ln -sfT "${SYSROOT}/firmware/${FIRMWARE_EC_BOARD}/release/ec-private" \
		"${S}/private" || die
}

# @FUNCTION: cros-ec-release_src_install
# @DESCRIPTION:
# Override install in cros-ec-board.eclass so that we only install
# FIRMWARE_EC_BOARD into release directory.
cros-ec-release_src_install() {
	debug-print-function "${FUNCNAME[0]}" "$@"

	# Run the RO replacement process if requested.
	if [[ "${FIRMWARE_EC_RELEASE_REPLACE_RO}" == "yes" ]]; then
		cros-ec-merge-ro_src_install
	fi

	cros-ec_set_build_env

	# Use our specified board.
	local target="${FIRMWARE_EC_BOARD}"

	cros-ec_board_install "${target}" "${WORKDIR}/build_${target}" \
		"/firmware/${target}/release" "" \
		|| die "Couldn't install ${target}"
}

EXPORT_FUNCTIONS src_prepare src_install

fi  # _ECLASS_CROS_EC_RELEASE
