# Copyright 2014 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 file.

# factory-mini is a subset of the factory software that can
# be used to run utilities like gooftool, hwid, and regcode, which may
# be useful in the CrOS test environment.  For instance, this would
# allow "gooftool probe" to be used to probe hardware components in
# Moblab.
#
# We don't want to install the entire chromeos-factory package in the
# test image, since it is quite large, so this package comprises a
# small ".par" file (/usr/local/factory-mini/factory-mini.par)
# containing the necessary subset of factory Python code, and symlinks
# from /usr/local/bin to that file.

EAPI=7
CROS_WORKON_PROJECT="chromiumos/platform/factory"
CROS_WORKON_LOCALNAME="platform/factory"
PYTHON_COMPAT=( python3_{4,5,6,7} )

inherit cros-workon python-r1

# TODO(b/155841952): Merge installer and factory-mini.par

# External dependencies (sync with factory.ebuild)
LOCAL_MIRROR_URL="http://commondatastorage.googleapis.com/chromeos-localmirror/"
WEBGL_AQUARIUM_URI="${LOCAL_MIRROR_URL}/distfiles/webgl-aquarium-20130524.tar.bz2"
SRC_URI="${WEBGL_AQUARIUM_URI}"

DESCRIPTION="Subset of factory software to be installed in test images"

LICENSE="BSD-Google"
KEYWORDS="~*"
IUSE=""

DEPEND="${PYTHON_DEPS}
	dev-python/jsonrpclib:=
	dev-python/pyyaml:=
	dev-python/protobuf-python:=
	virtual/chromeos-bsp-factory:=
	virtual/chromeos-regions:=
"

pkg_setup() {
	cros-workon_pkg_setup
	python_setup
}

src_unpack() {
	cros-workon_src_unpack
	default
}

src_configure() {
	default

	# Export build settings
	export PYTHON="${EPYTHON}"
	export PYTHON_SITEDIR="${ESYSROOT}$(python_get_sitedir)"
	export SRCROOT="${CROS_WORKON_SRCROOT}"
	export FROM_EBUILD=1

	# Export factory toolkit build settings
	export BOARD="${SYSROOT##*/}"
	export TARGET_DIR=/usr/local/factory
	export WEBGL_AQUARIUM_DIR="${WORKDIR}/webgl_aquarium_static"
}

src_compile() {
	emake par MAKE_PAR_ARGS=--mini PAR_NAME=factory-mini.par

	emake toolkit
}

src_install() {
	exeinto /usr/local/factory-mini
	doexe build/par/factory-mini.par

	# Sanity check: make sure we can run gooftool --help with only
	# the -mini.par file.
	build/par/factory-mini.par gooftool --help |
		grep -q "^usage: gooftool" || die

	# Install only symlinks for binaries usable with factory-mini.par.
	"${S}/bin/install_symlinks" \
		--mode mini --target ../factory-mini/factory-mini.par \
		"${D}"/usr/local/bin || die

	exeinto /usr/local/factory-toolkit
	doexe build/install_factory_toolkit.run
}
