| Index: src/platform/dev/gmergefs
|
| diff --git a/src/platform/dev/gmergefs b/src/platform/dev/gmergefs
|
| new file mode 100755
|
| index 0000000000000000000000000000000000000000..acba23829985385e768e0eed8da4d6cf0258d8b2
|
| --- /dev/null
|
| +++ b/src/platform/dev/gmergefs
|
| @@ -0,0 +1,132 @@
|
| +#!/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.
|
| +. "$(dirname "$0")/../../scripts/common.sh"
|
| +
|
| +# Script must be run inside the chroot
|
| +assert_inside_chroot
|
| +
|
| +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"
|
| +
|
| +# Just in case we haven't done this before.
|
| +eval /sbin/modprobe fuse
|
| +
|
| +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
|
| +
|
| +sync
|
| +
|
| +sudo umount "${REMOTE_ROOT_DIR}"
|
| +
|
| +trap - EXIT
|
|
|