blob: a23bebb7a6bce7f294884d29e81d756fde1b1766 [file] [log] [blame]
#!/bin/bash
# Copyright 2017 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.
SCRIPT_ROOT=$(dirname "$(readlink -f "$0")")
. "${SCRIPT_ROOT}/build_library/build_common.sh" || exit 1
assert_inside_chroot "$@"
DEFINE_string board "${DEFAULT_BOARD}" \
"The board to build an image for."
DEFINE_boolean dev "${FLAGS_FALSE}" \
"Include dev packages and allow serial login."
DEFINE_boolean test "${FLAGS_FALSE}" \
"Include test and dev packages, and allow serial login."
DEFINE_string output_root "${DEFAULT_BUILD_ROOT}/images" \
"Directory in which to place image result directories (named by version)"
FLAGS_HELP="USAGE: ${SCRIPT_NAME} [flags]
To build a tatl dev image, try:
$ ${SCRIPT_NAME} --board=tatl --dev
"
FLAGS "$@" || exit 1
eval set -- "${FLAGS_ARGV}"
switch_to_strict_mode
IMAGE_TYPE_BASE="base"
IMAGE_TYPE_DEV="dev"
IMAGE_TYPE_TEST="test"
# Produce the VM image.
build_vm_image() {
local image_name="$1"
local image_type="$2"
local extra=()
local ROOTDIR="${OUTPUT_DIR}/rootfs"
local image_suffix=""
case "${image_type}" in
"${IMAGE_TYPE_TEST}")
extra+=( "virtual/target-termina-os-dev" )
extra+=( "virtual/target-termina-os-test" )
image_suffix="-test"
;;
"${IMAGE_TYPE_DEV}")
extra+=( "virtual/target-termina-os-dev" )
image_suffix="-dev"
;;
esac
export INSTALL_MASK="${DEFAULT_INSTALL_MASK}"
mkdir -p "${OUTPUT_DIR}"
install_with_root_deps "${ROOTDIR}" "virtual/target-termina-os" \
"sys-libs/gcc-libs" \
"${extra[@]}"
info "Installing C library ... "
install_libc "${ROOTDIR}"
info "Cleaning excess files ... "
sudo rm -rf "${ROOTDIR}"/var "${ROOTDIR}"/usr/lib*/gconv/ \
"${ROOTDIR}"/sbin/ldconfig "${ROOTDIR}"/boot "${ROOTDIR}"/lib/firmware
# Remove empty directories from the rootfs.
sudo find "${ROOTDIR}"/ -type d -depth -exec rmdir {} + 2>/dev/null || :
info "Creating top level dirs and socket dirs ... "
sudo mkdir -p "${ROOTDIR}"/{dev,proc,root,sys,home/user,run,tmp,var}
info "Creating container mounts ..."
sudo mkdir -p "${ROOTDIR}"/mnt/{container_rootfs,container_private}
info "Installing container pubkey ..."
"${VBOOT_SIGNING_DIR}"/insert_container_publickey.sh \
"${ROOTDIR}" \
"${VBOOT_DEVKEYS_DIR}"/cros-oci-container-pub.pem
info "Generating squashfs file ... "
local args=(
-all-root
-noappend
)
local img="${OUTPUT_DIR}/rootfs${image_suffix}.bin"
sudo mksquashfs "${ROOTDIR}" "${img}" "${args[@]}"
sudo chown $(id -u):$(id -g) "${img}"
info "Copying in kernel ..."
cp /build/"${FLAGS_board}"/boot/vmlinuz \
"${OUTPUT_DIR}/termina-kernel${image_suffix}.bin"
info "Cleaning up ... "
sudo rm -rf "${ROOTDIR}"
}
run_emerge() {
emerge-${BOARD} \
--quiet --jobs ${NUM_JOBS} \
--usepkgonly \
"$@"
}
# Emerge with root deps.
install_with_root_deps() {
local root_dir="$1"
shift
info "Installing '$*' with root deps ... "
run_emerge --root="${root_dir}" "$@" --root-deps=rdeps
}
main() {
OVERLAY_CHROMEOS_DIR="${SRC_ROOT}/third_party/chromiumos-overlay/chromeos"
. "${OVERLAY_CHROMEOS_DIR}/config/chromeos_version.sh" || exit 1
. "${BUILD_LIBRARY_DIR}/board_options.sh" || exit 1
. "${BUILD_LIBRARY_DIR}/base_image_util.sh" || exit 1
. "${BUILD_LIBRARY_DIR}/build_image_util.sh" || exit 1
local image_name="${FLAGS_board}"
info "Building '${image_name}' ..."
build_vm_image "${image_name}" "${IMAGE_TYPE_BASE}"
if [[ ${FLAGS_dev} -eq ${FLAGS_true} ]]; then
info "Building '${image_name}-dev' ..."
build_vm_image "${image_name}-dev" "${IMAGE_TYPE_DEV}"
fi
if [[ ${FLAGS_test} -eq ${FLAGS_true} ]]; then
info "Building '${image_name}-test' ..."
build_vm_image "${image_name}-test" "${IMAGE_TYPE_TEST}"
fi
# Set up symlink to latest image directory.
LINK_NAME="${FLAGS_output_root}/${BOARD}/latest"
ln -sfT $(basename ${OUTPUT_DIR}) ${LINK_NAME}
}
main "$@"