blob: 2b058c3b18b02926960eebc4d21a119fe3a3fc2d [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."
Thiago Goncales5ad4ca02013-07-12 10:55:11 -070019DEFINE_boolean usepkgonly "${FLAGS_FALSE}" \
20 "Only use binary packages to bootstrap; abort if any are missing."
Brian Harringcb782242011-12-13 19:48:44 -080021DEFINE_boolean noworkon "${FLAGS_FALSE}" \
22 "Don't force-build workon packages."
David James855afb72012-03-14 20:04:59 -070023DEFINE_boolean showoutput "${FLAGS_FALSE}" \
24 "Show all output from parallel_emerge."
25DEFINE_boolean withautotest "${FLAGS_TRUE}" \
26 "Build autotest client code."
Bertrand SIMONNET2f6aaf22015-02-09 15:49:05 -080027DEFINE_boolean withdebugsymbols "${FLAGS_FALSE}" \
Bertrand SIMONNETc7a46e22014-12-11 15:58:11 -080028 "Install the debug symbols for all packages"
Chris Ching4bc95a12016-11-22 13:44:13 -070029DEFINE_boolean withevents "${FLAGS_FALSE}" \
30 "Generate events during parallel_emerge step"
31DEFINE_string eventfile "${DEFAULT_EVENT_FILE}" \
32 "Define the file that event logs will be written."
Gregory Meinkeb0f0adc2018-04-17 12:02:28 -060033DEFINE_boolean withrevdeps "${FLAGS_TRUE}" \
Gregory Meinke0766df42018-08-23 11:36:12 -060034 "Calculate reverse dependencies on changed ebuilds."
Mike Frysinger38653b02019-10-04 13:56:29 -040035DEFINE_boolean autosetgov "${FLAGS_FALSE}" \
36 "Automatically set cpu governor to 'performance'."
Thiago Goncales5ad4ca02013-07-12 10:55:11 -070037
38# The --board_root flag specifies the environment variables ROOT and PKGDIR.
39# This allows fetching and emerging of all packages to specified board_root.
40# Note that --board_root will setup the board normally in /build/$BOARD, if it's
41# not setup yet. It also expects the toolchain to already be installed in the
42# board_root. --usepkgonly and --norebuild are required, because building is not
43# supported when board_root is set.
44# enforce this)."
45DEFINE_string board_root "" \
46 "Emerge packages to board_root."
David James855afb72012-03-14 20:04:59 -070047
Mike Frysinger76452ba2012-09-13 22:45:34 -040048FLAGS_HELP="usage: $(basename $0) [flags] [packages]
David James855afb72012-03-14 20:04:59 -070049
50build_packages updates the set of binary packages needed by Chrome OS. It will
51cross compile all packages that have been updated into the given target's root
52and build binary packages as a side-effect. The output packages will be picked
53up by the build_image script to put together a bootable Chrome OS image.
54
Mike Frysinger76452ba2012-09-13 22:45:34 -040055If [packages] are specified, only build those specific packages (and any
56dependencies they might need).
57
David James855afb72012-03-14 20:04:59 -070058For the fastest builds, use --nowithautotest --noworkon.
59"
David James855afb72012-03-14 20:04:59 -070060
61# The following options are advanced options, only available to those willing
62# to read the source code. They are not shown in help output, since they are
63# not needed for the typical developer workflow.
Ryan Cuieb4595f2012-12-17 14:28:42 -080064DEFINE_string accept_licenses "" \
65 "Licenses to append to the accept list."
David James855afb72012-03-14 20:04:59 -070066DEFINE_integer jobs -1 \
67 "How many packages to build in parallel at maximum."
68DEFINE_boolean norebuild "${FLAGS_FALSE}" \
69 "Don't automatically rebuild dependencies."
Mike Frysinger839e82a2012-03-01 14:22:10 -050070DEFINE_boolean skip_chroot_upgrade "${FLAGS_FALSE}" \
71 "Don't run the chroot upgrade automatically; use with care."
David James855afb72012-03-14 20:04:59 -070072DEFINE_boolean skip_toolchain_update "${FLAGS_FALSE}" \
73 "Don't update toolchain automatically."
74DEFINE_boolean withdev "${FLAGS_TRUE}" \
75 "Build useful developer friendly utilities."
76DEFINE_boolean withdebug "${FLAGS_TRUE}" \
77 "Build debug versions of Chromium-OS-specific packages."
78DEFINE_boolean withfactory "${FLAGS_TRUE}" \
79 "Build factory installer."
80DEFINE_boolean withtest "${FLAGS_TRUE}" \
81 "Build packages required for testing."
Aviv Keshet8aa379b2016-02-29 10:00:05 -080082DEFINE_boolean buildretry "${FLAGS_TRUE}" \
83 "Retry failed packages."
Brian Harringcb782242011-12-13 19:48:44 -080084
David James17c622a2012-03-07 09:34:08 -080085# The --reuse_pkgs_from_local_boards flag tells Portage to share binary
86# packages between boards that are built locally, so that the total time
87# required to build several boards is reduced. This flag is only useful
88# when you are not able to use remote binary packages, since remote binary
89# packages are usually more up to date than anything you have locally.
Hidehiko Abe7a41d342017-03-29 21:19:16 +090090DEFINE_boolean reuse_pkgs_from_local_boards "${FLAGS_FALSE}" \
David James17c622a2012-03-07 09:34:08 -080091 "Bootstrap from local packages instead of remote packages."
92
Hidehiko Abe7a41d342017-03-29 21:19:16 +090093# --run_goma option is designed to be used on bots.
94# If you're trying to build pacakges with goma in your local dev env, this is
95# *not* the option you're looking for. Please see comments below.
96# This option; 1) starts goma, 2) builds packages (expecting that goma is
97# used), then 3) stops goma explicitly.
98# 3) is a request from the goma team, so that stats/logs can be taken.
99# Note: GOMA_DIR and GOMA_SERVICE_ACCOUNT_JSON_FILE are expected to be passed
100# via env var.
101#
102# In local dev env cases, compiler_proxy is expected to keep running.
103# In such a case;
104# $ python ${GOMA_DIR}/goma_ctl.py ensure_start
105# $ ./build_packages (... and options without --run_goma ...)
106# is an expected commandline sequence. If you set --run_goma flag while
107# compiler_proxy is already running, the existing compiler_proxy will be
108# stopped.
109DEFINE_boolean run_goma "${FLAGS_FALSE}" \
110 "If set to true, (re)starts goma, builds packages, and then stops goma."
111
Brian Harringcb782242011-12-13 19:48:44 -0800112# Parse command line
Brian Harringcb782242011-12-13 19:48:44 -0800113FLAGS "$@" || exit 1
114eval set -- "${FLAGS_ARGV}"
Brian Harringcb782242011-12-13 19:48:44 -0800115
116# Die on any errors.
Brian Harring7f175a52012-03-02 05:37:00 -0800117switch_to_strict_mode
Brian Harringcb782242011-12-13 19:48:44 -0800118
119# Right now build_packages has to be run from scripts/
120. ${SRC_ROOT}/third_party/chromiumos-overlay/chromeos/config/chromeos_version.sh
121
Mike Frysinger38653b02019-10-04 13:56:29 -0400122# On some systems, powersave can take a long time to ramp up. Inform the user
123# so they can get faster builds. https://crbug.com/1008932
124if grep -qs powersave \
125 /sys/devices/system/cpu/cpufreq/policy*/scaling_governor; then
126 # Make sure we can actually support "performance".
127 if grep -qs performance \
128 /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors; then
129 if [[ "${FLAGS_autosetgov}" -eq "${FLAGS_TRUE}" ]]; then
130 info "Temporarily setting cpu governor to 'performance'"
131 trap "sudo cpupower -c all frequency-set -g powersave >&/dev/null" EXIT
132 sudo cpupower -c all frequency-set -g performance >&/dev/null
133 else
134 warn "Current CPU governor set to 'powersave' which can slow down builds."
135 warn "Use --autosetgov to automatically (and temporarily) switch to" \
136 "'performance'."
137 fi
138 fi
139fi
140
Brian Harringcb782242011-12-13 19:48:44 -0800141if [[ -z "${FLAGS_board}" ]]; then
142 echo "Error: --board is required."
143 exit 1
144fi
145
Mike Frysinger4114c792012-09-13 22:33:12 -0400146# Before we can run any tools, we need to update chroot or setup_board.
147UPDATE_ARGS=()
Ryan Cuieb4595f2012-12-17 14:28:42 -0800148if [[ -n ${FLAGS_accept_licenses} ]]; then
Alex Kleind65766f2019-01-11 14:57:34 -0700149 UPDATE_ARGS+=( --accept-licenses "${FLAGS_accept_licenses}" )
Ryan Cuieb4595f2012-12-17 14:28:42 -0800150fi
Mike Frysinger4114c792012-09-13 22:33:12 -0400151if [ "${FLAGS_usepkg}" -eq "${FLAGS_TRUE}" ]; then
152 UPDATE_ARGS+=( --usepkg )
153else
154 UPDATE_ARGS+=( --nousepkg )
155fi
156if [[ "${FLAGS_jobs}" -ne -1 ]]; then
157 UPDATE_ARGS+=( --jobs=${FLAGS_jobs} )
158fi
159if [ "${FLAGS_reuse_pkgs_from_local_boards}" -eq "${FLAGS_TRUE}" ]; then
Alex Kleind65766f2019-01-11 14:57:34 -0700160 UPDATE_ARGS+=( --reuse-pkgs-from-local-boards )
Mike Frysinger4114c792012-09-13 22:33:12 -0400161fi
162if [ "${FLAGS_skip_toolchain_update}" -eq "${FLAGS_TRUE}" ]; then
Alex Kleind65766f2019-01-11 14:57:34 -0700163 UPDATE_ARGS+=( --skip-toolchain-update )
Mike Frysinger4114c792012-09-13 22:33:12 -0400164fi
165if [ "${FLAGS_skip_chroot_upgrade}" -eq "${FLAGS_TRUE}" ]; then
Alex Kleind65766f2019-01-11 14:57:34 -0700166 UPDATE_ARGS+=( --skip-chroot-upgrade )
Mike Frysinger4114c792012-09-13 22:33:12 -0400167fi
Bertrand SIMONNET10ede912014-10-09 16:21:13 -0700168if [[ -n ${FLAGS_board_root} ]]; then
Alex Kleind65766f2019-01-11 14:57:34 -0700169 UPDATE_ARGS+=( --board-root "${FLAGS_board_root}" )
Bertrand SIMONNET10ede912014-10-09 16:21:13 -0700170fi
Mike Frysinger4114c792012-09-13 22:33:12 -0400171
Alex Kleind65766f2019-01-11 14:57:34 -0700172setup_board --quiet --board=${FLAGS_board} "${UPDATE_ARGS[@]}"
Mike Frysinger4114c792012-09-13 22:33:12 -0400173
Chris Masonebbccc242014-02-08 16:23:53 -0800174sudo_clear_shadow_locks "/build/${FLAGS_board}"
Ned Nguyen9af21f52019-04-05 11:30:52 -0600175PORTAGE_BINHOST=$(portageq-${FLAGS_board} envvar 'PORTAGE_BINHOST')
176info "PORTAGE_BINHOST: ${PORTAGE_BINHOST}"
177
Chris Masonebbccc242014-02-08 16:23:53 -0800178
Mike Frysinger4114c792012-09-13 22:33:12 -0400179# Setup all the emerge command/flags.
David James886f2c32014-02-26 20:38:04 -0800180EMERGE_FLAGS=( -uDNv --backtrack=30 --select --newrepo )
Mike Frysinger4114c792012-09-13 22:33:12 -0400181
Bertrand SIMONNET4dda4f52015-03-19 13:40:58 -0700182EMERGE_CMD=(
183 "${CHROMITE_BIN}/parallel_emerge"
184 --board=${FLAGS_board}
185)
186
Aviv Keshet8aa379b2016-02-29 10:00:05 -0800187if [[ "${FLAGS_buildretry}" -eq "${FLAGS_FALSE}" ]]; then
188 EMERGE_CMD+=( --retries=0 )
189fi
Brian Harring17c1fe82012-12-05 21:12:31 -0800190
Mike Frysinger4114c792012-09-13 22:33:12 -0400191EMERGE_CMD+=( ${EXTRA_BOARD_FLAGS} )
Brian Harringcb782242011-12-13 19:48:44 -0800192
David James17c622a2012-03-07 09:34:08 -0800193if [[ "${FLAGS_usepkg}" -eq "${FLAGS_TRUE}" ||
Thiago Goncales5ad4ca02013-07-12 10:55:11 -0700194 "${FLAGS_reuse_pkgs_from_local_boards}" -eq "${FLAGS_TRUE}" ||
195 "${FLAGS_usepkgonly}" -eq "${FLAGS_TRUE}" ]]; then
Brian Harringcb782242011-12-13 19:48:44 -0800196 # Use binary packages. Include all build-time dependencies,
197 # so as to avoid unnecessary differences between source
198 # and binary builds.
Thiago Goncales5ad4ca02013-07-12 10:55:11 -0700199 EMERGE_FLAGS+=( --getbinpkg --with-bdeps y )
200 if [[ ${FLAGS_usepkgonly} -eq ${FLAGS_TRUE} ]]; then
201 EMERGE_FLAGS+=( --usepkgonly )
202 else
203 EMERGE_FLAGS+=( --usepkg )
204 fi
Brian Harringcb782242011-12-13 19:48:44 -0800205fi
206
207if [[ "${FLAGS_jobs}" -ne -1 ]]; then
Mike Frysinger4114c792012-09-13 22:33:12 -0400208 EMERGE_FLAGS+=( --jobs=${FLAGS_jobs} )
209fi
210
211if [[ "${FLAGS_norebuild}" -eq "${FLAGS_FALSE}" ]]; then
Chris McDonald00dcd722019-10-17 13:53:28 -0600212 EMERGE_FLAGS+=( --rebuild-if-new-rev )
Mike Frysinger4114c792012-09-13 22:33:12 -0400213fi
Bertrand SIMONNET4dda4f52015-03-19 13:40:58 -0700214if [[ "${FLAGS_showoutput}" -eq "${FLAGS_TRUE}" ]]; then
Mike Frysinger4114c792012-09-13 22:33:12 -0400215 EMERGE_FLAGS+=( --show-output )
Brian Harringcb782242011-12-13 19:48:44 -0800216fi
217
218if [[ "${FLAGS_withdebug}" -eq "${FLAGS_FALSE}" ]]; then
219 export USE="${USE} -cros-debug"
220fi
221
Chris Ching4bc95a12016-11-22 13:44:13 -0700222# TODO Handle case where passed default value, but events not enabled
223if [[ "${FLAGS_eventfile}" != "${DEFAULT_EVENT_FILE}" ]]; then
224 FLAGS_withevents="${FLAGS_TRUE}"
225fi
226
227if [[ "${FLAGS_withevents}" -eq "${FLAGS_TRUE}" ]]; then
228 mkdir -p "$(dirname $FLAGS_eventfile)"
229 EMERGE_FLAGS+=( "--eventlogfile=${FLAGS_eventfile}" )
230fi
231
Mike Frysinger4114c792012-09-13 22:33:12 -0400232# Figure out which packages we should be building.
Mike Frysinger76452ba2012-09-13 22:45:34 -0400233PACKAGES=( "$@" )
Daniel Wangaf4d0012015-07-17 11:52:05 -0700234FORCE_LOCAL_BUILD_PKGS=()
Mike Frysinger76452ba2012-09-13 22:45:34 -0400235if [[ $# -eq 0 ]]; then
Mike Frysinger22621952014-04-01 17:41:20 -0400236 PACKAGES=( virtual/target-os )
Mike Frysinger76452ba2012-09-13 22:45:34 -0400237 if [[ "${FLAGS_withdev}" -eq "${FLAGS_TRUE}" ]]; then
Mike Frysingerde399282014-04-15 18:26:04 -0400238 PACKAGES+=( virtual/target-os-dev )
Mike Frysinger76452ba2012-09-13 22:45:34 -0400239 fi
240 if [[ "${FLAGS_withfactory}" -eq "${FLAGS_TRUE}" ]]; then
Hung-Te Lin9b43ced2016-01-14 20:29:47 +0800241 PACKAGES+=( virtual/target-os-factory )
242 PACKAGES+=( virtual/target-os-factory-shim )
Mike Frysinger76452ba2012-09-13 22:45:34 -0400243 fi
244 if [[ "${FLAGS_withtest}" -eq "${FLAGS_TRUE}" ]]; then
Mike Frysinger52669432014-05-05 14:34:09 -0400245 PACKAGES+=( virtual/target-os-test )
Daniel Wangaf4d0012015-07-17 11:52:05 -0700246 # chromeos-ssh-testkeys may generate ssh keys if the right USE flag is set.
247 # We force rebuilding this package from source every time, so that
248 # consecutive builds don't share ssh keys.
249 FORCE_LOCAL_BUILD_PKGS+=( chromeos-base/chromeos-ssh-testkeys )
Mike Frysinger76452ba2012-09-13 22:45:34 -0400250 fi
251 if [[ "${FLAGS_withautotest}" -eq "${FLAGS_TRUE}" ]]; then
252 PACKAGES+=( chromeos-base/autotest-all )
253 fi
Brian Harringcb782242011-12-13 19:48:44 -0800254fi
255
Chris McDonaldac5d8632019-10-23 15:55:45 -0600256info "Rebuilding Portage cache"
257# Before running any emerge operations, regenerate the Portage dependency cache
258# in parallel.
259egen_jobs=${FLAGS_jobs}
260if [[ ${egen_jobs} -eq -1 ]]; then
261 egen_jobs=$(getconf _NPROCESSORS_ONLN)
262fi
263
264egencache --jobs "${egen_jobs}" --update-pkg-desc-index --repo chromiumos &
265egencache --jobs "${egen_jobs}" --update-pkg-desc-index --repo portage-stable
266wait $!
267
Brian Harringcb782242011-12-13 19:48:44 -0800268# Verify that all packages can be emerged from scratch, without any
269# backtracking. Only print the output if this step fails.
Mike Frysinger76452ba2012-09-13 22:45:34 -0400270info "Checking package dependencies are correct: ${PACKAGES[*]}"
David Jamesab9ca212012-11-06 11:06:07 -0800271if ! OUTPUT=$(emerge-${FLAGS_board} -pe --backtrack=0 \
272 "${PACKAGES[@]}" 2>&1); then
Brian Harringcb782242011-12-13 19:48:44 -0800273 printf "%s\n" "${OUTPUT}"
Brian Harring7f175a52012-03-02 05:37:00 -0800274 die_notrace "emerge detected broken ebuilds. See error message above."
Brian Harringcb782242011-12-13 19:48:44 -0800275fi
276
Mike Frysinger4114c792012-09-13 22:33:12 -0400277# Build cros_workon packages when they are changed.
278CROS_WORKON_PKGS=()
279if [ "${FLAGS_noworkon}" -eq "${FLAGS_FALSE}" ]; then
280 LIST_MODIFIED_PACKAGES="${CHROMITE_BIN}/cros_list_modified_packages"
Jason D. Clinton321e2f82017-08-09 16:21:23 -0600281 MODIFIED_PACKAGES=( $("${LIST_MODIFIED_PACKAGES}" --board=${FLAGS_board}) )
Gregory Meinke7851ece2018-05-09 13:34:06 -0600282 info "cros_workon modified packages '${MODIFIED_PACKAGES[*]}' detected"
Jason D. Clinton321e2f82017-08-09 16:21:23 -0600283 CROS_WORKON_PKGS+=( "${MODIFIED_PACKAGES[@]}" )
Mike Frysinger4114c792012-09-13 22:33:12 -0400284
David James4941c6b2014-02-03 16:24:59 -0800285 # TODO(anush): Make chrome a fake cros-workon package.
286 if [[ -n "${CHROME_ORIGIN}" ]]; then
287 CROS_WORKON_PKGS+=( chromeos-base/chromeos-chrome )
288 fi
Mike Frysinger4114c792012-09-13 22:33:12 -0400289fi
290
Daniel Wangaf4d0012015-07-17 11:52:05 -0700291# cros_workon packages always have to be rebuilt.
Daniel Wang491f42a2015-08-20 12:29:59 -0700292FORCE_LOCAL_BUILD_PKGS+=( "${CROS_WORKON_PKGS[@]}" )
Daniel Wangaf4d0012015-07-17 11:52:05 -0700293
Gregory Meinkeb0f0adc2018-04-17 12:02:28 -0600294if [[ -n "${FLAGS_board_root}" ]]; then
295 export ROOT="${FLAGS_board_root}"
296 export PORTAGE_CONFIGROOT="${ROOT}"
297 export SYSROOT="${ROOT}"
298 export PKGDIR="${ROOT}"/packages
299fi
300
301# Temporarily modify the emerge flags so we can calculate the revdeps
302# on the modified packages.
Gregory Meinke0766df42018-08-23 11:36:12 -0600303if [[ "${FLAGS_withrevdeps}" -eq "${FLAGS_TRUE}" ]]; then
Yves Arrouyec16e45e2018-08-31 08:37:15 -0700304 info "starting reverse dependency calculations ..."
Gregory Meinke0766df42018-08-23 11:36:12 -0600305 SIM_EMERGE_FLAGS=( "${EMERGE_FLAGS[@]}" --pretend --columns )
Gregory Meinkeee71dd12018-07-09 12:42:25 -0600306
Gregory Meinke0766df42018-08-23 11:36:12 -0600307 if [[ ${#PACKAGES[@]} -gt 0 ]]; then
308 SIM_EMERGE_FLAGS+=(
309 --reinstall-atoms="${PACKAGES[*]}"
310 --usepkg-exclude="${PACKAGES[*]}"
311 )
312 fi
Gregory Meinkeb0f0adc2018-04-17 12:02:28 -0600313
Gregory Meinke0766df42018-08-23 11:36:12 -0600314 # Calculate only the ebuild changes from the emerge simulation ignoring
315 # the virtual packages and the forced rebuild of autotest-all package.
316 BASE_INSTALL_PKGS=( $( \
317 sudo -E "${EMERGE_CMD[@]}" "${SIM_EMERGE_FLAGS[@]}" "${PACKAGES[@]}" | \
318 sed -n -E '/^\[ebuild /{s:^[^]]+\] +::;s: .*::;p}' | \
319 grep -v -e '^virtual/' -e '^chromeos-base/autotest-all' | sort -u ) )
Gregory Meinkeb0f0adc2018-04-17 12:02:28 -0600320
Gregory Meinke0766df42018-08-23 11:36:12 -0600321 MOD_PKGS=()
322 if [[ "${#BASE_INSTALL_PKGS[@]}" -gt 0 ]]; then
323 info "New packages being installed: ${BASE_INSTALL_PKGS[*]}."
Gregory Meinkeb0f0adc2018-04-17 12:02:28 -0600324 # Convert specific versions into base package names
325 MOD_PKGS+=( $(\
Gregory Meinke0766df42018-08-23 11:36:12 -0600326 equery-${FLAGS_board} list -p -o --format='$category/$name' \
327 "${BASE_INSTALL_PKGS[@]}" | sort -u ) )
Mike Frysinger5a11e872018-09-05 16:29:02 -0400328 # Remove Chrome as rebuilding it is expensive and almost never makes sense.
329 # Ignore grep exit status in case chromeos-chrome is the only package.
Gregory Meinke0766df42018-08-23 11:36:12 -0600330 MOD_PKGS=( $(printf '%s\n' "${MOD_PKGS[@]}" | \
Mike Frysinger5a11e872018-09-05 16:29:02 -0400331 grep -v 'chromeos-base/chromeos-chrome' || :) )
Gregory Meinkeb0f0adc2018-04-17 12:02:28 -0600332 fi
Gregory Meinkeb0f0adc2018-04-17 12:02:28 -0600333
Gregory Meinke0766df42018-08-23 11:36:12 -0600334 FORCE_LOCAL_BUILD_PKGS+=( "${MOD_PKGS[@]}" )
335
336 if [[ "${#MOD_PKGS[@]}" -gt 0 ]]; then
337 info "calculating reverse dependencies on packages: ${MOD_PKGS[*]}"
338 REV_DEPS=( $(\
339 equery-${FLAGS_board} -q depends --indirect "${MOD_PKGS[@]}" |\
340 awk '{print $1}' | grep -v ^virtual/ | sort -u) )
341 if [[ "${#REV_DEPS[@]}" -gt 0 ]]; then
342 # Convert specific versions into base package names
343 RMOD_PKGS=( $(\
Gregory Meinkeb0f0adc2018-04-17 12:02:28 -0600344 equery-${FLAGS_board} -q list -p -o --format='$category/$name' \
Gregory Meinke0766df42018-08-23 11:36:12 -0600345 "${REV_DEPS[@]}" | sort -u ) )
Mike Frysinger5a11e872018-09-05 16:29:02 -0400346 # Remove Chrome as rebuilding it is expensive and almost never makes
347 # sense. Ignore grep exit status in case chromeos-chrome is the only
348 # package.
Gregory Meinke0766df42018-08-23 11:36:12 -0600349 RMOD_PKGS=( $(printf '%s\n' "${RMOD_PKGS[@]}" | \
Mike Frysinger5a11e872018-09-05 16:29:02 -0400350 grep -v 'chromeos-base/chromeos-chrome' || :) )
Gregory Meinke0766df42018-08-23 11:36:12 -0600351 info "final reverse dependencies that will be rebuilt: ${RMOD_PKGS[*]}"
352 FORCE_LOCAL_BUILD_PKGS+=( "${RMOD_PKGS[@]}" )
353 fi
Gregory Meinkeb0f0adc2018-04-17 12:02:28 -0600354 fi
Gregory Meinke0766df42018-08-23 11:36:12 -0600355fi # end FLAGS_withrevdeps
Gregory Meinkeb0f0adc2018-04-17 12:02:28 -0600356
Daniel Wangaf4d0012015-07-17 11:52:05 -0700357if [[ ${#FORCE_LOCAL_BUILD_PKGS[@]} -gt 0 ]]; then
Mike Frysinger4114c792012-09-13 22:33:12 -0400358 EMERGE_FLAGS+=(
Daniel Wangaf4d0012015-07-17 11:52:05 -0700359 --reinstall-atoms="${FORCE_LOCAL_BUILD_PKGS[*]}"
360 --usepkg-exclude="${FORCE_LOCAL_BUILD_PKGS[*]}"
Mike Frysinger4114c792012-09-13 22:33:12 -0400361 )
David James710a7d12011-12-21 15:57:02 -0800362fi
Matt Tennant298f61a2012-06-25 21:54:33 -0700363
Mike Frysinger76452ba2012-09-13 22:45:34 -0400364info "Merging board packages now"
Matt Tennant298f61a2012-06-25 21:54:33 -0700365(
Hidehiko Abe7a41d342017-03-29 21:19:16 +0900366 # Support goma on bots. This has to run in subshell, otherwise EXIT trap
367 # handler is overwritten.
368 if [[ "${FLAGS_run_goma}" -eq "${FLAGS_TRUE}" ]]; then
369 info "Starting goma compiler_proxy."
370 goma_ctl="${GOMA_DIR:-${HOME}/goma}/goma_ctl.py"
Mike Frysingeraa84e432019-09-24 14:06:27 -0400371 # TODO(crbug.com/1007384): Stop forcing Python 2.
372 EPYTHON="python2" "${goma_ctl}" restart
373 trap "EPYTHON=python2 '${goma_ctl}' stop" EXIT
Hidehiko Abe7a41d342017-03-29 21:19:16 +0900374 fi
375
Chris McDonald3b359902019-08-12 13:02:12 -0600376 sudo -E "${EMERGE_CMD[@]}" "${EMERGE_FLAGS[@]}" "${PACKAGES[@]}"
Matt Tennant298f61a2012-06-25 21:54:33 -0700377)
378
Brian Harringcb782242011-12-13 19:48:44 -0800379echo "Builds complete"
Bertrand SIMONNETc7a46e22014-12-11 15:58:11 -0800380
381if [[ ${FLAGS_withdebugsymbols} -eq ${FLAGS_TRUE} ]]; then
382 info "fetching the debug symbols"
Mike Frysinger66accd22017-09-13 03:50:30 -0400383 sudo -E "${CHROMITE_BIN}/cros_install_debug_syms" \
Bertrand SIMONNETc7a46e22014-12-11 15:58:11 -0800384 "--board=${FLAGS_board}" "--all"
385fi
386
Matt Tennant298f61a2012-06-25 21:54:33 -0700387command_completed
Brian Harringcb782242011-12-13 19:48:44 -0800388echo "Done"