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

EAPI=2
CROS_WORKON_COMMIT="9c5ef945fd3f05d0e2890f2a9f3f922876412343"
CROS_WORKON_PROJECT="chromiumos/third_party/u-boot"

inherit cros-debug toolchain-funcs

DESCRIPTION="Das U-Boot boot loader"
HOMEPAGE="http://www.denx.de/wiki/U-Boot"
LICENSE="GPL-2"
SLOT="0"
KEYWORDS="arm x86"
IUSE="profiling"

DEPEND=">=chromeos-base/vboot_reference-firmware-0.0.1-r175
	"

RDEPEND="${DEPEND}
	"

CROS_WORKON_LOCALNAME="u-boot"
CROS_WORKON_SUBDIR="files"

# This must be inherited *after* EGIT/CROS_WORKON variables defined
inherit cros-workon

UB_BUILD_DIR="${WORKDIR}/${ROOT}"

# TODO(vbendeb): this will have to be populated when it becomes necessary to
# build different config flavors.
ALL_UBOOT_FLAVORS=''
IUSE="${IUSE} ${ALL_UBOOT_FLAVORS}"
UB_ARCH="$(tc-arch-kernel)"
COMMON_MAKE_FLAGS="ARCH=${UB_ARCH} CROSS_COMPILE=${CHOST}- O=${UB_BUILD_DIR}"

COMMON_MAKE_FLAGS+=" VBOOT=${ROOT%/}/usr"
if use cros-debug; then
	COMMON_MAKE_FLAGS+=" VBOOT_DEBUG=1"
fi
if use profiling; then
	COMMON_MAKE_FLAGS+=" VBOOT_PERFORMANCE=1"
fi

get_required_config() {
	case "${UB_ARCH}" in
		(arm) echo 'chromeos_tegra2_twostop_config';;
		(i386) echo 'coreboot-x86_config';;
		(*) die "can not build for unknown architecture ${UB_ARCH}";;
	esac
}

if use arm; then
	COMMON_MAKE_FLAGS+=" USE_PRIVATE_LIBGCC=yes"
	# We will supply an fdt at run time
	COMMON_MAKE_FLAGS+=" DEV_TREE_SEPARATE=1"
fi


src_configure() {
	local config
	config=$(get_required_config)
	elog "Using U-Boot config: ${config}"

	emake \
		${COMMON_MAKE_FLAGS} \
		distclean
	emake \
		${COMMON_MAKE_FLAGS} \
		${config} || die "U-Boot configuration ${config} failed"
}

src_compile() {
	local config
	tc-getCC

	config=$(get_required_config)
	emake \
		${COMMON_MAKE_FLAGS} \
		HOSTCC=${CC} \
		HOSTSTRIP=true \
		all || die "U-Boot compile ${config} failed"
}

src_install() {
	local config
	local inst_dir

	if use x86; then
		inst_dir='/coreboot'
	else
		inst_dir='/u-boot'
	fi

	dodir "${inst_dir}"
	insinto "${inst_dir}"

	local files_to_copy='System.map include/autoconf.mk u-boot.bin'

	for file in ${files_to_copy}; do
		doins "${UB_BUILD_DIR}/${file}" || die
	done

	if use x86; then
		newins "${UB_BUILD_DIR}/u-boot" u-boot.elf || die
	fi
}
