blob: 49365c4d2c8be95cc23bb5f66016d0298197f8a8 [file] [log] [blame]
Brian Harringcb782242011-12-13 19:48:44 -08001#!/bin/bash
2
3# Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
4# Use of this source code is governed by a BSD-style license that can be
5# found in the LICENSE file.
6
David James0b1baf62012-03-15 09:26:23 -07007. "$(dirname "$0")/common.sh" || exit 1
Brian Harringcb782242011-12-13 19:48:44 -08008
9# Script must run inside the chroot
10restart_in_chroot_if_needed "$@"
11
Zdenek Behan05780782012-05-18 03:07:28 +020012assert_not_root_user
13
David James855afb72012-03-14 20:04:59 -070014# Developer-visible flags.
Brian Harringcb782242011-12-13 19:48:44 -080015DEFINE_string board "${DEFAULT_BOARD}" \
16 "The board to build packages for."
Brian Harringcb782242011-12-13 19:48:44 -080017DEFINE_boolean usepkg "${FLAGS_TRUE}" \
18 "Use binary packages to bootstrap when possible."
Brian Harringcb782242011-12-13 19:48:44 -080019DEFINE_boolean noworkon "${FLAGS_FALSE}" \
20 "Don't force-build workon packages."
David James855afb72012-03-14 20:04:59 -070021DEFINE_boolean showoutput "${FLAGS_FALSE}" \
22 "Show all output from parallel_emerge."
23DEFINE_boolean withautotest "${FLAGS_TRUE}" \
24 "Build autotest client code."
25
Mike Frysinger76452ba2012-09-13 22:45:34 -040026FLAGS_HELP="usage: $(basename $0) [flags] [packages]
David James855afb72012-03-14 20:04:59 -070027
28build_packages updates the set of binary packages needed by Chrome OS. It will
29cross compile all packages that have been updated into the given target's root
30and build binary packages as a side-effect. The output packages will be picked
31up by the build_image script to put together a bootable Chrome OS image.
32
Mike Frysinger76452ba2012-09-13 22:45:34 -040033If [packages] are specified, only build those specific packages (and any
34dependencies they might need).
35
David James855afb72012-03-14 20:04:59 -070036For the fastest builds, use --nowithautotest --noworkon.
37"
38show_help_if_requested "$@"
39
40# The following options are advanced options, only available to those willing
41# to read the source code. They are not shown in help output, since they are
42# not needed for the typical developer workflow.
43DEFINE_boolean fast "${DEFAULT_FAST}" \
44 "Call many emerges in parallel."
45DEFINE_integer jobs -1 \
46 "How many packages to build in parallel at maximum."
47DEFINE_boolean norebuild "${FLAGS_FALSE}" \
48 "Don't automatically rebuild dependencies."
Mike Frysinger839e82a2012-03-01 14:22:10 -050049DEFINE_boolean skip_chroot_upgrade "${FLAGS_FALSE}" \
50 "Don't run the chroot upgrade automatically; use with care."
David James855afb72012-03-14 20:04:59 -070051DEFINE_boolean skip_toolchain_update "${FLAGS_FALSE}" \
52 "Don't update toolchain automatically."
53DEFINE_boolean withdev "${FLAGS_TRUE}" \
54 "Build useful developer friendly utilities."
55DEFINE_boolean withdebug "${FLAGS_TRUE}" \
56 "Build debug versions of Chromium-OS-specific packages."
57DEFINE_boolean withfactory "${FLAGS_TRUE}" \
58 "Build factory installer."
59DEFINE_boolean withtest "${FLAGS_TRUE}" \
60 "Build packages required for testing."
Brian Harringcb782242011-12-13 19:48:44 -080061
David James17c622a2012-03-07 09:34:08 -080062# The --reuse_pkgs_from_local_boards flag tells Portage to share binary
63# packages between boards that are built locally, so that the total time
64# required to build several boards is reduced. This flag is only useful
65# when you are not able to use remote binary packages, since remote binary
66# packages are usually more up to date than anything you have locally.
67DEFINE_boolean reuse_pkgs_from_local_boards $FLAGS_FALSE \
68 "Bootstrap from local packages instead of remote packages."
69
Brian Harringcb782242011-12-13 19:48:44 -080070# Parse command line
Brian Harringcb782242011-12-13 19:48:44 -080071FLAGS "$@" || exit 1
72eval set -- "${FLAGS_ARGV}"
Brian Harringcb782242011-12-13 19:48:44 -080073
74# Die on any errors.
Brian Harring7f175a52012-03-02 05:37:00 -080075switch_to_strict_mode
Brian Harringcb782242011-12-13 19:48:44 -080076
77# Right now build_packages has to be run from scripts/
78. ${SRC_ROOT}/third_party/chromiumos-overlay/chromeos/config/chromeos_version.sh
79
80if [[ -z "${FLAGS_board}" ]]; then
81 echo "Error: --board is required."
82 exit 1
83fi
84
David James4c29c242012-06-06 20:45:18 -070085CHROMITE_BIN="${GCLIENT_ROOT}/chromite/bin"
Mike Frysinger4114c792012-09-13 22:33:12 -040086
87# Before we can run any tools, we need to update chroot or setup_board.
88UPDATE_ARGS=()
89if [ "${FLAGS_fast}" -eq "${FLAGS_TRUE}" ]; then
90 UPDATE_ARGS+=( --fast )
91else
92 UPDATE_ARGS+=( --nofast )
93fi
94if [ "${FLAGS_usepkg}" -eq "${FLAGS_TRUE}" ]; then
95 UPDATE_ARGS+=( --usepkg )
96else
97 UPDATE_ARGS+=( --nousepkg )
98fi
99if [[ "${FLAGS_jobs}" -ne -1 ]]; then
100 UPDATE_ARGS+=( --jobs=${FLAGS_jobs} )
101fi
102if [ "${FLAGS_reuse_pkgs_from_local_boards}" -eq "${FLAGS_TRUE}" ]; then
103 UPDATE_ARGS+=( --reuse_pkgs_from_local_boards )
104fi
105if [ "${FLAGS_skip_toolchain_update}" -eq "${FLAGS_TRUE}" ]; then
106 UPDATE_ARGS+=( --skip_toolchain_update )
107fi
108if [ "${FLAGS_skip_chroot_upgrade}" -eq "${FLAGS_TRUE}" ]; then
109 UPDATE_ARGS+=( --skip_chroot_upgrade )
110fi
111
112"${SCRIPTS_DIR}"/setup_board --quiet --board=${FLAGS_board} "${UPDATE_ARGS[@]}"
113
114# Setup all the emerge command/flags.
115EMERGE_FLAGS=( -uDNv --backtrack=30 --select )
116
Brian Harringcb782242011-12-13 19:48:44 -0800117if [[ "${FLAGS_fast}" -eq "${FLAGS_TRUE}" ]]; then
Mike Frysinger4114c792012-09-13 22:33:12 -0400118 EMERGE_CMD=(
119 "${CHROMITE_BIN}/parallel_emerge"
120 --board=${FLAGS_board}
121 )
122else
123 EMERGE_CMD=( "emerge-${FLAGS_board}" )
Brian Harringcb782242011-12-13 19:48:44 -0800124fi
Mike Frysinger4114c792012-09-13 22:33:12 -0400125EMERGE_CMD+=( ${EXTRA_BOARD_FLAGS} )
Brian Harringcb782242011-12-13 19:48:44 -0800126
David James17c622a2012-03-07 09:34:08 -0800127if [[ "${FLAGS_usepkg}" -eq "${FLAGS_TRUE}" ||
128 "${FLAGS_reuse_pkgs_from_local_boards}" -eq "${FLAGS_TRUE}" ]]; then
Brian Harringcb782242011-12-13 19:48:44 -0800129 # Use binary packages. Include all build-time dependencies,
130 # so as to avoid unnecessary differences between source
131 # and binary builds.
Mike Frysinger4114c792012-09-13 22:33:12 -0400132 EMERGE_FLAGS+=( --getbinpkg --usepkg --with-bdeps y )
Brian Harringcb782242011-12-13 19:48:44 -0800133fi
134
135if [[ "${FLAGS_jobs}" -ne -1 ]]; then
Mike Frysinger4114c792012-09-13 22:33:12 -0400136 EMERGE_FLAGS+=( --jobs=${FLAGS_jobs} )
137fi
138
139if [[ "${FLAGS_norebuild}" -eq "${FLAGS_FALSE}" ]]; then
140 EMERGE_FLAGS+=( --rebuild-if-unbuilt )
141fi
142if [[ "${FLAGS_showoutput}" -eq "${FLAGS_TRUE}" && \
143 "${FLAGS_fast}" -eq "${FLAGS_TRUE}" ]]; then
144 # Only parallel_emerge supports --show-output.
145 EMERGE_FLAGS+=( --show-output )
Brian Harringcb782242011-12-13 19:48:44 -0800146fi
147
148if [[ "${FLAGS_withdebug}" -eq "${FLAGS_FALSE}" ]]; then
149 export USE="${USE} -cros-debug"
150fi
151
Mike Frysinger4114c792012-09-13 22:33:12 -0400152# Figure out which packages we should be building.
Mike Frysinger76452ba2012-09-13 22:45:34 -0400153PACKAGES=( "$@" )
154if [[ $# -eq 0 ]]; then
155 PACKAGES=( chromeos-base/chromeos )
156 if [[ "${FLAGS_withdev}" -eq "${FLAGS_TRUE}" ]]; then
157 PACKAGES+=( chromeos-base/chromeos-dev )
Chris Sosa05385712012-09-11 15:04:41 -0700158 PACKAGES+=( chromeos-base/chromeos-dev-init )
Mike Frysinger76452ba2012-09-13 22:45:34 -0400159 fi
160 if [[ "${FLAGS_withfactory}" -eq "${FLAGS_TRUE}" ]]; then
161 PACKAGES+=( chromeos-base/chromeos-factory )
162 PACKAGES+=( chromeos-base/chromeos-factoryinstall )
163 PACKAGES+=( chromeos-base/factorytest-init )
164 PACKAGES+=( chromeos-base/chromeos-hwid )
165 fi
166 if [[ "${FLAGS_withtest}" -eq "${FLAGS_TRUE}" ]]; then
167 PACKAGES+=( chromeos-base/chromeos-test )
Chris Sosa05385712012-09-11 15:04:41 -0700168 PACKAGES+=( chromeos-base/chromeos-test-init )
Mike Frysinger76452ba2012-09-13 22:45:34 -0400169 fi
170 if [[ "${FLAGS_withautotest}" -eq "${FLAGS_TRUE}" ]]; then
171 PACKAGES+=( chromeos-base/autotest-all )
172 fi
Brian Harringcb782242011-12-13 19:48:44 -0800173fi
174
175# Verify that all packages can be emerged from scratch, without any
176# backtracking. Only print the output if this step fails.
Mike Frysinger76452ba2012-09-13 22:45:34 -0400177info "Checking package dependencies are correct: ${PACKAGES[*]}"
Brian Harringcb782242011-12-13 19:48:44 -0800178if ! OUTPUT=$(emerge-${FLAGS_board} -pe --backtrack=0 ${PACKAGES} 2>&1); then
179 printf "%s\n" "${OUTPUT}"
Brian Harring7f175a52012-03-02 05:37:00 -0800180 die_notrace "emerge detected broken ebuilds. See error message above."
Brian Harringcb782242011-12-13 19:48:44 -0800181fi
182
Mike Frysinger4114c792012-09-13 22:33:12 -0400183# Build cros_workon packages when they are changed.
184CROS_WORKON_PKGS=()
185if [ "${FLAGS_noworkon}" -eq "${FLAGS_FALSE}" ]; then
186 LIST_MODIFIED_PACKAGES="${CHROMITE_BIN}/cros_list_modified_packages"
187 CROS_WORKON_PKGS+=( $("${LIST_MODIFIED_PACKAGES}" --board=${FLAGS_board}) )
Brian Harringcb782242011-12-13 19:48:44 -0800188fi
Mike Frysinger4114c792012-09-13 22:33:12 -0400189
190# TODO(anush): Make chrome a fake cros-workon package.
191if [[ -n "${CHROME_ORIGIN}" ]]; then
192 CROS_WORKON_PKGS+=( chromeos-base/chromeos-chrome )
193fi
194
195if [[ ${#CROS_WORKON_PKGS[@]} -gt 0 ]]; then
196 EMERGE_FLAGS+=(
197 --reinstall-atoms="${CROS_WORKON_PKGS[*]}"
198 --usepkg-exclude="${CROS_WORKON_PKGS[*]}"
199 )
David James710a7d12011-12-21 15:57:02 -0800200fi
Matt Tennant298f61a2012-06-25 21:54:33 -0700201
202# Prepare tmp file to capture emerge output from tee.
203tmpfile=$(mktemp -t tmp.build_packages-emerge.XXXXXX)
204trap "rm -f '${tmpfile}'" EXIT
205
Mike Frysinger76452ba2012-09-13 22:45:34 -0400206info "Merging board packages now"
Matt Tennant298f61a2012-06-25 21:54:33 -0700207(
208 set -o pipefail
Mike Frysinger4114c792012-09-13 22:33:12 -0400209 sudo -E "${EMERGE_CMD[@]}" "${EMERGE_FLAGS[@]}" "${PACKAGES[@]}" | \
Matt Tennant298f61a2012-06-25 21:54:33 -0700210 tee "${tmpfile}"
211)
212
213# Extract total package count from emerge output.
214package_count=$(awk '$0 ~ /^Total: [0-9]+ packages/ { print $2 }' "${tmpfile}")
215rm "${tmpfile}"
216trap - EXIT
Brian Harringcb782242011-12-13 19:48:44 -0800217
218echo "Builds complete"
Matt Tennant298f61a2012-06-25 21:54:33 -0700219EXTRA_COMMAND_STATS[package_count]=${package_count}
220command_completed
Brian Harringcb782242011-12-13 19:48:44 -0800221echo "Done"