blob: 13191c91343ab3be7b64ab630153dec8b24f98f5 [file] [log] [blame]
# Copyright 2012 The Chromium OS Authors.
# Distributed under the terms of the GNU General Public License v2
EAPI=7
CROS_WORKON_PROJECT=(
"chromiumos/platform/depthcharge"
"chromiumos/platform/vboot_reference"
)
DESCRIPTION="coreboot's depthcharge payload"
HOMEPAGE="http://www.coreboot.org"
LICENSE="GPL-2"
KEYWORDS="~*"
IUSE="detachable diag_payload fwconsole mocktpm pd_sync
unibuild verbose debug +minidiag
physical_presence_power physical_presence_recovery"
DEPEND="
sys-boot/coreboot:=
chromeos-base/chromeos-ec-headers:=
sys-boot/libpayload:=
unibuild? ( chromeos-base/chromeos-config:= )
"
BDEPEND="
dev-python/kconfiglib
"
CROS_WORKON_LOCALNAME=("../platform/depthcharge" "../platform/vboot_reference")
VBOOT_REFERENCE_DESTDIR="${S}/vboot_reference"
CROS_WORKON_DESTDIR=("${S}/depthcharge" "${VBOOT_REFERENCE_DESTDIR}")
# Don't strip to ease remote GDB use (cbfstool strips final binaries anyway)
STRIP_MASK="*"
inherit cros-workon cros-board cros-unibuild
# Get the depthcharge board config to build for.
# Checks the current board with/without variant. Echoes the board config file
# that should be used to build depthcharge.
get_board() {
local board=$(get_current_board_with_variant)
if [[ ! -d "board/${board}" ]]; then
board=$(get_current_board_no_variant)
fi
echo "${board}"
}
# Build depthcharge with common options.
# Usage example: dc_make dev "${BUILD_DIR}" "${LIBPAYLOAD_DIR}"
# Args:
# $1: Target to build
# $2: Build directory to use.
# $3: Directory where libpayload is located.
# $4+: Any other Makefile arguments.
dc_make() {
local target="$1"
local builddir="$2"
local libpayload="$3"
shift 3
local OPTS=(
"EC_HEADERS=${SYSROOT}/usr/include/chromeos/ec"
"VB_SOURCE=${VBOOT_REFERENCE_DESTDIR}"
"PD_SYNC=$(usev pd_sync)"
"LIBPAYLOAD_DIR=${libpayload}/libpayload"
"obj=${builddir}"
)
use verbose && OPTS+=( "V=1" )
use debug && OPTS+=( "SOURCE_DEBUG=1" )
emake "${OPTS[@]}" \
"${target}" \
"$@"
}
# Build depthcharge for the current board.
# Builds the various output files for depthcharge:
# depthcharge.elf - normal image
# dev.elf - developer image
# netboot.elf - network image
# In addition, .map files are produced for each, and a .config file which
# holds the configuration that was used.
# Args
# $1: board to build for.
# $2: build directory
# $3: libpayload dir
make_depthcharge() {
local board="$1"
local builddir="$2"
local libpayload="$3"
local base_defconfig="board/${board}/defconfig"
local defconfig="${T}/${board}-defconfig"
local config="${builddir}/depthcharge.config"
if [[ -e "${base_defconfig}" ]]; then
cp "${base_defconfig}" "${defconfig}"
else
ewarn "${base_defconfig} does not exist!"
touch "${defconfig}"
fi
chmod +w "${defconfig}"
if use mocktpm ; then
echo "CONFIG_MOCK_TPM=y" >> "${defconfig}"
fi
if use fwconsole ; then
echo "CONFIG_CLI=y" >> "${defconfig}"
echo "CONFIG_SYS_PROMPT=\"${board}: \"" >> "${defconfig}"
fi
if use detachable ; then
echo "CONFIG_DETACHABLE=y" >> "${defconfig}"
fi
# Both diag_payload and minidiag need special UI.
if use diag_payload || use minidiag ; then
echo "CONFIG_DIAGNOSTIC_UI=y" >> "${defconfig}"
fi
if use physical_presence_power || use physical_presence_recovery ; then
echo "CONFIG_PHYSICAL_PRESENCE_KEYBOARD=n" >> "${defconfig}"
fi
dc_make defconfig "${builddir}" "${libpayload}" \
KBUILD_DEFCONFIG="${defconfig}" \
DOTCONFIG="${config}"
dc_make depthcharge "${builddir}" "${libpayload}" \
DOTCONFIG="${config}"
dc_make dev "${builddir}" "${libpayload}.gdb" \
DOTCONFIG="${config}"
dc_make netboot "${builddir}" "${libpayload}.gdb" \
DOTCONFIG="${config}"
}
# Copy the fwconfig from libpayload to a path
# Args:
# $1: libpayload dir
# $2: depthcharge build directory
_copy_fwconfig() {
local src="${1}/libpayload/include/static_fw_config.h"
local dest="${2}/static_fw_config.h"
if [[ -s "${src}" ]]; then
cp "${src}" "${dest}"
einfo "Copying ${src} into local tree"
else
ewarn "${src} does not exist"
fi
}
src_compile() {
local builddir
local libpayload
# Firmware related binaries are compiled with a 32-bit toolchain
# on 64-bit platforms
if use amd64 ; then
export CROSS_COMPILE="i686-pc-linux-gnu-"
export CC="${CROSS_COMPILE}gcc"
else
export CROSS_COMPILE=${CHOST}-
fi
pushd depthcharge >/dev/null || \
die "Failed to change into ${PWD}/depthcharge"
if use unibuild; then
local name
local depthcharge
while read -r name && read -r depthcharge; do
libpayload="${SYSROOT}/firmware/${name}/libpayload"
builddir="$(cros-workon_get_build_dir)/${depthcharge}"
mkdir -p "${builddir}"
_copy_fwconfig "${libpayload}" "${builddir}"
make_depthcharge "${depthcharge}" "${builddir}" "${libpayload}"
done < <(cros_config_host get-firmware-build-combinations depthcharge)
else
libpayload="${SYSROOT}/firmware/legacy/libpayload"
builddir="$(cros-workon_get_build_dir)"
mkdir -p "${builddir}"
_copy_fwconfig "${libpayload}" "${builddir}"
make_depthcharge "$(get_board)" "${builddir}" "${libpayload}"
fi
popd >/dev/null || die
}
do_install() {
local board="$1"
local builddir="$2"
local dstdir="/firmware"
if [[ -n "${build_target}" ]]; then
dstdir+="/${build_target}"
einfo "Installing depthcharge ${build_target} into ${dest_dir}"
fi
insinto "${dstdir}"
pushd "${builddir}" >/dev/null || \
die "couldn't access ${builddir}/ directory"
local files_to_copy=(
depthcharge.config
{netboot,depthcharge,dev}.elf{,.map}
)
insinto "${dstdir}/depthcharge"
doins "${files_to_copy[@]}"
popd >/dev/null || die
}
src_install() {
if use unibuild; then
local build_target
local builddir
for build_target in $(cros_config_host \
get-firmware-build-targets depthcharge); do
builddir="$(cros-workon_get_build_dir)/${build_target}"
do_install "${build_target}" "${builddir}"
done
else
do_install "$(get_board)" "$(cros-workon_get_build_dir)"
fi
}