| #!/bin/bash |
| |
| # Copyright (c) 2010 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. |
| |
| # Script that emerges packages and their dependencies from a host development |
| # machine onto a target Chromium OS device |
| # |
| # NOTE: This script must be run from the chromiumos build chroot environment. |
| # |
| |
| # Load common constants. This should be the first executable line. |
| # The path to common.sh should be relative to your script's location. |
| . /usr/lib/crosutils/common.sh 2> /dev/null || |
| (echo "Must run from within the chroot" && false) || |
| exit 1 |
| |
| get_default_board |
| |
| # Flags |
| DEFINE_string board "$DEFAULT_BOARD" \ |
| "The board to build packages for." |
| DEFINE_boolean usepkg $FLAGS_FALSE \ |
| "Use binary packages to bootstrap build when possible." |
| DEFINE_string build_root "/build" \ |
| "The root location for board sysroots." |
| DEFINE_integer jobs -1 \ |
| "How many packages to build in parallel at maximum." |
| DEFINE_boolean unmerge $FLAGS_FALSE \ |
| "Whether to unmerge the package versus emerge it." |
| DEFINE_integer retries -1 \ |
| "On build failure, the number of times to retry" |
| DEFINE_boolean onstatefuldev $FLAGS_TRUE \ |
| "Build packages and install them into stateful partition on device." |
| DEFINE_boolean installmask $FLAGS_TRUE \ |
| "Use INSTALL_MASK to shrink the resulting image." |
| DEFINE_string remote "" "remote hostname/IP of running Chromium OS instance" |
| |
| # Parse command line |
| FLAGS_HELP="usage: $0 [flags]" |
| FLAGS "$@" || exit 1 |
| eval set -- "${FLAGS_ARGV}" |
| |
| # Die on any errors. |
| set -e |
| |
| # Checks $1 and prints out $2 is required before exiting if $1 does not exist |
| check_args() { |
| if [ -z "${1}" ] ; then |
| echo "Error: ${2} is required." |
| exit 1 |
| fi |
| } |
| |
| # Clean up function for mount point |
| cleanup_sshfs_mount() { |
| echo "Cleaning up mount point" |
| sudo umount "${REMOTE_ROOT_DIR}" |
| } |
| |
| check_args "${FLAGS_board}" |
| check_args "${FLAGS_ARGV}" "Emerge package name" |
| |
| EMERGE_FLAGS="" |
| [[ $FLAGS_usepkg -eq $FLAGS_TRUE ]] && |
| EMERGE_FLAGS="${EMERGE_FLAGS} --getbinpkg --usepkg --with-bdeps y" |
| |
| INSTALL_MASK="" |
| [[ ${FLAGS_installmask} -eq ${FLAGS_TRUE} ]] && \ |
| INSTALL_MASK="${DEFAULT_INSTALL_MASK}" |
| |
| EMERGE_JOBS= |
| [[ ${FLAGS_jobs} -ne -1 ]] && EMERGE_JOBS="--jobs=${FLAGS_jobs}" |
| |
| # Duplicate from build_packages to get host packages on system. |
| |
| # Skip building on host if we are unmerging. |
| if [ ${FLAGS_unmerge} -eq ${FLAGS_FALSE} ] ; then |
| eretry sudo emerge -uDNv $EMERGE_FLAGS world |
| |
| # Build request and install them onto the sysroot |
| for emerge_request in $FLAGS_ARGV; do |
| eretry sudo emerge-${FLAGS_board} -uDNv \ |
| $(remove_quotes "${emerge_request}") |
| done |
| fi |
| |
| # Name is unique per client. This allows one to run gmergefs in parallel |
| # with multiple clients. |
| REMOTE_ROOT_DIR="${FLAGS_build_root}/${FLAGS_board}/gmergefs/${FLAGS_remote}" |
| |
| # Default is to install on stateful dev, otherwise install on root. |
| REMOTE_RELATIVE_PATH="" |
| [ ${FLAGS_onstatefuldev} -eq $FLAGS_TRUE ] && \ |
| REMOTE_RELATIVE_PATH="mnt/stateful_partition/dev_image" |
| REMOTE_PATH="${REMOTE_ROOT_DIR}/${REMOTE_RELATIVE_PATH}" |
| |
| # Create directory for remote image |
| sudo mkdir -p "${REMOTE_ROOT_DIR}" |
| |
| # Mount remote fs into chroot |
| echo "Enter password for remote machine" |
| sudo sshfs -o idmap=user -o allow_other -o nonempty -o transform_symlinks \ |
| "root@${FLAGS_remote}:/" "${REMOTE_ROOT_DIR}" |
| |
| trap cleanup_sshfs_mount EXIT |
| |
| # Ensure root path is created for emerge |
| sudo mkdir -p "${REMOTE_PATH}" |
| |
| # Same arguments used in build_image to emerge these packages onto the target |
| for emerge_request in $FLAGS_ARGV; do |
| if [ ${FLAGS_unmerge} -eq ${FLAGS_FALSE} ] ; then |
| sudo INSTALL_MASK="$INSTALL_MASK" emerge-${FLAGS_board} \ |
| --root="${REMOTE_PATH}" --root-deps=rdeps \ |
| --usepkgonly $(remove_quotes "${emerge_request}") $EMERGE_JOBS |
| else |
| sudo emerge-${FLAGS_board} --unmerge \ |
| --root="${REMOTE_PATH}" $(remove_quotes "${emerge_request}") |
| fi |
| done |
| |
| # Update ld.so.cache of root partition if installing to /usr/local |
| if [ ${FLAGS_onstatefuldev} -eq $FLAGS_TRUE ] ; then |
| # Re-run ldconfig to fix /etc/ldconfig.so.cache |
| sudo /sbin/ldconfig -r "${REMOTE_ROOT_DIR}" |
| fi |
| |
| sync |
| sudo umount "${REMOTE_ROOT_DIR}" |
| |
| trap - EXIT |