blob: 2a84ee6e4299ce21fa1e2953808c4579932705fe [file] [log] [blame]
#!/bin/bash
# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
. "$(dirname "$0")/common.sh" || exit 1
# Script must run inside the chroot
assert_inside_chroot "$@"
# Do not run as root
assert_not_root_user
FLAGS_HELP="usage: $(basename $0) [flags]
Updates the host python and associated packages. This script is called as part
of build_packages, so there is typically no need to call this script directly.
"
show_help_if_requested "$@"
# The following options are advanced options, only available to those willing
# to read the source code. They are not shown in help output, since they are
# not needed for the typical developer workflow.
DEFINE_integer jobs -1 \
"How many packages to build in parallel at maximum."
# Parse command line flags
FLAGS "$@" || exit 1
eval set -- "${FLAGS_ARGV}"
# Only now can we die on error. shflags functions leak non-zero error codes,
# so will die prematurely if 'switch_to_strict_mode' is specified before now.
switch_to_strict_mode
CHROMITE_BIN="${GCLIENT_ROOT}/chromite/bin"
EMERGE_CMD="${CHROMITE_BIN}/parallel_emerge"
do_cleanup=${FLAGS_FALSE}
cmds=()
# If we've got multiple versions of python installed, clear them out.
PYTHON_VERSIONS=( $(qlist -ICv -e dev-lang/python | sort -nr) )
if [[ ${#PYTHON_VERSIONS[@]} -gt 1 ]]; then
info "Cleaning up system python"
cmds+=(
# Make sure we have the latest version selected.
'eselect python update'
# Unmerge all the older versions.
"CLEAN_DELAY=0 emerge -Cq ${PYTHON_VERSIONS[*]:1}"
)
do_cleanup=${FLAGS_TRUE}
fi
# If the user still has old python modules installed, update them.
PYTHON_VERSIONS=(
# Filter out the new python-exec package.
$(ls -d /usr/lib*/python*/ | cut -d/ -f4 | grep -v python-exec | sort -uV)
)
if [[ ${#PYTHON_VERSIONS[@]} -gt 1 ]]; then
PY_UPDATE_FLAGS=()
if [[ ${FLAGS_jobs} -ne -1 ]]; then
PY_UPDATE_FLAGS+=( --jobs=${FLAGS_jobs} )
fi
cmds+=(
"python-updater --package-manager-command ${EMERGE_CMD} -- \
${PY_UPDATE_FLAGS[*]}"
)
# python-updater does not handle /usr/local, so do it ourselves.
# We have to run this after python-updater though since these packages
# might rely on other dev-python stuff in /usr.
pkgs=( $(qfile -qC /usr/local/lib*/python* | sort -u) )
if [[ ${#pkgs[@]} -gt 0 ]]; then
cmds+=( "${EMERGE_CMD} ${PY_UPDATE_FLAGS[*]} ${pkgs[*]}" )
fi
old_py_dir=${PYTHON_VERSIONS[0]}
do_cleanup=${FLAGS_TRUE}
else
old_py_dir=
fi
if [[ ${do_cleanup} -eq ${FLAGS_TRUE} ]]; then
cmds+=(
# Make sure chromite can be found. We also clean up old chromite paths
# that might have been accidentally created (make_chroot/etc...).
'rm -f /usr/lib64/python*/{site-packages/,}chromite'
'ln -sf /mnt/host/source/chromite \
/usr/lib64/python$(eselect python show --ABI)/site-packages/chromite'
)
if [[ -n ${old_py_dir} ]]; then
cmds+=(
# Trim generated pyc files if they've been left behind.
"find /usr/lib*/${old_py_dir}/ /usr/local/lib*/${old_py_dir}/ \
-name '*.pyc' -delete 2>/dev/null || :"
"find /usr/lib*/${old_py_dir}/ /usr/local/lib*/${old_py_dir}/ \
-depth -type d -delete 2>/dev/null || :"
)
fi
cmds+=(
# Remove empty dirs if possible.
'rmdir /usr/local/lib*/python*/site-packages /usr/local/lib*/python*/ \
/usr/lib*/python*/site-packages /usr/lib*/python*/ 2>/dev/null || :'
)
fi
sudo_multi "${cmds[@]}"