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

EAPI=7
CROS_WORKON_PROJECT="chromiumos/platform/bmpblk"
CROS_WORKON_LOCALNAME="../platform/bmpblk"
CROS_WORKON_OUTOFTREE_BUILD="1"
CROS_WORKON_USE_VCSID="1"

# TODO(hungte) When "tweaking ebuilds by source repository" is implemented, we
# can generate this list by some script inside source repo.
CROS_BOARDS=(
	ambassador
	asurada
	atlas
	auron_paine
	auron_yuna
	banjo
	brya
	buddy
	butterfly
	candy
	chell
	cid
	clapper
	cranky
	daisy
	daisy_snow
	daisy_spring
	daisy_skate
	dedede
	deltaur
	dragonegg
	drallion
	endeavour
	enguarde
	expresso
	eve
	falco
	fizz
	flapjack
	glados
	glimmer
	gnawty
	grunt
	guado
	hatch
	jacuzzi
	kalista
	kevin
	kip
	kukui
	lars
	leon
	link
	lulu
	lumpy
	mccloud
	meowth
	monroe
	mushu
	nami
	nautilus
	ninja
	nocturne
	nyan
	nyan_big
	octopus
	orco
	palkia
	panther
	parrot
	peach_pi
	peach_pit
	peppy
	poppy
	puff
	quawks
	rammus
	reks
	rikku
	sarien
	scarlet
	soraka
	squawks
	stout
	strongbad
	stumpy
	sumo
	swanky
	tglrvp
	tidus
	tricky
	trogdor
	veyron_brain
	veyron_danger
	veyron_jerry
	veyron_mickey
	veyron_minnie
	veyron_pinky
	veyron_romy
	volteer
	winky
	wolf
	zako
	zoombini
	zork
)

PYTHON_COMPAT=( python3_{6..8} )
inherit cros-workon cros-board python-any-r1

DESCRIPTION="Chrome OS Firmware Bitmap Block"
HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/bmpblk/"
SRC_URI=""
LICENSE="BSD-Google"
KEYWORDS="~*"
IUSE="detachable diag_payload +minidiag physical_presence_power
	physical_presence_recovery"

BDEPEND="${PYTHON_DEPS}"
DEPEND="virtual/chromeos-vendor-strings"

src_prepare() {
	export BOARD="$(get_current_board_with_variant "${ARCH}-generic")"
	export VCSID

	default

	# if fontconfig's cache is empty, prepare single use cache.
	# That's still faster than having each process (of which there
	# are many) re-scan the fonts
	if find /usr/share/cache/fontconfig -maxdepth 0 -type d -empty \
		-exec false {} +; then

		return
	fi

	TMPCACHE=$(mktemp -d)
	cat > $TMPCACHE/local-conf.xml <<-EOF
		<?xml version="1.0"?>
		<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
		<fontconfig>
		<cachedir>$TMPCACHE</cachedir>
		<include>/etc/fonts/fonts.conf</include>
		</fontconfig>
	EOF
	export FONTCONFIG_FILE=$TMPCACHE/local-conf.xml
	fc-cache -v
}

src_compile() {
	local vendor_strings_dir="${SYSROOT}/firmware/vendor-strings"
	if use detachable ; then
		export DETACHABLE=1
	fi

	# Both diag_payload and minidiag need additional UI images from
	# chromeos-bmpblk.
	if use diag_payload || use minidiag ; then
		export DIAGNOSTIC_UI=1
	fi
	if [[ -f "${vendor_strings_dir}/vendor_format.yaml" ]] ; then
		export VENDOR_STRINGS_DIR="${vendor_strings_dir}"
	fi
	if use physical_presence_power ; then
		export PHYSICAL_PRESENCE="power"
	elif use physical_presence_recovery ; then
		export PHYSICAL_PRESENCE="recovery"
	else
		export PHYSICAL_PRESENCE="keyboard"
	fi
	emake OUTPUT="${WORKDIR}" BOARD="${BOARD}"
	emake OUTPUT="${WORKDIR}/${BOARD}" ARCHIVER="/usr/bin/archive" archive
	if [[ "${BOARD}" == "${ARCH}-generic" ]]; then
		printf "1" > "${WORKDIR}/${BOARD}/vbgfx_not_scaled"
	fi
}

doins_if_exist() {
	local f
	for f in "$@"; do
		if [[ -r "${f}" ]]; then
			doins "${f}"
		fi
	done
}

src_install() {
	# Most bitmaps need to reside in the RO CBFS only. Many boards do
	# not have enough space in the RW CBFS regions to contain all
	# image files.
	insinto /firmware/cbfs-ro-compress
	# These files aren't necessary for debug builds. When these files
	# are missing, Depthcharge will render text-only screens. They look
	# obviously not ready for release.
	doins_if_exist "${WORKDIR}/${BOARD}"/vbgfx.bin
	doins_if_exist "${WORKDIR}/${BOARD}"/locales
	doins_if_exist "${WORKDIR}/${BOARD}"/locale/ro/locale_*.bin
	doins_if_exist "${WORKDIR}/${BOARD}"/font.bin
	# This flag tells the firmware_Bmpblk test to flag this build as
	# not ready for release.
	doins_if_exist "${WORKDIR}/${BOARD}"/vbgfx_not_scaled

	# However, if specific bitmaps need to be updated via RW update,
	# we should also install here.
	insinto /firmware/cbfs-rw-compress-override
	doins_if_exist "${WORKDIR}/${BOARD}"/locale/rw/rw_locale_*.bin
}
