Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(884)

Unified Diff: src/platform/dev/gmergefs

Issue 1515011: Adds gmergefs. A method of remoting to a target and pushing new (Closed)
Patch Set: Fixes for adlr Created 10 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | src/scripts/build_image » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « no previous file | src/scripts/build_image » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698