blob: e82b663819efe1585cb8bc3535e677ca9dd142cb [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."
Mike Frysingerf4711422019-11-13 18:04:31 -050021DEFINE_boolean workon "${FLAGS_TRUE}" \
22 "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_string eventfile "${DEFAULT_EVENT_FILE}" \
30 "Define the file that event logs will be written."
Gregory Meinkeb0f0adc2018-04-17 12:02:28 -060031DEFINE_boolean withrevdeps "${FLAGS_TRUE}" \
Gregory Meinke0766df42018-08-23 11:36:12 -060032 "Calculate reverse dependencies on changed ebuilds."
Mike Frysinger38653b02019-10-04 13:56:29 -040033DEFINE_boolean autosetgov "${FLAGS_FALSE}" \
34 "Automatically set cpu governor to 'performance'."
Chris McDonald5405a802019-11-12 13:58:38 -070035DEFINE_boolean use_any_chrome "${FLAGS_TRUE}" \
36 "Use any Chrome prebuilt available, even if the prebuilt doesn't match exactly."
Alex Kleinf61b5372020-04-16 17:02:33 -060037DEFINE_boolean cleanbuild "${FLAGS_FALSE}" \
38 "Perform a clean build; delete sysroot if it exists before building."
Alex Klein80abe722020-04-29 11:13:43 -060039DEFINE_boolean internal "${FLAGS_FALSE}" \
40 "Build the internal version of chrome (set the chrome_internal USE flag)."
Thiago Goncales5ad4ca02013-07-12 10:55:11 -070041
42# The --board_root flag specifies the environment variables ROOT and PKGDIR.
43# This allows fetching and emerging of all packages to specified board_root.
44# Note that --board_root will setup the board normally in /build/$BOARD, if it's
45# not setup yet. It also expects the toolchain to already be installed in the
46# board_root. --usepkgonly and --norebuild are required, because building is not
47# supported when board_root is set.
48# enforce this)."
49DEFINE_string board_root "" \
50 "Emerge packages to board_root."
David James855afb72012-03-14 20:04:59 -070051
Mike Frysinger76452ba2012-09-13 22:45:34 -040052FLAGS_HELP="usage: $(basename $0) [flags] [packages]
David James855afb72012-03-14 20:04:59 -070053
54build_packages updates the set of binary packages needed by Chrome OS. It will
55cross compile all packages that have been updated into the given target's root
56and build binary packages as a side-effect. The output packages will be picked
57up by the build_image script to put together a bootable Chrome OS image.
58
Mike Frysinger76452ba2012-09-13 22:45:34 -040059If [packages] are specified, only build those specific packages (and any
60dependencies they might need).
61
David James855afb72012-03-14 20:04:59 -070062For the fastest builds, use --nowithautotest --noworkon.
63"
David James855afb72012-03-14 20:04:59 -070064
65# The following options are advanced options, only available to those willing
66# to read the source code. They are not shown in help output, since they are
67# not needed for the typical developer workflow.
Ryan Cuieb4595f2012-12-17 14:28:42 -080068DEFINE_string accept_licenses "" \
69 "Licenses to append to the accept list."
Allen Webb8bdcfd52021-04-23 16:54:28 -050070DEFINE_boolean eclean "${FLAGS_TRUE}" \
71 "Run eclean to delete old binpkgs."
David James855afb72012-03-14 20:04:59 -070072DEFINE_integer jobs -1 \
73 "How many packages to build in parallel at maximum."
74DEFINE_boolean norebuild "${FLAGS_FALSE}" \
75 "Don't automatically rebuild dependencies."
Mike Frysinger839e82a2012-03-01 14:22:10 -050076DEFINE_boolean skip_chroot_upgrade "${FLAGS_FALSE}" \
77 "Don't run the chroot upgrade automatically; use with care."
Alex Klein1093ad42021-03-19 10:06:13 -060078DEFINE_boolean skip_setup_board "${FLAGS_FALSE}" \
Michael Mortensena07f5a72021-04-09 11:55:59 -060079 "Don't run setup_board. Implies skip_chroot_upgrade and" \
80 "skip_toolchain_update."
David James855afb72012-03-14 20:04:59 -070081DEFINE_boolean skip_toolchain_update "${FLAGS_FALSE}" \
82 "Don't update toolchain automatically."
83DEFINE_boolean withdev "${FLAGS_TRUE}" \
84 "Build useful developer friendly utilities."
85DEFINE_boolean withdebug "${FLAGS_TRUE}" \
86 "Build debug versions of Chromium-OS-specific packages."
87DEFINE_boolean withfactory "${FLAGS_TRUE}" \
88 "Build factory installer."
89DEFINE_boolean withtest "${FLAGS_TRUE}" \
90 "Build packages required for testing."
Alex Klein32d4d4c2021-03-08 16:16:02 -070091DEFINE_boolean expandedbinhosts "${FLAGS_FALSE}" \
92 "Allow expanded binhost inheritance."
Brian Harringcb782242011-12-13 19:48:44 -080093
David James17c622a2012-03-07 09:34:08 -080094# The --reuse_pkgs_from_local_boards flag tells Portage to share binary
95# packages between boards that are built locally, so that the total time
96# required to build several boards is reduced. This flag is only useful
97# when you are not able to use remote binary packages, since remote binary
98# packages are usually more up to date than anything you have locally.
Hidehiko Abe7a41d342017-03-29 21:19:16 +090099DEFINE_boolean reuse_pkgs_from_local_boards "${FLAGS_FALSE}" \
David James17c622a2012-03-07 09:34:08 -0800100 "Bootstrap from local packages instead of remote packages."
101
Hidehiko Abe7a41d342017-03-29 21:19:16 +0900102# --run_goma option is designed to be used on bots.
103# If you're trying to build pacakges with goma in your local dev env, this is
104# *not* the option you're looking for. Please see comments below.
105# This option; 1) starts goma, 2) builds packages (expecting that goma is
106# used), then 3) stops goma explicitly.
107# 3) is a request from the goma team, so that stats/logs can be taken.
108# Note: GOMA_DIR and GOMA_SERVICE_ACCOUNT_JSON_FILE are expected to be passed
109# via env var.
110#
111# In local dev env cases, compiler_proxy is expected to keep running.
112# In such a case;
113# $ python ${GOMA_DIR}/goma_ctl.py ensure_start
114# $ ./build_packages (... and options without --run_goma ...)
115# is an expected commandline sequence. If you set --run_goma flag while
116# compiler_proxy is already running, the existing compiler_proxy will be
117# stopped.
118DEFINE_boolean run_goma "${FLAGS_FALSE}" \
119 "If set to true, (re)starts goma, builds packages, and then stops goma."
120
Brian Harringcb782242011-12-13 19:48:44 -0800121# Parse command line
Brian Harringcb782242011-12-13 19:48:44 -0800122FLAGS "$@" || exit 1
123eval set -- "${FLAGS_ARGV}"
Brian Harringcb782242011-12-13 19:48:44 -0800124
125# Die on any errors.
Brian Harring7f175a52012-03-02 05:37:00 -0800126switch_to_strict_mode
Brian Harringcb782242011-12-13 19:48:44 -0800127
Alex Kleindfa7bfa2020-04-20 12:55:22 -0600128# Chrome packages that need to be treated the same. These are the chrome and
129# chrome follow-on packages that share the same version as chrome and are
130# updated in lock step.
131CHROME_PACKAGES=(
132 "chromeos-base/chromeos-chrome"
133 "chromeos-base/chrome-icu"
134)
135
Alex Klein80abe722020-04-29 11:13:43 -0600136if [[ "${FLAGS_internal}" -eq "${FLAGS_TRUE}" ]]; then
137 export USE="${USE} chrome_internal"
138fi
139
Alex Klein12b97722019-12-09 14:25:33 -0700140# This is a temporary measure to help the goma team check the configs while
141# they transition their backend service.
142# TODO(crbug.com/1032290): Delete after the goma RBE transition is complete.
143if [[ "${FLAGS_run_goma}" -eq "${FLAGS_TRUE}" ]]; then
144 info "Environment:"
145 env
146 info "End Environment."
147fi
148
Brian Harringcb782242011-12-13 19:48:44 -0800149# Right now build_packages has to be run from scripts/
150. ${SRC_ROOT}/third_party/chromiumos-overlay/chromeos/config/chromeos_version.sh
151
Mike Frysinger38653b02019-10-04 13:56:29 -0400152# On some systems, powersave can take a long time to ramp up. Inform the user
153# so they can get faster builds. https://crbug.com/1008932
154if grep -qs powersave \
155 /sys/devices/system/cpu/cpufreq/policy*/scaling_governor; then
156 # Make sure we can actually support "performance".
157 if grep -qs performance \
158 /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors; then
159 if [[ "${FLAGS_autosetgov}" -eq "${FLAGS_TRUE}" ]]; then
160 info "Temporarily setting cpu governor to 'performance'"
161 trap "sudo cpupower -c all frequency-set -g powersave >&/dev/null" EXIT
162 sudo cpupower -c all frequency-set -g performance >&/dev/null
163 else
164 warn "Current CPU governor set to 'powersave' which can slow down builds."
165 warn "Use --autosetgov to automatically (and temporarily) switch to" \
166 "'performance'."
167 fi
168 fi
169fi
170
Brian Harringcb782242011-12-13 19:48:44 -0800171if [[ -z "${FLAGS_board}" ]]; then
172 echo "Error: --board is required."
173 exit 1
174fi
175
Alex Klein1093ad42021-03-19 10:06:13 -0600176if [[ "${FLAGS_skip_setup_board}" -eq "${FLAGS_FALSE}" ]]; then
177 # Before we can run any tools, we need to update chroot or setup_board.
178 UPDATE_ARGS=()
179 if [[ -n ${FLAGS_accept_licenses} ]]; then
180 UPDATE_ARGS+=( --accept-licenses "${FLAGS_accept_licenses}" )
181 fi
182 if [ "${FLAGS_usepkg}" -eq "${FLAGS_TRUE}" ]; then
183 UPDATE_ARGS+=( --usepkg )
184 else
185 UPDATE_ARGS+=( --nousepkg )
186 fi
187 if [[ "${FLAGS_jobs}" -ne -1 ]]; then
188 UPDATE_ARGS+=( --jobs=${FLAGS_jobs} )
189 fi
190 if [ "${FLAGS_reuse_pkgs_from_local_boards}" -eq "${FLAGS_TRUE}" ]; then
191 UPDATE_ARGS+=( --reuse-pkgs-from-local-boards )
192 fi
193 if [ "${FLAGS_skip_toolchain_update}" -eq "${FLAGS_TRUE}" ]; then
194 UPDATE_ARGS+=( --skip-toolchain-update )
195 fi
196 if [ "${FLAGS_skip_chroot_upgrade}" -eq "${FLAGS_TRUE}" ]; then
197 UPDATE_ARGS+=( --skip-chroot-upgrade )
198 fi
199 if [[ -n ${FLAGS_board_root} ]]; then
200 UPDATE_ARGS+=( --board-root "${FLAGS_board_root}" )
201 fi
202 if [ "${FLAGS_cleanbuild}" -eq "${FLAGS_TRUE}" ]; then
203 UPDATE_ARGS+=( --force )
204 fi
205 if [[ "${FLAGS_expandedbinhosts}" -eq "${FLAGS_TRUE}" ]]; then
206 UPDATE_ARGS+=( --more-binhosts )
207 else
208 UPDATE_ARGS+=( --fewer-binhosts )
209 fi
Mike Frysinger4114c792012-09-13 22:33:12 -0400210
Alex Klein1093ad42021-03-19 10:06:13 -0600211 setup_board --quiet --board=${FLAGS_board} "${UPDATE_ARGS[@]}"
212fi
Mike Frysinger4114c792012-09-13 22:33:12 -0400213
Chris Masonebbccc242014-02-08 16:23:53 -0800214sudo_clear_shadow_locks "/build/${FLAGS_board}"
Ned Nguyen9af21f52019-04-05 11:30:52 -0600215PORTAGE_BINHOST=$(portageq-${FLAGS_board} envvar 'PORTAGE_BINHOST')
216info "PORTAGE_BINHOST: ${PORTAGE_BINHOST}"
217
Chris Masonebbccc242014-02-08 16:23:53 -0800218
Mike Frysinger4114c792012-09-13 22:33:12 -0400219# Setup all the emerge command/flags.
Mike Frysinger697ab962019-11-04 20:02:43 -0500220EMERGE_FLAGS=( -uDNv --backtrack=30 --newrepo )
Mike Frysinger4114c792012-09-13 22:33:12 -0400221
Bertrand SIMONNET4dda4f52015-03-19 13:40:58 -0700222EMERGE_CMD=(
223 "${CHROMITE_BIN}/parallel_emerge"
224 --board=${FLAGS_board}
225)
226
Chris McDonald5405a802019-11-12 13:58:38 -0700227if [[ "${FLAGS_use_any_chrome}" -eq "${FLAGS_TRUE}" ]]; then
Alex Kleindfa7bfa2020-04-20 12:55:22 -0600228 for pkg in "${CHROME_PACKAGES[@]}"; do
229 EMERGE_CMD+=( "--force-remote-binary=${pkg}" )
230 done
Chris McDonald5405a802019-11-12 13:58:38 -0700231fi
232
Mike Frysinger4114c792012-09-13 22:33:12 -0400233EMERGE_CMD+=( ${EXTRA_BOARD_FLAGS} )
Brian Harringcb782242011-12-13 19:48:44 -0800234
David James17c622a2012-03-07 09:34:08 -0800235if [[ "${FLAGS_usepkg}" -eq "${FLAGS_TRUE}" ||
Thiago Goncales5ad4ca02013-07-12 10:55:11 -0700236 "${FLAGS_reuse_pkgs_from_local_boards}" -eq "${FLAGS_TRUE}" ||
237 "${FLAGS_usepkgonly}" -eq "${FLAGS_TRUE}" ]]; then
Brian Harringcb782242011-12-13 19:48:44 -0800238 # Use binary packages. Include all build-time dependencies,
239 # so as to avoid unnecessary differences between source
240 # and binary builds.
Thiago Goncales5ad4ca02013-07-12 10:55:11 -0700241 EMERGE_FLAGS+=( --getbinpkg --with-bdeps y )
242 if [[ ${FLAGS_usepkgonly} -eq ${FLAGS_TRUE} ]]; then
243 EMERGE_FLAGS+=( --usepkgonly )
244 else
245 EMERGE_FLAGS+=( --usepkg )
246 fi
Brian Harringcb782242011-12-13 19:48:44 -0800247fi
248
249if [[ "${FLAGS_jobs}" -ne -1 ]]; then
Mike Frysinger4114c792012-09-13 22:33:12 -0400250 EMERGE_FLAGS+=( --jobs=${FLAGS_jobs} )
251fi
252
253if [[ "${FLAGS_norebuild}" -eq "${FLAGS_FALSE}" ]]; then
Chris McDonald00dcd722019-10-17 13:53:28 -0600254 EMERGE_FLAGS+=( --rebuild-if-new-rev )
Mike Frysinger4114c792012-09-13 22:33:12 -0400255fi
Bertrand SIMONNET4dda4f52015-03-19 13:40:58 -0700256if [[ "${FLAGS_showoutput}" -eq "${FLAGS_TRUE}" ]]; then
Mike Frysinger4114c792012-09-13 22:33:12 -0400257 EMERGE_FLAGS+=( --show-output )
Brian Harringcb782242011-12-13 19:48:44 -0800258fi
259
260if [[ "${FLAGS_withdebug}" -eq "${FLAGS_FALSE}" ]]; then
261 export USE="${USE} -cros-debug"
262fi
263
Mike Frysinger4114c792012-09-13 22:33:12 -0400264# Figure out which packages we should be building.
Mike Frysinger76452ba2012-09-13 22:45:34 -0400265PACKAGES=( "$@" )
Alex Kleinbdd2d762020-02-12 11:53:08 -0700266# Force rebuild chromeos-config because it is extremely cheap, and we do not
267# want to reuse stale configs.
268FORCE_LOCAL_BUILD_PKGS=( chromeos-base/chromeos-config )
Mike Frysinger76452ba2012-09-13 22:45:34 -0400269if [[ $# -eq 0 ]]; then
Mike Frysinger22621952014-04-01 17:41:20 -0400270 PACKAGES=( virtual/target-os )
Mike Frysinger76452ba2012-09-13 22:45:34 -0400271 if [[ "${FLAGS_withdev}" -eq "${FLAGS_TRUE}" ]]; then
Mike Frysingerde399282014-04-15 18:26:04 -0400272 PACKAGES+=( virtual/target-os-dev )
Mike Frysinger76452ba2012-09-13 22:45:34 -0400273 fi
274 if [[ "${FLAGS_withfactory}" -eq "${FLAGS_TRUE}" ]]; then
Hung-Te Lin9b43ced2016-01-14 20:29:47 +0800275 PACKAGES+=( virtual/target-os-factory )
276 PACKAGES+=( virtual/target-os-factory-shim )
Mike Frysinger76452ba2012-09-13 22:45:34 -0400277 fi
278 if [[ "${FLAGS_withtest}" -eq "${FLAGS_TRUE}" ]]; then
Mike Frysinger52669432014-05-05 14:34:09 -0400279 PACKAGES+=( virtual/target-os-test )
Daniel Wangaf4d0012015-07-17 11:52:05 -0700280 # chromeos-ssh-testkeys may generate ssh keys if the right USE flag is set.
281 # We force rebuilding this package from source every time, so that
282 # consecutive builds don't share ssh keys.
283 FORCE_LOCAL_BUILD_PKGS+=( chromeos-base/chromeos-ssh-testkeys )
Mike Frysinger76452ba2012-09-13 22:45:34 -0400284 fi
285 if [[ "${FLAGS_withautotest}" -eq "${FLAGS_TRUE}" ]]; then
286 PACKAGES+=( chromeos-base/autotest-all )
287 fi
Brian Harringcb782242011-12-13 19:48:44 -0800288fi
289
Chris McDonaldac5d8632019-10-23 15:55:45 -0600290info "Rebuilding Portage cache"
291# Before running any emerge operations, regenerate the Portage dependency cache
292# in parallel.
Mike Frysinger5cf035f2021-01-26 00:57:46 -0500293info_run "${EMERGE_CMD[@]}" --regen --quiet
Chris McDonaldac5d8632019-10-23 15:55:45 -0600294
Allen Webb8bdcfd52021-04-23 16:54:28 -0500295# Clean out any stale binpkgs we've accumulated. This is done immediately after
296# regenerating the cache in case ebuilds have been removed (e.g. from a revert).
297if [[ "${FLAGS_eclean}" -eq "${FLAGS_TRUE}" ]]; then
298 info "Cleaning stale binpkgs"
299 info_run "eclean-${FLAGS_board}" packages
300fi
301
Brian Harringcb782242011-12-13 19:48:44 -0800302# Verify that all packages can be emerged from scratch, without any
303# backtracking. Only print the output if this step fails.
Mike Frysinger76452ba2012-09-13 22:45:34 -0400304info "Checking package dependencies are correct: ${PACKAGES[*]}"
David Jamesab9ca212012-11-06 11:06:07 -0800305if ! OUTPUT=$(emerge-${FLAGS_board} -pe --backtrack=0 \
306 "${PACKAGES[@]}" 2>&1); then
Brian Harringcb782242011-12-13 19:48:44 -0800307 printf "%s\n" "${OUTPUT}"
Brian Harring7f175a52012-03-02 05:37:00 -0800308 die_notrace "emerge detected broken ebuilds. See error message above."
Brian Harringcb782242011-12-13 19:48:44 -0800309fi
310
Mike Frysinger4114c792012-09-13 22:33:12 -0400311# Build cros_workon packages when they are changed.
312CROS_WORKON_PKGS=()
Mike Frysingerf4711422019-11-13 18:04:31 -0500313if [ "${FLAGS_workon}" -eq "${FLAGS_TRUE}" ]; then
Mike Frysinger4114c792012-09-13 22:33:12 -0400314 LIST_MODIFIED_PACKAGES="${CHROMITE_BIN}/cros_list_modified_packages"
Jason D. Clinton321e2f82017-08-09 16:21:23 -0600315 MODIFIED_PACKAGES=( $("${LIST_MODIFIED_PACKAGES}" --board=${FLAGS_board}) )
Gregory Meinke7851ece2018-05-09 13:34:06 -0600316 info "cros_workon modified packages '${MODIFIED_PACKAGES[*]}' detected"
Jason D. Clinton321e2f82017-08-09 16:21:23 -0600317 CROS_WORKON_PKGS+=( "${MODIFIED_PACKAGES[@]}" )
Mike Frysinger4114c792012-09-13 22:33:12 -0400318
David James4941c6b2014-02-03 16:24:59 -0800319 # TODO(anush): Make chrome a fake cros-workon package.
320 if [[ -n "${CHROME_ORIGIN}" ]]; then
Alex Kleindfa7bfa2020-04-20 12:55:22 -0600321 CROS_WORKON_PKGS+=( "${CHROME_PACKAGES[@]}" )
David James4941c6b2014-02-03 16:24:59 -0800322 fi
Mike Frysinger4114c792012-09-13 22:33:12 -0400323fi
324
Daniel Wangaf4d0012015-07-17 11:52:05 -0700325# cros_workon packages always have to be rebuilt.
Daniel Wang491f42a2015-08-20 12:29:59 -0700326FORCE_LOCAL_BUILD_PKGS+=( "${CROS_WORKON_PKGS[@]}" )
Daniel Wangaf4d0012015-07-17 11:52:05 -0700327
Chris McDonald431cf232020-06-17 13:54:54 -0600328# Any package that directly depends on an active cros_workon package also needs
329# to be rebuilt in order to be correctly built against the current set of
330# changes a user may have made to the cros_workon package.
331if [[ ${#CROS_WORKON_PKGS[@]} -gt 0 ]]; then
332 # Collect all installed packages that depend on active cros_workon packages.
333 WORKON_PKG_CONSUMERS=()
334 mapfile -t WORKON_PKG_CONSUMERS < <( \
Alex Klein685216d2020-10-02 12:54:29 -0600335 equery-${FLAGS_board} -q depends "${CROS_WORKON_PKGS[@]}" | \
336 sort -u | \
337 grep -Ev "^\s*$" )
Chris McDonald431cf232020-06-17 13:54:54 -0600338
339 # Transform this list of packages with versions in to a list of just
340 # $CATEGORY/$NAME entries, since we don't want to pass packages with explicit
341 # version numbers as arguments to `emerge`.
342 if [[ ${#WORKON_PKG_CONSUMERS[@]} -gt 0 ]]; then
343 WORKON_REBUILD_PKGS=()
344 mapfile -t WORKON_REBUILD_PKGS < <( \
345 equery-${FLAGS_board} list -p -o --format='$category/$name' \
346 "${WORKON_PKG_CONSUMERS[@]}" | sort -u )
347
348 info "The following packages depend directly on an active" \
349 "cros_workon package and will be rebuilt: ${WORKON_REBUILD_PKGS[*]}"
350
351 FORCE_LOCAL_BUILD_PKGS+=( "${WORKON_REBUILD_PKGS[@]}" )
352 fi
353fi
354
Gregory Meinkeb0f0adc2018-04-17 12:02:28 -0600355if [[ -n "${FLAGS_board_root}" ]]; then
356 export ROOT="${FLAGS_board_root}"
357 export PORTAGE_CONFIGROOT="${ROOT}"
358 export SYSROOT="${ROOT}"
359 export PKGDIR="${ROOT}"/packages
360fi
361
362# Temporarily modify the emerge flags so we can calculate the revdeps
363# on the modified packages.
Gregory Meinke0766df42018-08-23 11:36:12 -0600364if [[ "${FLAGS_withrevdeps}" -eq "${FLAGS_TRUE}" ]]; then
Yves Arrouyec16e45e2018-08-31 08:37:15 -0700365 info "starting reverse dependency calculations ..."
Gregory Meinke0766df42018-08-23 11:36:12 -0600366 SIM_EMERGE_FLAGS=( "${EMERGE_FLAGS[@]}" --pretend --columns )
Gregory Meinkeee71dd12018-07-09 12:42:25 -0600367
Gregory Meinke0766df42018-08-23 11:36:12 -0600368 if [[ ${#PACKAGES[@]} -gt 0 ]]; then
369 SIM_EMERGE_FLAGS+=(
370 --reinstall-atoms="${PACKAGES[*]}"
371 --usepkg-exclude="${PACKAGES[*]}"
372 )
373 fi
Gregory Meinkeb0f0adc2018-04-17 12:02:28 -0600374
Chris McDonaldd346ead2020-06-16 14:57:53 -0600375 # cros-workon packages are always going to be force reinstalled, so we add
376 # the forced reinstall behavior to the modified package calculation. This is
377 # necessary to include when a user has already installed a 9999 ebuild and is
378 # now reinstalling that package with additional local changes, because
379 # otherwise the modified package calculation would not see that a 'new'
380 # package is being installed.
381 if [[ ${#CROS_WORKON_PKGS[@]} -gt 0 ]]; then
382 SIM_EMERGE_FLAGS+=(
383 --reinstall-atoms="${CROS_WORKON_PKGS[*]}"
384 --usepkg-exclude="${CROS_WORKON_PKGS[*]}"
385 )
386 fi
387
Gregory Meinke0766df42018-08-23 11:36:12 -0600388 # Calculate only the ebuild changes from the emerge simulation ignoring
389 # the virtual packages and the forced rebuild of autotest-all package.
Chris McDonald3eee0702020-06-16 14:28:01 -0600390 # The lines of the following block do the following operations:
391 # 1. Do a pretend `emerge` command to get a list of what would be built.
392 # 2. Filter to only packages that will be installed to the board sysroot.
393 # 3. Filter to only packages that would be built from source and rewrite the
394 # line from Portage's full output to only $CATEGORY/$PACKAGE
Chris McDonaldd346ead2020-06-16 14:57:53 -0600395 # 4. Filter the list of packages to a heuristic set of packages known to have
396 # incorrectly specified dependencies.
Chris McDonald3eee0702020-06-16 14:28:01 -0600397 # 5. Sort the output and remove any duplicate entries.
Gregory Meinke0766df42018-08-23 11:36:12 -0600398 BASE_INSTALL_PKGS=( $( \
399 sudo -E "${EMERGE_CMD[@]}" "${SIM_EMERGE_FLAGS[@]}" "${PACKAGES[@]}" | \
Chris McDonald3eee0702020-06-16 14:28:01 -0600400 grep -e 'to /build/' | \
Gregory Meinke0766df42018-08-23 11:36:12 -0600401 sed -n -E '/^\[ebuild /{s:^[^]]+\] +::;s: .*::;p}' | \
Chris McDonaldd346ead2020-06-16 14:57:53 -0600402 grep -E '/(chromeos-config.*|coreboot-private-files.*|tast-build-deps)$' | \
Chris McDonald3eee0702020-06-16 14:28:01 -0600403 sort -u ) )
Gregory Meinkeb0f0adc2018-04-17 12:02:28 -0600404
Gregory Meinke0766df42018-08-23 11:36:12 -0600405 MOD_PKGS=()
406 if [[ "${#BASE_INSTALL_PKGS[@]}" -gt 0 ]]; then
Chris McDonaldd346ead2020-06-16 14:57:53 -0600407 info "Forced rebuild packages detected: ${BASE_INSTALL_PKGS[*]}."
Gregory Meinkeb0f0adc2018-04-17 12:02:28 -0600408 # Convert specific versions into base package names
409 MOD_PKGS+=( $(\
Gregory Meinke0766df42018-08-23 11:36:12 -0600410 equery-${FLAGS_board} list -p -o --format='$category/$name' \
411 "${BASE_INSTALL_PKGS[@]}" | sort -u ) )
Mike Frysinger5a11e872018-09-05 16:29:02 -0400412 # Remove Chrome as rebuilding it is expensive and almost never makes sense.
413 # Ignore grep exit status in case chromeos-chrome is the only package.
Alex Kleindfa7bfa2020-04-20 12:55:22 -0600414 grep_cmd=( grep -v )
415 for pkg in "${CHROME_PACKAGES[@]}"; do
416 grep_cmd+=( -e "${pkg}" )
417 done
418 MOD_PKGS=( $(printf '%s\n' "${MOD_PKGS[@]}" | "${grep_cmd[@]}" || :) )
Gregory Meinkeb0f0adc2018-04-17 12:02:28 -0600419 fi
Gregory Meinkeb0f0adc2018-04-17 12:02:28 -0600420
Gregory Meinke0766df42018-08-23 11:36:12 -0600421 FORCE_LOCAL_BUILD_PKGS+=( "${MOD_PKGS[@]}" )
422
423 if [[ "${#MOD_PKGS[@]}" -gt 0 ]]; then
424 info "calculating reverse dependencies on packages: ${MOD_PKGS[*]}"
425 REV_DEPS=( $(\
426 equery-${FLAGS_board} -q depends --indirect "${MOD_PKGS[@]}" |\
427 awk '{print $1}' | grep -v ^virtual/ | sort -u) )
428 if [[ "${#REV_DEPS[@]}" -gt 0 ]]; then
429 # Convert specific versions into base package names
430 RMOD_PKGS=( $(\
Gregory Meinkeb0f0adc2018-04-17 12:02:28 -0600431 equery-${FLAGS_board} -q list -p -o --format='$category/$name' \
Gregory Meinke0766df42018-08-23 11:36:12 -0600432 "${REV_DEPS[@]}" | sort -u ) )
Mike Frysinger5a11e872018-09-05 16:29:02 -0400433 # Remove Chrome as rebuilding it is expensive and almost never makes
434 # sense. Ignore grep exit status in case chromeos-chrome is the only
435 # package.
Alex Kleindfa7bfa2020-04-20 12:55:22 -0600436 grep_cmd=( grep -v )
437 for pkg in "${CHROME_PACKAGES[@]}"; do
438 grep_cmd+=( -e "${pkg}" )
439 done
Chris McDonald27a67cc2020-05-06 16:47:44 -0600440 RMOD_PKGS=( $(printf '%s\n' "${RMOD_PKGS[@]}" | "${grep_cmd[@]}" || :) )
Gregory Meinke0766df42018-08-23 11:36:12 -0600441 info "final reverse dependencies that will be rebuilt: ${RMOD_PKGS[*]}"
442 FORCE_LOCAL_BUILD_PKGS+=( "${RMOD_PKGS[@]}" )
443 fi
Gregory Meinkeb0f0adc2018-04-17 12:02:28 -0600444 fi
Gregory Meinke0766df42018-08-23 11:36:12 -0600445fi # end FLAGS_withrevdeps
Gregory Meinkeb0f0adc2018-04-17 12:02:28 -0600446
Daniel Wangaf4d0012015-07-17 11:52:05 -0700447if [[ ${#FORCE_LOCAL_BUILD_PKGS[@]} -gt 0 ]]; then
Mike Frysinger4114c792012-09-13 22:33:12 -0400448 EMERGE_FLAGS+=(
Daniel Wangaf4d0012015-07-17 11:52:05 -0700449 --reinstall-atoms="${FORCE_LOCAL_BUILD_PKGS[*]}"
450 --usepkg-exclude="${FORCE_LOCAL_BUILD_PKGS[*]}"
Mike Frysinger4114c792012-09-13 22:33:12 -0400451 )
David James710a7d12011-12-21 15:57:02 -0800452fi
Matt Tennant298f61a2012-06-25 21:54:33 -0700453
Chris McDonald33cabb02019-12-13 14:17:08 -0700454# A list of critical system packages that should never be incidentally
455# reinstalled as a side effect of build_packages. All packages in this list
456# are special cased to prefer matching installed versions, overriding the
457# typical logic of upgrading to the newest available version.
458#
459# This list can't include any package that gets installed to a board!
460# Packages such as LLVM or binutils must not be in this list as the normal
461# rebuild logic must still apply to them for board targets.
462#
463# TODO(crbug/1050752): Remove this list and the corresponding arguments
464# to `emerge` below once we figure out how to exclude toolchain packages from
465# being upgraded transitively via BDEPEND relations.
466CRITICAL_SDK_PACKAGES=(
Manoj Guptaed847552020-09-09 03:04:51 +0000467 "dev-lang/rust"
Luis Lozanob4e21562021-01-29 02:20:03 +0000468 "dev-lang/go"
Chris McDonald33cabb02019-12-13 14:17:08 -0700469 "sys-libs/glibc"
470 "sys-devel/gcc"
471)
472
Mike Frysinger76452ba2012-09-13 22:45:34 -0400473info "Merging board packages now"
Matt Tennant298f61a2012-06-25 21:54:33 -0700474(
Hidehiko Abe7a41d342017-03-29 21:19:16 +0900475 # Support goma on bots. This has to run in subshell, otherwise EXIT trap
476 # handler is overwritten.
477 if [[ "${FLAGS_run_goma}" -eq "${FLAGS_TRUE}" ]]; then
478 info "Starting goma compiler_proxy."
479 goma_ctl="${GOMA_DIR:-${HOME}/goma}/goma_ctl.py"
Mike Frysingerea21dea2020-02-20 01:15:24 -0500480 "${goma_ctl}" restart
481 trap "'${goma_ctl}' stop" EXIT
Hidehiko Abe7a41d342017-03-29 21:19:16 +0900482 fi
483
Mike Frysinger5cf035f2021-01-26 00:57:46 -0500484 info_run sudo -E "${EMERGE_CMD[@]}" "${EMERGE_FLAGS[@]}" "${PACKAGES[@]}" \
Chris McDonald33cabb02019-12-13 14:17:08 -0700485 --useoldpkg-atoms="${CRITICAL_SDK_PACKAGES[*]}" \
486 --rebuild-exclude="${CRITICAL_SDK_PACKAGES[*]}"
Matt Tennant298f61a2012-06-25 21:54:33 -0700487)
488
Brian Harringcb782242011-12-13 19:48:44 -0800489echo "Builds complete"
Bertrand SIMONNETc7a46e22014-12-11 15:58:11 -0800490
491if [[ ${FLAGS_withdebugsymbols} -eq ${FLAGS_TRUE} ]]; then
492 info "fetching the debug symbols"
Mike Frysinger5cf035f2021-01-26 00:57:46 -0500493 info_run sudo -E "${CHROMITE_BIN}/cros_install_debug_syms" \
Bertrand SIMONNETc7a46e22014-12-11 15:58:11 -0800494 "--board=${FLAGS_board}" "--all"
495fi
496
Matt Tennant298f61a2012-06-25 21:54:33 -0700497command_completed
Brian Harringcb782242011-12-13 19:48:44 -0800498echo "Done"