| 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
 | 
| 
 |