blob: 38eb1ecf951cb61d61774ba04c1eb046d4916b21 [file] [log] [blame]
# Copyright (c) 2011 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.
# Common library file to be sourced by build_image,
#, and This
# file ensures that library source files needed by all the scripts
# are included once, and also takes care of certain bookeeping tasks
# common to all the scripts.
# SCRIPT_ROOT must be set prior to sourcing this file
. "${SCRIPT_ROOT}/" || exit 1
# All scripts using this file must be run inside the chroot.
restart_in_chroot_if_needed "$@"
. /usr/share/misc/ || exit 1
should_build_image() {
# Fast pass back if we should build all incremental images.
local image_name
local image_to_build
for image_name in "$@"; do
for image_to_build in ${IMAGES_TO_BUILD}; do
[ "${image_to_build}" = "${image_name}" ] && return 0
return 1
# Returns the pv command if it's available, otherwise plain-old cat. Note that
# this function echoes the command, rather than running it, so it can be used
# as an argument to other commands (like sudo).
pv_cat_cmd() {
if type -P pv >&/dev/null; then
# Limit pv's output to 80 columns, for readability.
local term_cols=$(stty size 2>/dev/null | cut -d' ' -f2)
if [[ ${term_cols:-0} -gt 80 ]]; then
echo pv -w 80 -B 4m
echo pv -B 4m
echo cat
# Utility function for creating a copy of an image prior to
# modification from the BUILD_DIR:
# $1: source filename
# $2: destination filename
copy_image() {
local src="${BUILD_DIR}/$1"
local dst="${BUILD_DIR}/$2"
if should_build_image $1; then
echo "Creating $2 from $1..."
$(pv_cat_cmd) "${src}" >"${dst}" || die "Cannot copy $1 to $2"
mv "${src}" "${dst}" || die "Cannot move $1 to $2"
# Emerge a custom kernel to the |root|. The caller is responsible for tweaking
# the build env (e.g. $USE) before calling this.
emerge_custom_kernel() {
local install_root=$1
local root=/build/${FLAGS_board}
local tmp_pkgdir=${root}/custom-packages
# Clean up any leftover state in custom directories.
sudo rm -rf "${tmp_pkgdir}"
# Update chromeos-initramfs to contain the latest binaries from the build
# tree. This is basically just packaging up already-built binaries from
# ${root}. We are careful not to muck with the existing prebuilts so that
# prebuilts can be uploaded in parallel.
# TODO(davidjames): Implement ABI deps so that chromeos-initramfs will be
# rebuilt automatically when its dependencies change.
sudo -E PKGDIR="${tmp_pkgdir}" ${EMERGE_BOARD_CMD} -1 \
chromeos-base/chromeos-initramfs || die "Cannot emerge chromeos-initramfs"
# Verify all dependencies of the kernel are installed. This should be a
# no-op, but it's good to check in case a developer didn't run
# build_packages. We need the expand_virtual call to workaround a bug
# in portage where it only installs the virtual pkg.
local kernel=$(portageq-${FLAGS_board} expand_virtual ${root} \
sudo -E PKGDIR="${tmp_pkgdir}" ${EMERGE_BOARD_CMD} --onlydeps \
${kernel} || die "Cannot emerge kernel dependencies"
# Build the kernel. This uses the standard root so that we can pick up the
# initramfs from there. But we don't actually install the kernel to the
# standard root, because that'll muck up the kernel debug symbols there,
# which we want to upload in parallel.
sudo -E PKGDIR="${tmp_pkgdir}" ${EMERGE_BOARD_CMD} --buildpkgonly \
${kernel} || die "Cannot emerge kernel"
# Install the custom kernel to the provided install root.
sudo -E PKGDIR="${tmp_pkgdir}" ${EMERGE_BOARD_CMD} --usepkgonly \
--root=${install_root} ${kernel} || die "Cannot emerge kernel to root"