blob: 87e67303629f96d914b3bbc794aa5afaad1f3bfa [file] [log] [blame]
# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
# Distributed under the terms of the GNU General Public License v2
# @ECLASS: cros-u-boot.eclass
# @MAINTAINER:
# The Chromium OS Authors
# @BLURB: Unifies logic for building u-boot images for Chromium OS.
[[ ${EAPI} != "4" ]] && die "Only EAPI=4 is supported"
CROS_WORKON_OUTOFTREE_BUILD=1
inherit binutils-funcs cros-board toolchain-funcs flag-o-matic
DESCRIPTION="Das U-Boot boot loader"
HOMEPAGE="http://www.denx.de/wiki/U-Boot"
LICENSE="GPL-2"
SLOT="0"
IUSE="dev profiling factory-mode"
DEPEND=">=chromeos-base/vboot_reference-firmware-0.0.1-r175
!sys-boot/x86-firmware-fdts
!sys-boot/exynos-u-boot
!sys-boot/tegra2-public-firmware-fdts
"
RDEPEND="${DEPEND}
"
# @ECLASS-VARIABLE: U_BOOT_ALL_CONFIGS
# @DESCRIPTION:
# List of all boards for which this u-boot can be configured
: ${U_BOOT_ALL_CONFIGS:=}
# @ECLASS-VARIABLE: U_BOOT_CFG_PREFIX
# @DESCRIPTION:
# Prefix used for configuring u-boot for a board, i.e. "chromeos_"
: ${U_BOOT_CFG_PREFIX:=chromeos_}
# @ECLASS-VARIABLE: U_BOOT_CONFIG_USE_PREFIX
# @DESCRIPTION:
# Prefix used to identify which board u-boot is building for.
: ${U_BOOT_CONFIG_USE_PREFIX:=u_boot_config_use_}
[[ -z ${U_BOOT_ALL_CONFIGS} ]] && die "U_BOOT_ALL_CONFIGS must be set"
IUSE_CONFIGS=${U_BOOT_ALL_CONFIGS[@]/#/${U_BOOT_CONFIG_USE_PREFIX}}
IUSE="${IUSE} ${IUSE_CONFIGS}"
REQUIRED_USE="^^ ( ${IUSE_CONFIGS} )"
UB_BUILD_DIR="${WORKDIR}/${P}"
UB_BUILD_DIR_NB="${UB_BUILD_DIR%/}_nb"
# @FUNCTION: get_current_u_boot_config
# @DESCRIPTION:
# Finds the config for the current board by searching USE for an entry
# signifying which version to use.
get_current_u_boot_config() {
local use_config
for use_config in ${IUSE_CONFIGS}; do
if use ${use_config}; then
echo "${U_BOOT_CFG_PREFIX}${use_config#${U_BOOT_CONFIG_USE_PREFIX}}_config"
return
fi
done
die "Unable to determine current U-Boot config."
}
# @FUNCTION: netboot_required
# @DESCRIPTION:
# Checks if netboot image also needs to be generated.
netboot_required() {
# Build netbootable image for Link unconditionally for now.
# TODO (vbendeb): come up with a better scheme of determining what
# platforms should always generate the netboot capable
# legacy image.
local board=$(get_current_board_no_variant)
use factory-mode || [[ "${board}" == "link" ]]
}
# @FUNCTION: get_config_var
# @USAGE: <config name> <requested variable>
# @DESCRIPTION:
# Returns the value of the requested variable in the specified config
# if present. This can only be called after make config.
get_config_var() {
local config="${1%_config}"
local var="${2}"
local boards_cfg="${S}/boards.cfg"
local i
case "${var}" in
ARCH) i=2;;
CPU) i=3;;
BOARD) i=4;;
VENDOR) i=5;;
SOC) i=6;;
*) die "Unsupported field: ${var}"
esac
awk -v i=$i -v cfg="${config}" '$1 == cfg { print $i }' "${boards_cfg}"
}
umake() {
# Add `ARCH=` to reset ARCH env and let U-Boot choose it.
ARCH= emake "${COMMON_MAKE_FLAGS[@]}" "$@"
}
cros-u-boot_src_configure() {
export LDFLAGS=$(raw-ldflags)
tc-export BUILD_CC
CROS_U_BOOT_CONFIG="$(get_current_u_boot_config)"
elog "Using U-Boot config: ${CROS_U_BOOT_CONFIG}"
# Firmware related binaries are compiled with 32-bit toolchain
# on 64-bit platforms
if [[ ${CHOST} == x86_64-* ]]; then
CROSS_PREFIX="i686-pc-linux-gnu-"
else
CROSS_PREFIX="${CHOST}-"
fi
COMMON_MAKE_FLAGS=(
"CROSS_COMPILE=${CROSS_PREFIX}"
"VBOOT=${SYSROOT}/usr"
DEV_TREE_SEPARATE=1
"HOSTCC=${BUILD_CC}"
HOSTSTRIP=true
)
if use dev; then
# Avoid hiding the errors and warnings
COMMON_MAKE_FLAGS+=( -s )
else
COMMON_MAKE_FLAGS+=( -k )
COMMON_MAKE_FLAGS+=( WERROR=y )
fi
if use x86 || use amd64 || use cros-debug; then
COMMON_MAKE_FLAGS+=( VBOOT_DEBUG=1 )
fi
if use profiling; then
COMMON_MAKE_FLAGS+=( VBOOT_PERFORMANCE=1 )
fi
BUILD_FLAGS=(
"O=${UB_BUILD_DIR}"
)
umake "${BUILD_FLAGS[@]}" distclean
umake "${BUILD_FLAGS[@]}" ${CROS_U_BOOT_CONFIG}
if netboot_required; then
BUILD_NB_FLAGS=(
"O=${UB_BUILD_DIR_NB}"
BUILD_FACTORY_IMAGE=1
)
umake "${BUILD_FLAGS[@]}" distclean
umake "${BUILD_FLAGS[@]}" ${CROS_U_BOOT_CONFIG}
fi
}
cros-u-boot_src_compile() {
umake "${BUILD_FLAGS[@]}" all
if netboot_required; then
umake "${BUILD_NB_FLAGS[@]}" all
fi
}
cros-u-boot_src_install() {
local inst_dir="/firmware"
local files_to_copy=(
System.map
u-boot.bin
)
local ub_vendor="$(get_config_var ${CROS_U_BOOT_CONFIG} VENDOR)"
local ub_board="$(get_config_var ${CROS_U_BOOT_CONFIG} BOARD)"
local ub_arch="$(get_config_var ${CROS_U_BOOT_CONFIG} ARCH)"
local file
local dts_dir
if [[ -e spl/${ub_board}-spl.bin ]]; then
files_to_copy+=( spl/${ub_board}-spl.bin )
fi
insinto "${inst_dir}"
doins "${files_to_copy[@]/#/${UB_BUILD_DIR}/}"
newins "${UB_BUILD_DIR}/u-boot" u-boot.elf
if netboot_required; then
newins "${UB_BUILD_DIR_NB}/u-boot.bin" u-boot_netboot.bin
newins "${UB_BUILD_DIR_NB}/u-boot" u-boot_netboot.elf
fi
insinto "${inst_dir}/dts"
local dts_dirs=(
"board/${ub_vendor}/dts"
"board/${ub_vendor}/${ub_board}"
"arch/${ub_arch}/dts"
"cros/dts"
)
for dts_dir in "${dts_dirs[@]}"; do
files_to_copy="$(find ${dts_dir} -regex '.*\.dtsi?')"
if [[ -n ${files_to_copy} ]]; then
elog "Installing device tree files in ${dts_dir}"
doins ${files_to_copy}
fi
done
}
EXPORT_FUNCTIONS src_configure src_compile src_install