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

EAPI=7

CROS_WORKON_COMMIT="4429adae74089c2f0e188be6c04a030cb0a9b73a"
CROS_WORKON_TREE="6b4d7dca12d53edad5b608ade6042c9c5d935e05"
CROS_WORKON_LOCALNAME="platform2"
CROS_WORKON_PROJECT="chromiumos/platform2"
CROS_WORKON_SUBTREE="chromeos-config/cros_config_host"

inherit cros-unibuild cros-workon

DESCRIPTION="Chromium OS-specific configuration"
HOMEPAGE="https://chromium.googlesource.com/chromiumos/config/"
SRC_URI=""
LICENSE="BSD-Google"
KEYWORDS="*"
IUSE="zephyr_ec"

# This ebuild creates the Chrome OS master configuration file stored in
# ${UNIBOARD_JSON_INSTALL_PATH}. See go/cros-unified-builds-design for
# more information.

# Run a Python utility from the cros_config_host directory.
#
# Doing this instead of calling the installed copy has multiple
# benefits:
# - Users who are making a schema change do not need to cros workon
#   chromeos-base/chromeos-config-host, emerge that, and cros workon
#   chromeos-base/chromeos-config for their board, and finally emerge
#   that.  Historically, this was a common confusion point for
#   developers.
# - Schema permissions don't end up messed up if a user does a repo
#   sync with a weird umask.
# - Schema changes force the chromeos-base/chromeos-config package to
#   get revbumped.
#
# Args:
#    $1: The tool name to run (either cros_config_host or
#        cros_config_schema).
#    $@: The remaining arguments are passed directly to the tool.
run_cros_config_tool() {
	local tool="${1}"
	shift

	PYTHONPATH="${S}/chromeos-config/cros_config_host" \
		python3 -m "${tool}" "$@"
}

# Merges all of the source YAML config files and generates the
# corresponding build config and platform config files.
src_compile() {
	local yaml_files=( "${SYSROOT}${UNIBOARD_YAML_DIR}/"*.yaml )
	local input_yaml_files=()
	local schema_flags=()
	local yaml="${WORKDIR}/config.yaml"
	local c_file="${WORKDIR}/config.c"
	local configfs_image="${WORKDIR}/configfs.img"
	local gen_yaml="${SYSROOT}${UNIBOARD_YAML_DIR}/config.yaml"

	# Protobuf based configs generate JSON directly with no YAML.
	if [[ -f "${SYSROOT}${UNIBOARD_YAML_DIR}/project-config.json" ]]; then
		yaml_files=( "${SYSROOT}${UNIBOARD_YAML_DIR}/project-config.json" )
	fi

	for source_yaml in "${yaml_files[@]}"; do
		if [[ -f "${source_yaml}" && "${source_yaml}" != "${gen_yaml}" ]]; then
			einfo "Adding source YAML file ${source_yaml}"
			# Order matters here.  This will control how YAML files
			# are merged.  To control the order, change the name
			# of the input files to be in the order desired.
			input_yaml_files+=("${source_yaml}")
		fi
	done

	if use zephyr_ec; then
		schema_flags+=( --zephyr-ec-configs-only )
	fi

	if [[ "${#input_yaml_files[@]}" -ne 0 ]]; then
		run_cros_config_tool cros_config_schema "${schema_flags[@]}" \
			-o "${yaml}" \
			-m "${input_yaml_files[@]}" \
			|| die "cros_config_schema failed for build config."

		run_cros_config_tool cros_config_schema -c "${yaml}" \
			--configfs-output "${configfs_image}" -g "${WORKDIR}" -f "True" \
			|| die "cros_config_schema failed for platform config."
	else
		einfo "Emitting empty C interface config for mosys."
		cp "${FILESDIR}/empty_config.c" "${c_file}"
	fi
}

src_install() {
	# Get the directory name only, and use that as the install directory.
	insinto "${UNIBOARD_JSON_INSTALL_PATH%/*}"
	if [[ -e "${WORKDIR}/configfs.img" ]]; then
		doins "${WORKDIR}/configfs.img"
	fi

	insinto "${UNIBOARD_YAML_DIR}"
	doins "${WORKDIR}/config.c"
	if [[ -e "${WORKDIR}/config.yaml" ]]; then
		doins "${WORKDIR}/config.yaml"
	fi
}

# @FUNCTION: _verify_config_dump
# @USAGE: [source-yaml] [expected-json]
# @INTERNAL
# @DESCRIPTION:
# Dumps the cros_config_host contents and verifies expected file match.
#   $1: Source YAML config file used to generate JSON dump.
#   $2: Expected JSON output file that is verified against.
_verify_config_dump() {
	local source_yaml="$1"
	local expected_json="$2"

	local expected_path="${SYSROOT}${CROS_CONFIG_TEST_DIR}/${expected_json}"
	local source_path="${SYSROOT}${UNIBOARD_YAML_DIR}/${source_yaml}"
	local actual_path="${WORKDIR}/${expected_json}"
	local merged_path="${WORKDIR}/${source_yaml}"
	if [[ -e "${expected_path}" ]]; then
		if [[ -e "${source_path}" ]]; then
			run_cros_config_tool cros_config_schema -o "${merged_path}" \
				-m "${source_path}" \
				|| die "cros_config_schema failed for build config."
			run_cros_config_tool cros_config_host \
				-c "${merged_path}" dump-config > "${actual_path}"
			verify_file_match "${expected_path}" "${actual_path}"
		else
			eerror "Source YAML ${source_path} doesn't exist for checking" \
				"against expected JSON dump ${expected_path}"
			die
		fi
	fi
}

src_test() {
	_verify_config_dump model.yaml config_dump.json
	_verify_config_dump private-model.yaml config_dump-private.json
}
