blob: a1cf2138879ae086bca1c53f161b2c1e2eff5e09 [file] [log] [blame]
Zdenek Behand7bfd862011-05-11 23:56:46 +02001#!/bin/bash
2
3# Copyright (c) 2010 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
Zdenek Behand7bfd862011-05-11 23:56:46 +02007
David James0b1baf62012-03-15 09:26:23 -07008. "$(dirname "$0")/common.sh" || exit 1
Zdenek Behand7bfd862011-05-11 23:56:46 +02009
10# Script must run inside the chroot
11assert_inside_chroot "$@"
12
Zdenek Behan308e9fd2011-05-12 22:25:47 +020013# Do not run as root
14assert_not_root_user
15
David James855afb72012-03-14 20:04:59 -070016# Developer-visible flags.
Zdenek Behand7bfd862011-05-11 23:56:46 +020017DEFINE_boolean usepkg $FLAGS_TRUE \
18 "Use binary packages to bootstrap."
David James855afb72012-03-14 20:04:59 -070019
20FLAGS_HELP="usage: $(basename $0) [flags]
21Performs an update of the chroot. This script is called as part of
22build_packages, so there is typically no need to call this script directly.
23"
24show_help_if_requested "$@"
25
26# The following options are advanced options, only available to those willing
27# to read the source code. They are not shown in help output, since they are
28# not needed for the typical developer workflow.
Zdenek Behand7bfd862011-05-11 23:56:46 +020029DEFINE_boolean fast ${DEFAULT_FAST} "Call many emerges in parallel"
David James184e3902012-02-23 20:19:28 -080030DEFINE_integer jobs -1 \
31 "How many packages to build in parallel at maximum."
Zdenek Behand7bfd862011-05-11 23:56:46 +020032
33# Parse command line flags
34FLAGS "$@" || exit 1
35eval set -- "${FLAGS_ARGV}"
36
37# Only now can we die on error. shflags functions leak non-zero error codes,
38# so will die prematurely if 'set -e' is specified before now.
39set -e
40
J. Richard Barnettee80f6de2012-02-24 14:08:34 -080041. ${SCRIPTS_DIR}/sdk_lib/make_conf_util.sh
42
Zdenek Behan308e9fd2011-05-12 22:25:47 +020043# Run version hooks as pre-update
44${SCRIPTS_DIR}/run_chroot_version_hooks
45
J. Richard Barnettee80f6de2012-02-24 14:08:34 -080046# Create /etc/make.conf.host_setup. The file content is regenerated
47# from scratch every update. There are various reasons to do this:
48# + It's cheap, so this is an easy way to guarantee correct content
49# after an upgrade.
50# + Inside make_chroot.sh, we use a temporary version of the file
51# which must be updated before the script completes; that final
52# update happens here.
53# + If the repositories change to add or remove the private
54# overlay, the file may need to be regenerated.
55create_host_setup
David Jamese996baa2011-11-02 16:11:27 -070056
Zdenek Behand7bfd862011-05-11 23:56:46 +020057info "Updating chroot"
58
Mike Frysinger650bf872012-02-27 11:05:26 -050059EMERGE_FLAGS="-uNv --with-bdeps=y --select"
Zdenek Behan95626202011-05-12 05:54:19 +020060if [ "${FLAGS_usepkg}" -eq "${FLAGS_TRUE}" ]; then
61 EMERGE_FLAGS="${EMERGE_FLAGS} --getbinpkg"
David James0dccff32011-06-09 13:03:47 -070062
63 # Only update toolchain when binpkgs are available. Toolchain rollout
64 # process only takes place when the chromiumos sdk builder finishes
65 # a successful build.
66 EMERGE_FLAGS+=" --useoldpkg-atoms=sys-devel/binutils"
67 EMERGE_FLAGS+=" --useoldpkg-atoms=sys-devel/gcc"
68 EMERGE_FLAGS+=" --useoldpkg-atoms=sys-libs/glibc"
Zdenek Behan95626202011-05-12 05:54:19 +020069fi
Zdenek Behana29fb202011-05-12 05:21:14 +020070
David James184e3902012-02-23 20:19:28 -080071if [[ "${FLAGS_jobs}" -ne -1 ]]; then
72 EMERGE_FLAGS+=" --jobs=${FLAGS_jobs}"
73fi
74
Zdenek Behand7bfd862011-05-11 23:56:46 +020075# Perform an update of hard-host-depends and world in the chroot.
76EMERGE_CMD="emerge"
77if [ "${FLAGS_fast}" -eq "${FLAGS_TRUE}" ]; then
78 EMERGE_CMD="${GCLIENT_ROOT}/chromite/bin/parallel_emerge"
79fi
Zdenek Behan95626202011-05-12 05:54:19 +020080
Zdenek Behan4748e872011-10-11 03:23:11 +020081# In first pass, update portage and toolchains. Lagged updates of both
82# can cause serious issues later.
Zdenek Behan26fe5702012-05-03 15:05:33 -070083export CHOST="$(portageq envvar CHOST)"
84LATEST=$(gcc-config -l | awk -v chost="${CHOST}" '$2 ~ chost { print $2 }' | \
85 sort -V | tail -n 1)
86CURRENT="$(gcc-config -c)" || true # This fails if current profile is invalid.
87sudo -E ${EMERGE_CMD} ${EMERGE_FLAGS} \
88 sys-devel/gcc sys-devel/binutils sys-libs/glibc sys-apps/portage
89# If the latest toolchain wasn't already selected before we updated, do nothing,
90# otherwise autoselect the latest. Also fix if the current profile is invalid.
91if [ "${LATEST}" != "${CURRENT}" ] || ! gcc-config -c &> /dev/null; then
92 LATEST=$(gcc-config -l | awk -v chost="${CHOST}" '$2 ~ chost { print $2 }' | \
93 sort -V | tail -n 1 )
94 sudo -E gcc-config "${LATEST}"
Zdenek Behan4748e872011-10-11 03:23:11 +020095fi
96
97# Second pass, update everything else.
98EMERGE_FLAGS+=" --deep"
David James855afb72012-03-14 20:04:59 -070099sudo -E ${EMERGE_CMD} ${EMERGE_FLAGS} \
Zdenek Behana29fb202011-05-12 05:21:14 +0200100 chromeos-base/hard-host-depends world
Zdenek Behand7bfd862011-05-11 23:56:46 +0200101
Zdenek Behan99fb7422011-10-17 01:12:34 +0200102# Automatically discard all CONFIG_PROTECT'ed files. Those that are
103# protected should not be overwritten until the variable is changed.
104# Autodiscard is option "-9" followed by the "YES" confirmation.
105printf '%s\nYES\n' -9 | sudo etc-update
106
David Jamesd899f8d2011-08-17 05:22:52 -0700107# If the user still has old perl modules installed, update them.
108PERL_VERSIONS=$(find /usr/lib*/perl5/vendor_perl/ -maxdepth 1 -mindepth 1 \
109 -type d -printf '%P\n' | sort -u | wc -w)
110if [ "$PERL_VERSIONS" -gt 1 ] ; then
Mike Frysinger43a7f692012-02-28 16:20:47 -0500111 sudo perl-cleaner --all -- --quiet
David Jamesd899f8d2011-08-17 05:22:52 -0700112fi