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

EAPI="7"
CROS_WORKON_COMMIT="7a5d371ba3254b77bd073c5d32cc39f633606b03"
CROS_WORKON_TREE="ccade7d0ab8756b8f5752b85efbfd460cce591c6"
CROS_WORKON_PROJECT="chromiumos/platform/initramfs"
CROS_WORKON_LOCALNAME="platform/initramfs"
CROS_WORKON_OUTOFTREE_BUILD="1"

inherit cros-workon cros-board cros-constants

DESCRIPTION="Create Chrome OS initramfs"
HOMEPAGE="https://chromium.googlesource.com/chromiumos/platform/initramfs/"

LICENSE="BSD-Google"
SLOT="0"
KEYWORDS="*"
IUSE="+cros_ec_utils detachable device_tree +interactive_recovery"
IUSE="${IUSE} legacy_firmware_ui -mtd +power_management"
IUSE="${IUSE} unibuild +oobe_config no_factory_flow"
IUSE="${IUSE} manatee_performance_tools nvme ufs"

# Build Targets
TARGETS_IUSE="
	factory_netboot_ramfs
	factory_shim_ramfs
	hypervisor_ramfs
	recovery_ramfs
	minios_ramfs
"
IUSE="${IUSE} test ${TARGETS_IUSE}"
# Allow absence of the build target when running tests via cros_run_unit_tests.
REQUIRED_USE="|| ( test ${TARGETS_IUSE} )"

# Packages required for building recovery initramfs.
RECOVERY_DEPENDS="
	chromeos-base/chromeos-installer
	chromeos-base/common-assets
	chromeos-base/vboot_reference
	chromeos-base/vpd
	sys-apps/flashrom
	sys-apps/pv
	virtual/assets
	virtual/chromeos-regions
	"

MINIOS_DEPENDS="
	chromeos-base/chromeos-installer
	chromeos-base/common-assets
	chromeos-base/factory_installer
	chromeos-base/minijail
	chromeos-base/minios
	chromeos-base/update-utils
	chromeos-base/vboot_reference
	chromeos-base/vpd
	dev-util/strace
	net-misc/curl
	net-misc/dhcp
	net-misc/dhcpcd
	net-wireless/wpa_supplicant-cros
	nvme? ( sys-apps/nvme-cli )
	sys-apps/flashrom
	sys-apps/pv
	virtual/assets
	virtual/chromeos-regions
	"

# Packages required for building factory installer shim initramfs.
FACTORY_SHIM_DEPENDS="
	chromeos-base/factory_installer
	chromeos-base/vboot_reference
	"

# Packages required for building factory netboot installer initramfs.
FACTORY_NETBOOT_DEPENDS="
	app-arch/lbzip2
	app-arch/pigz
	app-arch/sharutils
	app-misc/jq
	app-shells/bash
	chromeos-base/chromeos-base
	chromeos-base/chromeos-installer
	chromeos-base/chromeos-installshim
	chromeos-base/chromeos-storage-info
	chromeos-base/ec-utils
	chromeos-base/factory_installer
	ufs? ( chromeos-base/factory_ufs )
	chromeos-base/vboot_reference
	chromeos-base/vpd
	dev-libs/openssl:0=
	dev-util/shflags
	dev-util/xxd
	net-misc/curl
	net-misc/htpdate
	net-misc/uftp
	net-misc/wget
	sys-apps/coreutils
	sys-apps/flashrom
	sys-apps/iproute2
	sys-apps/mosys
	sys-apps/util-linux
	sys-fs/dosfstools
	sys-fs/e2fsprogs
	sys-libs/ncurses
	virtual/udev
	"

# Packages required for building hypervisor initramfs.
HYPERVISOR_DEPENDS="
	chromeos-base/crosvm
	chromeos-base/sirenia
	sys-apps/coreboot-utils
	virtual/linux-sources
	virtual/manatee-apps
	manatee_performance_tools? (
		app-admin/sysstat
		dev-util/strace
		dev-util/turbostat
		dev-util/perf
		dev-util/trace-cmd
		sys-process/htop
		chromeos-base/perfetto
	)
	"

DEPEND="
	!no_factory_flow? (
		factory_netboot_ramfs? ( ${FACTORY_NETBOOT_DEPENDS} )
		factory_shim_ramfs? ( ${FACTORY_SHIM_DEPENDS} )
	)
	recovery_ramfs? ( ${RECOVERY_DEPENDS} )
	hypervisor_ramfs? ( ${HYPERVISOR_DEPENDS} )
	minios_ramfs? ( ${MINIOS_DEPENDS} )
	sys-apps/busybox[-make-symlinks]
	sys-fs/lvm2
	virtual/chromeos-bsp-initramfs
	chromeos-base/chromeos-init
	sys-apps/frecon-lite
	power_management? ( chromeos-base/power_manager )
	unibuild? ( chromeos-base/chromeos-config )
	chromeos-base/chromeos-config-tools
	test? ( dev-util/shunit2 )"

RDEPEND=""

BDEPEND="
	hypervisor_ramfs? ( chromeos-base/sirenia-tools )"

src_prepare() {
	export BUILD_LIBRARY_DIR="${CHROOT_SOURCE_ROOT}/src/scripts/build_library"
	export INTERACTIVE_COMPLETE="$(usex interactive_recovery true false)"

	# Need the lddtree from the chromite dir.
	export PATH="${CHROMITE_BIN_DIR}:${PATH}"

	eapply_user
}

src_compile() {
	local deps=()
	use mtd && deps+=(/usr/bin/cgpt)
	if use factory_netboot_ramfs; then
		if ! use no_factory_flow; then
			use power_management && deps+=(/usr/bin/backlight_tool)
		fi
	fi

	local targets=()
	for target in ${TARGETS_IUSE}; do
		use "${target}" && targets+=("${target%_ramfs}")
	done
	einfo "Building targets: ${targets[*]:-(only running tests)}"

	if [[ ${#targets[@]} -gt 0 ]]; then
		emake SYSROOT="${SYSROOT}" \
			BOARD="$(get_current_board_with_variant)" \
			DETACHABLE="$(usex detachable 1 0)" \
			INCLUDE_ECTOOL="$(usex cros_ec_utils 1 0)" \
			INCLUDE_FACTORY_UFS="$(usex ufs 1 0)" \
			INCLUDE_FIT_PICKER="$(usex device_tree 1 0)" \
			INCLUDE_NVME_CLI="$(usex nvme 1 0)" \
			LEGACY_UI="$(usex legacy_firmware_ui 1 0)" \
			LIBDIR="$(get_libdir)" \
			LOCALE_LIST="${RECOVERY_LOCALES:-}" \
			MANATEE_PERFORMANCE_TOOLS="$(usex manatee_performance_tools 1 0)" \
			OOBE_CONFIG="$(usex oobe_config 1 0)" \
			OUTPUT_DIR="${WORKDIR}" EXTRA_BIN_DEPS="${deps[*]}" \
			UNIBUILD="$(usex unibuild 1 0)" \
			"${targets[@]}"
	fi
}

src_test() {
	local targets=()
	for target in ${TARGETS_IUSE}; do
		use "${target}" && targets+=("${target%_ramfs}_check")
	done
	einfo "Testing targets: ${targets[*]}"

	if [[ ${#targets[@]} -gt 0 ]]; then
		emake SYSROOT="${SYSROOT}" "${targets[@]}"
	fi
}

src_install() {
	insinto /var/lib/initramfs
	for target in ${TARGETS_IUSE}; do
		use "${target}" &&
			doins "${WORKDIR}/${target}.cpio"
	done
}
