blob: a23bebb7a6bce7f294884d29e81d756fde1b1766 [file] [log] [blame]
Stephen Barber3f7688f2017-02-16 11:23:44 -08001#!/bin/bash
2# Copyright 2017 The Chromium OS Authors. All rights reserved.
3# Use of this source code is governed by a BSD-style license that can be
4# found in the LICENSE file.
5
6SCRIPT_ROOT=$(dirname "$(readlink -f "$0")")
7. "${SCRIPT_ROOT}/build_library/build_common.sh" || exit 1
8
9assert_inside_chroot "$@"
10
11DEFINE_string board "${DEFAULT_BOARD}" \
12 "The board to build an image for."
13DEFINE_boolean dev "${FLAGS_FALSE}" \
14 "Include dev packages and allow serial login."
15DEFINE_boolean test "${FLAGS_FALSE}" \
16 "Include test and dev packages, and allow serial login."
17DEFINE_string output_root "${DEFAULT_BUILD_ROOT}/images" \
18 "Directory in which to place image result directories (named by version)"
19
20FLAGS_HELP="USAGE: ${SCRIPT_NAME} [flags]
21
22To build a tatl dev image, try:
23$ ${SCRIPT_NAME} --board=tatl --dev
24"
25FLAGS "$@" || exit 1
26eval set -- "${FLAGS_ARGV}"
27switch_to_strict_mode
28
29IMAGE_TYPE_BASE="base"
30IMAGE_TYPE_DEV="dev"
31IMAGE_TYPE_TEST="test"
32
33# Produce the VM image.
34build_vm_image() {
35 local image_name="$1"
36 local image_type="$2"
37 local extra=()
38 local ROOTDIR="${OUTPUT_DIR}/rootfs"
39 local image_suffix=""
40
41 case "${image_type}" in
42 "${IMAGE_TYPE_TEST}")
43 extra+=( "virtual/target-termina-os-dev" )
44 extra+=( "virtual/target-termina-os-test" )
45 image_suffix="-test"
46 ;;
47 "${IMAGE_TYPE_DEV}")
48 extra+=( "virtual/target-termina-os-dev" )
49 image_suffix="-dev"
50 ;;
51 esac
52
53 export INSTALL_MASK="${DEFAULT_INSTALL_MASK}"
54
55 mkdir -p "${OUTPUT_DIR}"
56
57 install_with_root_deps "${ROOTDIR}" "virtual/target-termina-os" \
58 "sys-libs/gcc-libs" \
59 "${extra[@]}"
60
61 info "Installing C library ... "
62 install_libc "${ROOTDIR}"
63
64 info "Cleaning excess files ... "
65 sudo rm -rf "${ROOTDIR}"/var "${ROOTDIR}"/usr/lib*/gconv/ \
66 "${ROOTDIR}"/sbin/ldconfig "${ROOTDIR}"/boot "${ROOTDIR}"/lib/firmware
67 # Remove empty directories from the rootfs.
68 sudo find "${ROOTDIR}"/ -type d -depth -exec rmdir {} + 2>/dev/null || :
69
70 info "Creating top level dirs and socket dirs ... "
71 sudo mkdir -p "${ROOTDIR}"/{dev,proc,root,sys,home/user,run,tmp,var}
72
73 info "Creating container mounts ..."
74 sudo mkdir -p "${ROOTDIR}"/mnt/{container_rootfs,container_private}
75
76 info "Installing container pubkey ..."
77 "${VBOOT_SIGNING_DIR}"/insert_container_publickey.sh \
78 "${ROOTDIR}" \
79 "${VBOOT_DEVKEYS_DIR}"/cros-oci-container-pub.pem
80
81 info "Generating squashfs file ... "
82 local args=(
83 -all-root
84 -noappend
85 )
86 local img="${OUTPUT_DIR}/rootfs${image_suffix}.bin"
87 sudo mksquashfs "${ROOTDIR}" "${img}" "${args[@]}"
88 sudo chown $(id -u):$(id -g) "${img}"
89
90 info "Copying in kernel ..."
91 cp /build/"${FLAGS_board}"/boot/vmlinuz \
92 "${OUTPUT_DIR}/termina-kernel${image_suffix}.bin"
93
94 info "Cleaning up ... "
95 sudo rm -rf "${ROOTDIR}"
96}
97
98run_emerge() {
99 emerge-${BOARD} \
100 --quiet --jobs ${NUM_JOBS} \
101 --usepkgonly \
102 "$@"
103}
104
105# Emerge with root deps.
106install_with_root_deps() {
107 local root_dir="$1"
108 shift
109 info "Installing '$*' with root deps ... "
110 run_emerge --root="${root_dir}" "$@" --root-deps=rdeps
111}
112
113main() {
114 OVERLAY_CHROMEOS_DIR="${SRC_ROOT}/third_party/chromiumos-overlay/chromeos"
115 . "${OVERLAY_CHROMEOS_DIR}/config/chromeos_version.sh" || exit 1
116 . "${BUILD_LIBRARY_DIR}/board_options.sh" || exit 1
117 . "${BUILD_LIBRARY_DIR}/base_image_util.sh" || exit 1
118 . "${BUILD_LIBRARY_DIR}/build_image_util.sh" || exit 1
119
120 local image_name="${FLAGS_board}"
121 info "Building '${image_name}' ..."
122 build_vm_image "${image_name}" "${IMAGE_TYPE_BASE}"
123
124 if [[ ${FLAGS_dev} -eq ${FLAGS_true} ]]; then
125 info "Building '${image_name}-dev' ..."
126 build_vm_image "${image_name}-dev" "${IMAGE_TYPE_DEV}"
127 fi
128
129 if [[ ${FLAGS_test} -eq ${FLAGS_true} ]]; then
130 info "Building '${image_name}-test' ..."
131 build_vm_image "${image_name}-test" "${IMAGE_TYPE_TEST}"
132 fi
133
134 # Set up symlink to latest image directory.
135 LINK_NAME="${FLAGS_output_root}/${BOARD}/latest"
136 ln -sfT $(basename ${OUTPUT_DIR}) ${LINK_NAME}
137}
138
139main "$@"