1*6777b538SAndroid Build Coastguard Worker#!/bin/bash -e 2*6777b538SAndroid Build Coastguard Worker 3*6777b538SAndroid Build Coastguard Worker# Copyright 2012 The Chromium Authors 4*6777b538SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be 5*6777b538SAndroid Build Coastguard Worker# found in the LICENSE file. 6*6777b538SAndroid Build Coastguard Worker 7*6777b538SAndroid Build Coastguard Worker# This script installs Debian-derived distributions in a chroot environment. 8*6777b538SAndroid Build Coastguard Worker# It can for example be used to have an accurate 32bit build and test 9*6777b538SAndroid Build Coastguard Worker# environment when otherwise working on a 64bit machine. 10*6777b538SAndroid Build Coastguard Worker# N. B. it is unlikely that this script will ever work on anything other than a 11*6777b538SAndroid Build Coastguard Worker# Debian-derived system. 12*6777b538SAndroid Build Coastguard Worker 13*6777b538SAndroid Build Coastguard Worker# Older Debian based systems had both "admin" and "adm" groups, with "admin" 14*6777b538SAndroid Build Coastguard Worker# apparently being used in more places. Newer distributions have standardized 15*6777b538SAndroid Build Coastguard Worker# on just the "adm" group. Check /etc/group for the preferred name of the 16*6777b538SAndroid Build Coastguard Worker# administrator group. 17*6777b538SAndroid Build Coastguard Workeradmin=$(grep '^admin:' /etc/group >&/dev/null && echo admin || echo adm) 18*6777b538SAndroid Build Coastguard Worker 19*6777b538SAndroid Build Coastguard Workerusage() { 20*6777b538SAndroid Build Coastguard Worker echo "usage: ${0##*/} [-m mirror] [-g group,...] [-s] [-c]" 21*6777b538SAndroid Build Coastguard Worker echo "-b dir additional directories that should be bind mounted," 22*6777b538SAndroid Build Coastguard Worker echo ' or "NONE".' 23*6777b538SAndroid Build Coastguard Worker echo " Default: if local filesystems present, ask user for help" 24*6777b538SAndroid Build Coastguard Worker echo "-g group,... groups that can use the chroot unauthenticated" 25*6777b538SAndroid Build Coastguard Worker echo " Default: '${admin}' and current user's group ('$(id -gn)')" 26*6777b538SAndroid Build Coastguard Worker echo "-l List all installed chroot environments" 27*6777b538SAndroid Build Coastguard Worker echo "-m mirror an alternate repository mirror for package downloads" 28*6777b538SAndroid Build Coastguard Worker echo "-s configure default deb-srcs" 29*6777b538SAndroid Build Coastguard Worker echo "-c always copy 64bit helper binaries to 32bit chroot" 30*6777b538SAndroid Build Coastguard Worker echo "-h this help message" 31*6777b538SAndroid Build Coastguard Worker} 32*6777b538SAndroid Build Coastguard Worker 33*6777b538SAndroid Build Coastguard Workerprocess_opts() { 34*6777b538SAndroid Build Coastguard Worker local OPTNAME OPTIND OPTERR OPTARG 35*6777b538SAndroid Build Coastguard Worker while getopts ":b:g:lm:sch" OPTNAME; do 36*6777b538SAndroid Build Coastguard Worker case "$OPTNAME" in 37*6777b538SAndroid Build Coastguard Worker b) 38*6777b538SAndroid Build Coastguard Worker if [ "${OPTARG}" = "NONE" -a -z "${bind_mounts}" ]; then 39*6777b538SAndroid Build Coastguard Worker bind_mounts="${OPTARG}" 40*6777b538SAndroid Build Coastguard Worker else 41*6777b538SAndroid Build Coastguard Worker if [ "${bind_mounts}" = "NONE" -o "${OPTARG}" = "${OPTARG#/}" -o \ 42*6777b538SAndroid Build Coastguard Worker ! -d "${OPTARG}" ]; then 43*6777b538SAndroid Build Coastguard Worker echo "Invalid -b option(s)" 44*6777b538SAndroid Build Coastguard Worker usage 45*6777b538SAndroid Build Coastguard Worker exit 1 46*6777b538SAndroid Build Coastguard Worker fi 47*6777b538SAndroid Build Coastguard Worker bind_mounts="${bind_mounts} 48*6777b538SAndroid Build Coastguard Worker${OPTARG} ${OPTARG} none rw,bind 0 0" 49*6777b538SAndroid Build Coastguard Worker fi 50*6777b538SAndroid Build Coastguard Worker ;; 51*6777b538SAndroid Build Coastguard Worker g) 52*6777b538SAndroid Build Coastguard Worker [ -n "${OPTARG}" ] && 53*6777b538SAndroid Build Coastguard Worker chroot_groups="${chroot_groups}${chroot_groups:+,}${OPTARG}" 54*6777b538SAndroid Build Coastguard Worker ;; 55*6777b538SAndroid Build Coastguard Worker l) 56*6777b538SAndroid Build Coastguard Worker list_all_chroots 57*6777b538SAndroid Build Coastguard Worker exit 58*6777b538SAndroid Build Coastguard Worker ;; 59*6777b538SAndroid Build Coastguard Worker m) 60*6777b538SAndroid Build Coastguard Worker if [ -n "${mirror}" ]; then 61*6777b538SAndroid Build Coastguard Worker echo "You can only specify exactly one mirror location" 62*6777b538SAndroid Build Coastguard Worker usage 63*6777b538SAndroid Build Coastguard Worker exit 1 64*6777b538SAndroid Build Coastguard Worker fi 65*6777b538SAndroid Build Coastguard Worker mirror="$OPTARG" 66*6777b538SAndroid Build Coastguard Worker ;; 67*6777b538SAndroid Build Coastguard Worker s) 68*6777b538SAndroid Build Coastguard Worker add_srcs="y" 69*6777b538SAndroid Build Coastguard Worker ;; 70*6777b538SAndroid Build Coastguard Worker c) 71*6777b538SAndroid Build Coastguard Worker copy_64="y" 72*6777b538SAndroid Build Coastguard Worker ;; 73*6777b538SAndroid Build Coastguard Worker h) 74*6777b538SAndroid Build Coastguard Worker usage 75*6777b538SAndroid Build Coastguard Worker exit 0 76*6777b538SAndroid Build Coastguard Worker ;; 77*6777b538SAndroid Build Coastguard Worker \:) 78*6777b538SAndroid Build Coastguard Worker echo "'-$OPTARG' needs an argument." 79*6777b538SAndroid Build Coastguard Worker usage 80*6777b538SAndroid Build Coastguard Worker exit 1 81*6777b538SAndroid Build Coastguard Worker ;; 82*6777b538SAndroid Build Coastguard Worker *) 83*6777b538SAndroid Build Coastguard Worker echo "invalid command-line option: $OPTARG" 84*6777b538SAndroid Build Coastguard Worker usage 85*6777b538SAndroid Build Coastguard Worker exit 1 86*6777b538SAndroid Build Coastguard Worker ;; 87*6777b538SAndroid Build Coastguard Worker esac 88*6777b538SAndroid Build Coastguard Worker done 89*6777b538SAndroid Build Coastguard Worker 90*6777b538SAndroid Build Coastguard Worker if [ $# -ge ${OPTIND} ]; then 91*6777b538SAndroid Build Coastguard Worker eval echo "Unexpected command line argument: \${${OPTIND}}" 92*6777b538SAndroid Build Coastguard Worker usage 93*6777b538SAndroid Build Coastguard Worker exit 1 94*6777b538SAndroid Build Coastguard Worker fi 95*6777b538SAndroid Build Coastguard Worker} 96*6777b538SAndroid Build Coastguard Worker 97*6777b538SAndroid Build Coastguard Workerlist_all_chroots() { 98*6777b538SAndroid Build Coastguard Worker for i in /var/lib/chroot/*; do 99*6777b538SAndroid Build Coastguard Worker i="${i##*/}" 100*6777b538SAndroid Build Coastguard Worker [ "${i}" = "*" ] && continue 101*6777b538SAndroid Build Coastguard Worker [ -x "/usr/local/bin/${i%bit}" ] || continue 102*6777b538SAndroid Build Coastguard Worker grep -qs "^\[${i%bit}\]\$" /etc/schroot/schroot.conf || continue 103*6777b538SAndroid Build Coastguard Worker [ -r "/etc/schroot/script-${i}" -a \ 104*6777b538SAndroid Build Coastguard Worker -r "/etc/schroot/mount-${i}" ] || continue 105*6777b538SAndroid Build Coastguard Worker echo "${i%bit}" 106*6777b538SAndroid Build Coastguard Worker done 107*6777b538SAndroid Build Coastguard Worker} 108*6777b538SAndroid Build Coastguard Worker 109*6777b538SAndroid Build Coastguard Workergetkey() { 110*6777b538SAndroid Build Coastguard Worker ( 111*6777b538SAndroid Build Coastguard Worker trap 'stty echo -iuclc icanon 2>/dev/null' EXIT INT TERM QUIT HUP 112*6777b538SAndroid Build Coastguard Worker stty -echo iuclc -icanon 2>/dev/null 113*6777b538SAndroid Build Coastguard Worker dd count=1 bs=1 2>/dev/null 114*6777b538SAndroid Build Coastguard Worker ) 115*6777b538SAndroid Build Coastguard Worker} 116*6777b538SAndroid Build Coastguard Worker 117*6777b538SAndroid Build Coastguard Workerchr() { 118*6777b538SAndroid Build Coastguard Worker printf "\\$(printf '%03o' "$1")" 119*6777b538SAndroid Build Coastguard Worker} 120*6777b538SAndroid Build Coastguard Worker 121*6777b538SAndroid Build Coastguard Workerord() { 122*6777b538SAndroid Build Coastguard Worker printf '%d' $(printf '%c' "$1" | od -tu1 -An) 123*6777b538SAndroid Build Coastguard Worker} 124*6777b538SAndroid Build Coastguard Worker 125*6777b538SAndroid Build Coastguard Workeris_network_drive() { 126*6777b538SAndroid Build Coastguard Worker stat -c %T -f "$1/" 2>/dev/null | 127*6777b538SAndroid Build Coastguard Worker egrep -qs '^nfs|cifs|smbfs' 128*6777b538SAndroid Build Coastguard Worker} 129*6777b538SAndroid Build Coastguard Worker 130*6777b538SAndroid Build Coastguard Worker# Check that we are running as a regular user 131*6777b538SAndroid Build Coastguard Worker[ "$(id -nu)" = root ] && { 132*6777b538SAndroid Build Coastguard Worker echo "Run this script as a regular user and provide your \"sudo\"" \ 133*6777b538SAndroid Build Coastguard Worker "password if requested" >&2 134*6777b538SAndroid Build Coastguard Worker exit 1 135*6777b538SAndroid Build Coastguard Worker} 136*6777b538SAndroid Build Coastguard Worker 137*6777b538SAndroid Build Coastguard Workerprocess_opts "$@" 138*6777b538SAndroid Build Coastguard Worker 139*6777b538SAndroid Build Coastguard Workerecho "This script will help you through the process of installing a" 140*6777b538SAndroid Build Coastguard Workerecho "Debian or Ubuntu distribution in a chroot environment. You will" 141*6777b538SAndroid Build Coastguard Workerecho "have to provide your \"sudo\" password when requested." 142*6777b538SAndroid Build Coastguard Workerecho 143*6777b538SAndroid Build Coastguard Worker 144*6777b538SAndroid Build Coastguard Worker# Error handler 145*6777b538SAndroid Build Coastguard Workertrap 'exit 1' INT TERM QUIT HUP 146*6777b538SAndroid Build Coastguard Workertrap 'sudo apt-get clean; tput bel; echo; echo Failed' EXIT 147*6777b538SAndroid Build Coastguard Worker 148*6777b538SAndroid Build Coastguard Worker# Install any missing applications that this script relies on. If these packages 149*6777b538SAndroid Build Coastguard Worker# are already installed, don't force another "apt-get install". That would 150*6777b538SAndroid Build Coastguard Worker# prevent them from being auto-removed, if they ever become eligible for that. 151*6777b538SAndroid Build Coastguard Worker# And as this script only needs the packages once, there is no good reason to 152*6777b538SAndroid Build Coastguard Worker# introduce a hard dependency on things such as dchroot and debootstrap. 153*6777b538SAndroid Build Coastguard Workerdep= 154*6777b538SAndroid Build Coastguard Workerfor i in dchroot debootstrap libwww-perl; do 155*6777b538SAndroid Build Coastguard Worker [ -d /usr/share/doc/"$i" ] || dep="$dep $i" 156*6777b538SAndroid Build Coastguard Workerdone 157*6777b538SAndroid Build Coastguard Worker[ -n "$dep" ] && sudo apt-get -y install $dep 158*6777b538SAndroid Build Coastguard Workersudo apt-get -y install schroot 159*6777b538SAndroid Build Coastguard Worker 160*6777b538SAndroid Build Coastguard Worker# Create directory for chroot 161*6777b538SAndroid Build Coastguard Workersudo mkdir -p /var/lib/chroot 162*6777b538SAndroid Build Coastguard Worker 163*6777b538SAndroid Build Coastguard Worker# Find chroot environments that can be installed with debootstrap 164*6777b538SAndroid Build Coastguard Workertargets="$(cd /usr/share/debootstrap/scripts 165*6777b538SAndroid Build Coastguard Worker ls | grep '^[a-z]*$')" 166*6777b538SAndroid Build Coastguard Worker 167*6777b538SAndroid Build Coastguard Worker# Ask user to pick one of the available targets 168*6777b538SAndroid Build Coastguard Workerecho "The following targets are available to be installed in a chroot:" 169*6777b538SAndroid Build Coastguard Workerj=1; for i in $targets; do 170*6777b538SAndroid Build Coastguard Worker printf '%4d: %s\n' "$j" "$i" 171*6777b538SAndroid Build Coastguard Worker j=$(($j+1)) 172*6777b538SAndroid Build Coastguard Workerdone 173*6777b538SAndroid Build Coastguard Workerwhile :; do 174*6777b538SAndroid Build Coastguard Worker printf "Which target would you like to install: " 175*6777b538SAndroid Build Coastguard Worker read n 176*6777b538SAndroid Build Coastguard Worker [ "$n" -gt 0 -a "$n" -lt "$j" ] >&/dev/null && break 177*6777b538SAndroid Build Coastguard Workerdone 178*6777b538SAndroid Build Coastguard Workerj=1; for i in $targets; do 179*6777b538SAndroid Build Coastguard Worker [ "$j" -eq "$n" ] && { distname="$i"; break; } 180*6777b538SAndroid Build Coastguard Worker j=$(($j+1)) 181*6777b538SAndroid Build Coastguard Workerdone 182*6777b538SAndroid Build Coastguard Workerecho 183*6777b538SAndroid Build Coastguard Worker 184*6777b538SAndroid Build Coastguard Worker# On x86-64, ask whether the user wants to install x86-32 or x86-64 185*6777b538SAndroid Build Coastguard Workerarchflag= 186*6777b538SAndroid Build Coastguard Workerarch= 187*6777b538SAndroid Build Coastguard Workerif [ "$(uname -m)" = x86_64 ]; then 188*6777b538SAndroid Build Coastguard Worker while :; do 189*6777b538SAndroid Build Coastguard Worker echo "You are running a 64bit kernel. This allows you to install either a" 190*6777b538SAndroid Build Coastguard Worker printf "32bit or a 64bit chroot environment. %s" \ 191*6777b538SAndroid Build Coastguard Worker "Which one do you want (32, 64) " 192*6777b538SAndroid Build Coastguard Worker read arch 193*6777b538SAndroid Build Coastguard Worker [ "${arch}" == 32 -o "${arch}" == 64 ] && break 194*6777b538SAndroid Build Coastguard Worker done 195*6777b538SAndroid Build Coastguard Worker [ "${arch}" == 32 ] && archflag="--arch i386" || archflag="--arch amd64" 196*6777b538SAndroid Build Coastguard Worker arch="${arch}bit" 197*6777b538SAndroid Build Coastguard Worker echo 198*6777b538SAndroid Build Coastguard Workerfi 199*6777b538SAndroid Build Coastguard Workertarget="${distname}${arch}" 200*6777b538SAndroid Build Coastguard Worker 201*6777b538SAndroid Build Coastguard Worker# Don't accidentally overwrite an existing installation 202*6777b538SAndroid Build Coastguard Worker[ -d /var/lib/chroot/"${target}" ] && { 203*6777b538SAndroid Build Coastguard Worker while :; do 204*6777b538SAndroid Build Coastguard Worker echo "This chroot already exists on your machine." 205*6777b538SAndroid Build Coastguard Worker if schroot -l --all-sessions 2>&1 | 206*6777b538SAndroid Build Coastguard Worker sed 's/^session://' | 207*6777b538SAndroid Build Coastguard Worker grep -qs "^${target%bit}-"; then 208*6777b538SAndroid Build Coastguard Worker echo "And it appears to be in active use. Terminate all programs that" 209*6777b538SAndroid Build Coastguard Worker echo "are currently using the chroot environment and then re-run this" 210*6777b538SAndroid Build Coastguard Worker echo "script." 211*6777b538SAndroid Build Coastguard Worker echo "If you still get an error message, you might have stale mounts" 212*6777b538SAndroid Build Coastguard Worker echo "that you forgot to delete. You can always clean up mounts by" 213*6777b538SAndroid Build Coastguard Worker echo "executing \"${target%bit} -c\"." 214*6777b538SAndroid Build Coastguard Worker exit 1 215*6777b538SAndroid Build Coastguard Worker fi 216*6777b538SAndroid Build Coastguard Worker echo "I can abort installation, I can overwrite the existing chroot," 217*6777b538SAndroid Build Coastguard Worker echo "or I can delete the old one and then exit. What would you like to" 218*6777b538SAndroid Build Coastguard Worker printf "do (a/o/d)? " 219*6777b538SAndroid Build Coastguard Worker read choice 220*6777b538SAndroid Build Coastguard Worker case "${choice}" in 221*6777b538SAndroid Build Coastguard Worker a|A) exit 1;; 222*6777b538SAndroid Build Coastguard Worker o|O) sudo rm -rf "/var/lib/chroot/${target}"; break;; 223*6777b538SAndroid Build Coastguard Worker d|D) sudo rm -rf "/var/lib/chroot/${target}" \ 224*6777b538SAndroid Build Coastguard Worker "/usr/local/bin/${target%bit}" \ 225*6777b538SAndroid Build Coastguard Worker "/etc/schroot/mount-${target}" \ 226*6777b538SAndroid Build Coastguard Worker "/etc/schroot/script-${target}" \ 227*6777b538SAndroid Build Coastguard Worker "/etc/schroot/${target}" 228*6777b538SAndroid Build Coastguard Worker sudo sed -ni '/^[[]'"${target%bit}"']$/,${ 229*6777b538SAndroid Build Coastguard Worker :1;n;/^[[]/b2;b1;:2;p;n;b2};p' \ 230*6777b538SAndroid Build Coastguard Worker "/etc/schroot/schroot.conf" 231*6777b538SAndroid Build Coastguard Worker trap '' INT TERM QUIT HUP 232*6777b538SAndroid Build Coastguard Worker trap '' EXIT 233*6777b538SAndroid Build Coastguard Worker echo "Deleted!" 234*6777b538SAndroid Build Coastguard Worker exit 0;; 235*6777b538SAndroid Build Coastguard Worker esac 236*6777b538SAndroid Build Coastguard Worker done 237*6777b538SAndroid Build Coastguard Worker echo 238*6777b538SAndroid Build Coastguard Worker} 239*6777b538SAndroid Build Coastguard Workersudo mkdir -p /var/lib/chroot/"${target}" 240*6777b538SAndroid Build Coastguard Worker 241*6777b538SAndroid Build Coastguard Worker# Offer to include additional standard repositories for Ubuntu-based chroots. 242*6777b538SAndroid Build Coastguard Workeralt_repos= 243*6777b538SAndroid Build Coastguard Workergrep -qs ubuntu.com /usr/share/debootstrap/scripts/"${distname}" && { 244*6777b538SAndroid Build Coastguard Worker while :; do 245*6777b538SAndroid Build Coastguard Worker echo "Would you like to add ${distname}-updates and ${distname}-security " 246*6777b538SAndroid Build Coastguard Worker printf "to the chroot's sources.list (y/n)? " 247*6777b538SAndroid Build Coastguard Worker read alt_repos 248*6777b538SAndroid Build Coastguard Worker case "${alt_repos}" in 249*6777b538SAndroid Build Coastguard Worker y|Y) 250*6777b538SAndroid Build Coastguard Worker alt_repos="y" 251*6777b538SAndroid Build Coastguard Worker break 252*6777b538SAndroid Build Coastguard Worker ;; 253*6777b538SAndroid Build Coastguard Worker n|N) 254*6777b538SAndroid Build Coastguard Worker break 255*6777b538SAndroid Build Coastguard Worker ;; 256*6777b538SAndroid Build Coastguard Worker esac 257*6777b538SAndroid Build Coastguard Worker done 258*6777b538SAndroid Build Coastguard Worker echo 259*6777b538SAndroid Build Coastguard Worker} 260*6777b538SAndroid Build Coastguard Worker 261*6777b538SAndroid Build Coastguard Worker# Check for non-standard file system mount points and ask the user whether 262*6777b538SAndroid Build Coastguard Worker# they should be imported into the chroot environment 263*6777b538SAndroid Build Coastguard Worker# We limit to the first 26 mount points that much some basic heuristics, 264*6777b538SAndroid Build Coastguard Worker# because a) that allows us to enumerate choices with a single character, 265*6777b538SAndroid Build Coastguard Worker# and b) if we find more than 26 mount points, then these are probably 266*6777b538SAndroid Build Coastguard Worker# false-positives and something is very unusual about the system's 267*6777b538SAndroid Build Coastguard Worker# configuration. No need to spam the user with even more information that 268*6777b538SAndroid Build Coastguard Worker# is likely completely irrelevant. 269*6777b538SAndroid Build Coastguard Workerif [ -z "${bind_mounts}" ]; then 270*6777b538SAndroid Build Coastguard Worker mounts="$(awk '$2 != "/" && $2 !~ "^/boot" && $2 !~ "^/home" && 271*6777b538SAndroid Build Coastguard Worker $2 !~ "^/media" && $2 !~ "^/run" && 272*6777b538SAndroid Build Coastguard Worker ($3 ~ "ext[2-4]" || $3 == "reiserfs" || $3 == "btrfs" || 273*6777b538SAndroid Build Coastguard Worker $3 == "xfs" || $3 == "jfs" || $3 == "u?msdos" || 274*6777b538SAndroid Build Coastguard Worker $3 == "v?fat" || $3 == "hfs" || $3 == "ntfs" || 275*6777b538SAndroid Build Coastguard Worker $3 ~ "nfs[4-9]?" || $3 == "smbfs" || $3 == "cifs") { 276*6777b538SAndroid Build Coastguard Worker print $2 277*6777b538SAndroid Build Coastguard Worker }' /proc/mounts | 278*6777b538SAndroid Build Coastguard Worker head -n26)" 279*6777b538SAndroid Build Coastguard Worker if [ -n "${mounts}" ]; then 280*6777b538SAndroid Build Coastguard Worker echo "You appear to have non-standard mount points that you" 281*6777b538SAndroid Build Coastguard Worker echo "might want to import into the chroot environment:" 282*6777b538SAndroid Build Coastguard Worker echo 283*6777b538SAndroid Build Coastguard Worker sel= 284*6777b538SAndroid Build Coastguard Worker while :; do 285*6777b538SAndroid Build Coastguard Worker # Print a menu, listing all non-default mounts of local or network 286*6777b538SAndroid Build Coastguard Worker # file systems. 287*6777b538SAndroid Build Coastguard Worker j=1; for m in ${mounts}; do 288*6777b538SAndroid Build Coastguard Worker c="$(printf $(printf '\\%03o' $((64+$j))))" 289*6777b538SAndroid Build Coastguard Worker echo "$sel" | grep -qs $c && 290*6777b538SAndroid Build Coastguard Worker state="mounted in chroot" || state="$(tput el)" 291*6777b538SAndroid Build Coastguard Worker printf " $c) %-40s${state}\n" "$m" 292*6777b538SAndroid Build Coastguard Worker j=$(($j+1)) 293*6777b538SAndroid Build Coastguard Worker done 294*6777b538SAndroid Build Coastguard Worker # Allow user to interactively (de-)select any of the entries 295*6777b538SAndroid Build Coastguard Worker echo 296*6777b538SAndroid Build Coastguard Worker printf "Select mount points that you want to be included or press %s" \ 297*6777b538SAndroid Build Coastguard Worker "SPACE to continue" 298*6777b538SAndroid Build Coastguard Worker c="$(getkey | tr a-z A-Z)" 299*6777b538SAndroid Build Coastguard Worker [ "$c" == " " ] && { echo; echo; break; } 300*6777b538SAndroid Build Coastguard Worker if [ -z "$c" ] || 301*6777b538SAndroid Build Coastguard Worker [ "$c" '<' 'A' -o $(ord "$c") -gt $((64 + $(ord "$j"))) ]; then 302*6777b538SAndroid Build Coastguard Worker # Invalid input, ring the console bell 303*6777b538SAndroid Build Coastguard Worker tput bel 304*6777b538SAndroid Build Coastguard Worker else 305*6777b538SAndroid Build Coastguard Worker # Toggle the selection for the given entry 306*6777b538SAndroid Build Coastguard Worker if echo "$sel" | grep -qs $c; then 307*6777b538SAndroid Build Coastguard Worker sel="$(printf "$sel" | sed "s/$c//")" 308*6777b538SAndroid Build Coastguard Worker else 309*6777b538SAndroid Build Coastguard Worker sel="$sel$c" 310*6777b538SAndroid Build Coastguard Worker fi 311*6777b538SAndroid Build Coastguard Worker fi 312*6777b538SAndroid Build Coastguard Worker # Reposition cursor to the top of the list of entries 313*6777b538SAndroid Build Coastguard Worker tput cuu $(($j + 1)) 314*6777b538SAndroid Build Coastguard Worker echo 315*6777b538SAndroid Build Coastguard Worker done 316*6777b538SAndroid Build Coastguard Worker fi 317*6777b538SAndroid Build Coastguard Worker j=1; for m in ${mounts}; do 318*6777b538SAndroid Build Coastguard Worker c="$(chr $(($j + 64)))" 319*6777b538SAndroid Build Coastguard Worker if echo "$sel" | grep -qs $c; then 320*6777b538SAndroid Build Coastguard Worker bind_mounts="${bind_mounts}$m $m none rw,bind 0 0 321*6777b538SAndroid Build Coastguard Worker" 322*6777b538SAndroid Build Coastguard Worker fi 323*6777b538SAndroid Build Coastguard Worker j=$(($j+1)) 324*6777b538SAndroid Build Coastguard Worker done 325*6777b538SAndroid Build Coastguard Workerfi 326*6777b538SAndroid Build Coastguard Worker 327*6777b538SAndroid Build Coastguard Worker# Remove stale entry from /etc/schroot/schroot.conf. Entries start 328*6777b538SAndroid Build Coastguard Worker# with the target name in square brackets, followed by an arbitrary 329*6777b538SAndroid Build Coastguard Worker# number of lines. The entry stops when either the end of file has 330*6777b538SAndroid Build Coastguard Worker# been reached, or when the beginning of a new target is encountered. 331*6777b538SAndroid Build Coastguard Worker# This means, we cannot easily match for a range of lines in 332*6777b538SAndroid Build Coastguard Worker# "sed". Instead, we actually have to iterate over each line and check 333*6777b538SAndroid Build Coastguard Worker# whether it is the beginning of a new entry. 334*6777b538SAndroid Build Coastguard Workersudo sed -ni '/^[[]'"${target%bit}"']$/,${:1;n;/^[[]/b2;b1;:2;p;n;b2};p' \ 335*6777b538SAndroid Build Coastguard Worker /etc/schroot/schroot.conf 336*6777b538SAndroid Build Coastguard Worker 337*6777b538SAndroid Build Coastguard Worker# Download base system. This takes some time 338*6777b538SAndroid Build Coastguard Workerif [ -z "${mirror}" ]; then 339*6777b538SAndroid Build Coastguard Worker grep -qs ubuntu.com /usr/share/debootstrap/scripts/"${distname}" && 340*6777b538SAndroid Build Coastguard Worker mirror="http://archive.ubuntu.com/ubuntu" || 341*6777b538SAndroid Build Coastguard Worker mirror="http://ftp.us.debian.org/debian" 342*6777b538SAndroid Build Coastguard Workerfi 343*6777b538SAndroid Build Coastguard Worker 344*6777b538SAndroid Build Coastguard Workersudo ${http_proxy:+http_proxy="${http_proxy}"} debootstrap ${archflag} \ 345*6777b538SAndroid Build Coastguard Worker "${distname}" "/var/lib/chroot/${target}" "$mirror" 346*6777b538SAndroid Build Coastguard Worker 347*6777b538SAndroid Build Coastguard Worker# Add new entry to /etc/schroot/schroot.conf 348*6777b538SAndroid Build Coastguard Workergrep -qs ubuntu.com /usr/share/debootstrap/scripts/"${distname}" && 349*6777b538SAndroid Build Coastguard Worker brand="Ubuntu" || brand="Debian" 350*6777b538SAndroid Build Coastguard Workerif [ -z "${chroot_groups}" ]; then 351*6777b538SAndroid Build Coastguard Worker chroot_groups="${admin},$(id -gn)" 352*6777b538SAndroid Build Coastguard Workerfi 353*6777b538SAndroid Build Coastguard Worker 354*6777b538SAndroid Build Coastguard Workerif [ -d '/etc/schroot/default' ]; then 355*6777b538SAndroid Build Coastguard Worker new_version=1 356*6777b538SAndroid Build Coastguard Worker fstab="/etc/schroot/${target}/fstab" 357*6777b538SAndroid Build Coastguard Workerelse 358*6777b538SAndroid Build Coastguard Worker new_version=0 359*6777b538SAndroid Build Coastguard Worker fstab="/etc/schroot/mount-${target}" 360*6777b538SAndroid Build Coastguard Workerfi 361*6777b538SAndroid Build Coastguard Worker 362*6777b538SAndroid Build Coastguard Workerif [ "$new_version" = "1" ]; then 363*6777b538SAndroid Build Coastguard Worker sudo cp -ar /etc/schroot/default /etc/schroot/${target} 364*6777b538SAndroid Build Coastguard Worker 365*6777b538SAndroid Build Coastguard Worker sudo sh -c 'cat >>/etc/schroot/schroot.conf' <<EOF 366*6777b538SAndroid Build Coastguard Worker[${target%bit}] 367*6777b538SAndroid Build Coastguard Workerdescription=${brand} ${distname} ${arch} 368*6777b538SAndroid Build Coastguard Workertype=directory 369*6777b538SAndroid Build Coastguard Workerdirectory=/var/lib/chroot/${target} 370*6777b538SAndroid Build Coastguard Workerusers=root 371*6777b538SAndroid Build Coastguard Workergroups=${chroot_groups} 372*6777b538SAndroid Build Coastguard Workerroot-groups=${chroot_groups} 373*6777b538SAndroid Build Coastguard Workerpersonality=linux$([ "${arch}" != 64bit ] && echo 32) 374*6777b538SAndroid Build Coastguard Workerprofile=${target} 375*6777b538SAndroid Build Coastguard Worker 376*6777b538SAndroid Build Coastguard WorkerEOF 377*6777b538SAndroid Build Coastguard Worker [ -n "${bind_mounts}" -a "${bind_mounts}" != "NONE" ] && 378*6777b538SAndroid Build Coastguard Worker printf "${bind_mounts}" | 379*6777b538SAndroid Build Coastguard Worker sudo sh -c "cat >>${fstab}" 380*6777b538SAndroid Build Coastguard Workerelse 381*6777b538SAndroid Build Coastguard Worker # Older versions of schroot wanted a "priority=" line, whereas recent 382*6777b538SAndroid Build Coastguard Worker # versions deprecate "priority=" and warn if they see it. We don't have 383*6777b538SAndroid Build Coastguard Worker # a good feature test, but scanning for the string "priority=" in the 384*6777b538SAndroid Build Coastguard Worker # existing "schroot.conf" file is a good indication of what to do. 385*6777b538SAndroid Build Coastguard Worker priority=$(grep -qs 'priority=' /etc/schroot/schroot.conf && 386*6777b538SAndroid Build Coastguard Worker echo 'priority=3' || :) 387*6777b538SAndroid Build Coastguard Worker sudo sh -c 'cat >>/etc/schroot/schroot.conf' <<EOF 388*6777b538SAndroid Build Coastguard Worker[${target%bit}] 389*6777b538SAndroid Build Coastguard Workerdescription=${brand} ${distname} ${arch} 390*6777b538SAndroid Build Coastguard Workertype=directory 391*6777b538SAndroid Build Coastguard Workerdirectory=/var/lib/chroot/${target} 392*6777b538SAndroid Build Coastguard Workerusers=root 393*6777b538SAndroid Build Coastguard Workergroups=${chroot_groups} 394*6777b538SAndroid Build Coastguard Workerroot-groups=${chroot_groups} 395*6777b538SAndroid Build Coastguard Workerpersonality=linux$([ "${arch}" != 64bit ] && echo 32) 396*6777b538SAndroid Build Coastguard Workerscript-config=script-${target} 397*6777b538SAndroid Build Coastguard Worker${priority} 398*6777b538SAndroid Build Coastguard Worker 399*6777b538SAndroid Build Coastguard WorkerEOF 400*6777b538SAndroid Build Coastguard Worker 401*6777b538SAndroid Build Coastguard Worker # Set up a list of mount points that is specific to this 402*6777b538SAndroid Build Coastguard Worker # chroot environment. 403*6777b538SAndroid Build Coastguard Worker sed '/^FSTAB=/s,"[^"]*","'"${fstab}"'",' \ 404*6777b538SAndroid Build Coastguard Worker /etc/schroot/script-defaults | 405*6777b538SAndroid Build Coastguard Worker sudo sh -c 'cat >/etc/schroot/script-'"${target}" 406*6777b538SAndroid Build Coastguard Worker sed '\,^/home[/[:space:]],s/\([,[:space:]]\)bind[[:space:]]/\1rbind /' \ 407*6777b538SAndroid Build Coastguard Worker /etc/schroot/mount-defaults | 408*6777b538SAndroid Build Coastguard Worker sudo sh -c "cat > ${fstab}" 409*6777b538SAndroid Build Coastguard Workerfi 410*6777b538SAndroid Build Coastguard Worker 411*6777b538SAndroid Build Coastguard Worker# Add the extra mount points that the user told us about 412*6777b538SAndroid Build Coastguard Worker[ -n "${bind_mounts}" -a "${bind_mounts}" != "NONE" ] && 413*6777b538SAndroid Build Coastguard Worker printf "${bind_mounts}" | 414*6777b538SAndroid Build Coastguard Worker sudo sh -c 'cat >>'"${fstab}" 415*6777b538SAndroid Build Coastguard Worker 416*6777b538SAndroid Build Coastguard Worker# If this system has a "/media" mountpoint, import it into the chroot 417*6777b538SAndroid Build Coastguard Worker# environment. Most modern distributions use this mount point to 418*6777b538SAndroid Build Coastguard Worker# automatically mount devices such as CDROMs, USB sticks, etc... 419*6777b538SAndroid Build Coastguard Workerif [ -d /media ] && 420*6777b538SAndroid Build Coastguard Worker ! grep -qs '^/media' "${fstab}"; then 421*6777b538SAndroid Build Coastguard Worker echo '/media /media none rw,rbind 0 0' | 422*6777b538SAndroid Build Coastguard Worker sudo sh -c 'cat >>'"${fstab}" 423*6777b538SAndroid Build Coastguard Workerfi 424*6777b538SAndroid Build Coastguard Worker 425*6777b538SAndroid Build Coastguard Worker# Share /dev/shm, /run and /run/shm. 426*6777b538SAndroid Build Coastguard Workergrep -qs '^/dev/shm' "${fstab}" || 427*6777b538SAndroid Build Coastguard Worker echo '/dev/shm /dev/shm none rw,bind 0 0' | 428*6777b538SAndroid Build Coastguard Worker sudo sh -c 'cat >>'"${fstab}" 429*6777b538SAndroid Build Coastguard Workerif [ ! -d "/var/lib/chroot/${target}/run" ] && 430*6777b538SAndroid Build Coastguard Worker ! grep -qs '^/run' "${fstab}"; then 431*6777b538SAndroid Build Coastguard Worker echo '/run /run none rw,bind 0 0' | 432*6777b538SAndroid Build Coastguard Worker sudo sh -c 'cat >>'"${fstab}" 433*6777b538SAndroid Build Coastguard Workerfi 434*6777b538SAndroid Build Coastguard Workerif ! grep -qs '^/run/shm' "${fstab}"; then 435*6777b538SAndroid Build Coastguard Worker { [ -d /run ] && echo '/run/shm /run/shm none rw,bind 0 0' || 436*6777b538SAndroid Build Coastguard Worker echo '/dev/shm /run/shm none rw,bind 0 0'; } | 437*6777b538SAndroid Build Coastguard Worker sudo sh -c 'cat >>'"${fstab}" 438*6777b538SAndroid Build Coastguard Workerfi 439*6777b538SAndroid Build Coastguard Worker 440*6777b538SAndroid Build Coastguard Worker# Set up a special directory that changes contents depending on the target 441*6777b538SAndroid Build Coastguard Worker# that is executing. 442*6777b538SAndroid Build Coastguard Workerd="$(readlink -f "${HOME}/chroot" 2>/dev/null || echo "${HOME}/chroot")" 443*6777b538SAndroid Build Coastguard Workers="${d}/.${target}" 444*6777b538SAndroid Build Coastguard Workerecho "${s} ${d} none rw,bind 0 0" | 445*6777b538SAndroid Build Coastguard Worker sudo sh -c 'cat >>'"${target}" 446*6777b538SAndroid Build Coastguard Workermkdir -p "${s}" 447*6777b538SAndroid Build Coastguard Worker 448*6777b538SAndroid Build Coastguard Worker# Install a helper script to launch commands in the chroot 449*6777b538SAndroid Build Coastguard Workersudo sh -c 'cat >/usr/local/bin/'"${target%bit}" <<'EOF' 450*6777b538SAndroid Build Coastguard Worker#!/bin/bash 451*6777b538SAndroid Build Coastguard Worker 452*6777b538SAndroid Build Coastguard Workerchroot="${0##*/}" 453*6777b538SAndroid Build Coastguard Worker 454*6777b538SAndroid Build Coastguard Workerwrap() { 455*6777b538SAndroid Build Coastguard Worker # Word-wrap the text passed-in on stdin. Optionally, on continuation lines 456*6777b538SAndroid Build Coastguard Worker # insert the same number of spaces as the number of characters in the 457*6777b538SAndroid Build Coastguard Worker # parameter(s) passed to this function. 458*6777b538SAndroid Build Coastguard Worker # If the "fold" program cannot be found, or if the actual width of the 459*6777b538SAndroid Build Coastguard Worker # terminal cannot be determined, this function doesn't attempt to do any 460*6777b538SAndroid Build Coastguard Worker # wrapping. 461*6777b538SAndroid Build Coastguard Worker local f="$(type -P fold)" 462*6777b538SAndroid Build Coastguard Worker [ -z "${f}" ] && { cat; return; } 463*6777b538SAndroid Build Coastguard Worker local c="$(stty -a </dev/tty 2>/dev/null | 464*6777b538SAndroid Build Coastguard Worker sed 's/.*columns[[:space:]]*\([0-9]*\).*/\1/;t;d')" 465*6777b538SAndroid Build Coastguard Worker [ -z "${c}" ] && { cat; return; } 466*6777b538SAndroid Build Coastguard Worker local i="$(echo "$*"|sed 's/./ /g')" 467*6777b538SAndroid Build Coastguard Worker local j="$(printf %s "${i}"|wc -c)" 468*6777b538SAndroid Build Coastguard Worker if [ "${c}" -gt "${j}" ]; then 469*6777b538SAndroid Build Coastguard Worker dd bs=1 count="${j}" 2>/dev/null 470*6777b538SAndroid Build Coastguard Worker "${f}" -sw "$((${c}-${j}))" | sed '2,$s/^/'"${i}"'/' 471*6777b538SAndroid Build Coastguard Worker else 472*6777b538SAndroid Build Coastguard Worker "${f}" -sw "${c}" 473*6777b538SAndroid Build Coastguard Worker fi 474*6777b538SAndroid Build Coastguard Worker} 475*6777b538SAndroid Build Coastguard Worker 476*6777b538SAndroid Build Coastguard Workerhelp() { 477*6777b538SAndroid Build Coastguard Worker echo "Usage ${0##*/} [-h|--help] [-c|--clean] [-C|--clean-all] [-l|--list] [--] args" | wrap "Usage ${0##*/} " 478*6777b538SAndroid Build Coastguard Worker echo " help: print this message" | wrap " " 479*6777b538SAndroid Build Coastguard Worker echo " list: list all known chroot environments" | wrap " " 480*6777b538SAndroid Build Coastguard Worker echo " clean: remove all old chroot sessions for \"${chroot}\"" | wrap " " 481*6777b538SAndroid Build Coastguard Worker echo " clean-all: remove all old chroot sessions for all environments" | wrap " " 482*6777b538SAndroid Build Coastguard Worker exit 0 483*6777b538SAndroid Build Coastguard Worker} 484*6777b538SAndroid Build Coastguard Worker 485*6777b538SAndroid Build Coastguard Workerclean() { 486*6777b538SAndroid Build Coastguard Worker local s t rc 487*6777b538SAndroid Build Coastguard Worker rc=0 488*6777b538SAndroid Build Coastguard Worker for s in $(schroot -l --all-sessions); do 489*6777b538SAndroid Build Coastguard Worker if [ -n "$1" ]; then 490*6777b538SAndroid Build Coastguard Worker t="${s#session:}" 491*6777b538SAndroid Build Coastguard Worker [ "${t#${chroot}-}" == "${t}" ] && continue 492*6777b538SAndroid Build Coastguard Worker fi 493*6777b538SAndroid Build Coastguard Worker if ls -l /proc/*/{cwd,fd} 2>/dev/null | 494*6777b538SAndroid Build Coastguard Worker fgrep -qs "/var/lib/schroot/mount/${t}"; then 495*6777b538SAndroid Build Coastguard Worker echo "Session \"${t}\" still has active users, not cleaning up" | wrap 496*6777b538SAndroid Build Coastguard Worker rc=1 497*6777b538SAndroid Build Coastguard Worker continue 498*6777b538SAndroid Build Coastguard Worker fi 499*6777b538SAndroid Build Coastguard Worker sudo schroot -c "${s}" -e || rc=1 500*6777b538SAndroid Build Coastguard Worker done 501*6777b538SAndroid Build Coastguard Worker exit ${rc} 502*6777b538SAndroid Build Coastguard Worker} 503*6777b538SAndroid Build Coastguard Worker 504*6777b538SAndroid Build Coastguard Workerlist() { 505*6777b538SAndroid Build Coastguard Worker for e in $(schroot -l); do 506*6777b538SAndroid Build Coastguard Worker e="${e#chroot:}" 507*6777b538SAndroid Build Coastguard Worker [ -x "/usr/local/bin/${e}" ] || continue 508*6777b538SAndroid Build Coastguard Worker if schroot -l --all-sessions 2>/dev/null | 509*6777b538SAndroid Build Coastguard Worker sed 's/^session://' | 510*6777b538SAndroid Build Coastguard Worker grep -qs "^${e}-"; then 511*6777b538SAndroid Build Coastguard Worker echo "${e} is currently active" 512*6777b538SAndroid Build Coastguard Worker else 513*6777b538SAndroid Build Coastguard Worker echo "${e}" 514*6777b538SAndroid Build Coastguard Worker fi 515*6777b538SAndroid Build Coastguard Worker done 516*6777b538SAndroid Build Coastguard Worker exit 0 517*6777b538SAndroid Build Coastguard Worker} 518*6777b538SAndroid Build Coastguard Worker 519*6777b538SAndroid Build Coastguard Workerwhile [ "$#" -ne 0 ]; do 520*6777b538SAndroid Build Coastguard Worker case "$1" in 521*6777b538SAndroid Build Coastguard Worker --) shift; break;; 522*6777b538SAndroid Build Coastguard Worker -h|--help) shift; help;; 523*6777b538SAndroid Build Coastguard Worker -l|--list) shift; list;; 524*6777b538SAndroid Build Coastguard Worker -c|--clean) shift; clean "${chroot}";; 525*6777b538SAndroid Build Coastguard Worker -C|--clean-all) shift; clean;; 526*6777b538SAndroid Build Coastguard Worker *) break;; 527*6777b538SAndroid Build Coastguard Worker esac 528*6777b538SAndroid Build Coastguard Workerdone 529*6777b538SAndroid Build Coastguard Worker 530*6777b538SAndroid Build Coastguard Worker# Start a new chroot session and keep track of the session id. We inject this 531*6777b538SAndroid Build Coastguard Worker# id into all processes that run inside the chroot. Unless they go out of their 532*6777b538SAndroid Build Coastguard Worker# way to clear their environment, we can then later identify our child and 533*6777b538SAndroid Build Coastguard Worker# grand-child processes by scanning their environment. 534*6777b538SAndroid Build Coastguard Workersession="$(schroot -c "${chroot}" -b)" 535*6777b538SAndroid Build Coastguard Workerexport CHROOT_SESSION_ID="${session}" 536*6777b538SAndroid Build Coastguard Worker 537*6777b538SAndroid Build Coastguard Worker# Set GOMA_TMP_DIR for better handling of goma inside chroot. 538*6777b538SAndroid Build Coastguard Workerexport GOMA_TMP_DIR="/tmp/goma_tmp_$CHROOT_SESSION_ID" 539*6777b538SAndroid Build Coastguard Workermkdir -p "$GOMA_TMP_DIR" 540*6777b538SAndroid Build Coastguard Worker 541*6777b538SAndroid Build Coastguard Workerif [ $# -eq 0 ]; then 542*6777b538SAndroid Build Coastguard Worker # Run an interactive shell session 543*6777b538SAndroid Build Coastguard Worker schroot -c "${session}" -r -p 544*6777b538SAndroid Build Coastguard Workerelse 545*6777b538SAndroid Build Coastguard Worker # Run a command inside of the chroot environment 546*6777b538SAndroid Build Coastguard Worker p="$1"; shift 547*6777b538SAndroid Build Coastguard Worker schroot -c "${session}" -r -p "$p" -- "$@" 548*6777b538SAndroid Build Coastguard Workerfi 549*6777b538SAndroid Build Coastguard Workerrc=$? 550*6777b538SAndroid Build Coastguard Worker 551*6777b538SAndroid Build Coastguard Worker# Compute the inode of the root directory inside of the chroot environment. 552*6777b538SAndroid Build Coastguard Workeri=$(schroot -c "${session}" -r -p ls -- -id /proc/self/root/. | 553*6777b538SAndroid Build Coastguard Worker awk '{ print $1 }') 2>/dev/null 554*6777b538SAndroid Build Coastguard Workerother_pids= 555*6777b538SAndroid Build Coastguard Workerwhile [ -n "$i" ]; do 556*6777b538SAndroid Build Coastguard Worker # Identify processes by the inode number of their root directory. Then 557*6777b538SAndroid Build Coastguard Worker # remove all processes that we know belong to other sessions. We use 558*6777b538SAndroid Build Coastguard Worker # "sort | uniq -u" to do what amounts to a "set subtraction operation". 559*6777b538SAndroid Build Coastguard Worker pids=$({ ls -id1 /proc/*/root/. 2>/dev/null | 560*6777b538SAndroid Build Coastguard Worker sed -e 's,^[^0-9]*'$i'.*/\([1-9][0-9]*\)/.*$,\1, 561*6777b538SAndroid Build Coastguard Worker t 562*6777b538SAndroid Build Coastguard Worker d'; 563*6777b538SAndroid Build Coastguard Worker echo "${other_pids}"; 564*6777b538SAndroid Build Coastguard Worker echo "${other_pids}"; } | sort | uniq -u) >/dev/null 2>&1 565*6777b538SAndroid Build Coastguard Worker # Kill all processes that are still left running in the session. This is 566*6777b538SAndroid Build Coastguard Worker # typically an assortment of daemon processes that were started 567*6777b538SAndroid Build Coastguard Worker # automatically. They result in us being unable to tear down the session 568*6777b538SAndroid Build Coastguard Worker # cleanly. 569*6777b538SAndroid Build Coastguard Worker [ -z "${pids}" ] && break 570*6777b538SAndroid Build Coastguard Worker for j in $pids; do 571*6777b538SAndroid Build Coastguard Worker # Unfortunately, the way that schroot sets up sessions has the 572*6777b538SAndroid Build Coastguard Worker # side-effect of being unable to tell one session apart from another. 573*6777b538SAndroid Build Coastguard Worker # This can result in us attempting to kill processes in other sessions. 574*6777b538SAndroid Build Coastguard Worker # We make a best-effort to avoid doing so. 575*6777b538SAndroid Build Coastguard Worker k="$( ( xargs -0 -n1 </proc/$j/environ ) 2>/dev/null | 576*6777b538SAndroid Build Coastguard Worker sed 's/^CHROOT_SESSION_ID=/x/;t1;d;:1;q')" 577*6777b538SAndroid Build Coastguard Worker if [ -n "${k}" -a "${k#x}" != "${session}" ]; then 578*6777b538SAndroid Build Coastguard Worker other_pids="${other_pids} 579*6777b538SAndroid Build Coastguard Worker${j}" 580*6777b538SAndroid Build Coastguard Worker continue 581*6777b538SAndroid Build Coastguard Worker fi 582*6777b538SAndroid Build Coastguard Worker kill -9 $pids 583*6777b538SAndroid Build Coastguard Worker done 584*6777b538SAndroid Build Coastguard Workerdone 585*6777b538SAndroid Build Coastguard Worker# End the chroot session. This should clean up all temporary files. But if we 586*6777b538SAndroid Build Coastguard Worker# earlier failed to terminate all (daemon) processes inside of the session, 587*6777b538SAndroid Build Coastguard Worker# deleting the session could fail. When that happens, the user has to manually 588*6777b538SAndroid Build Coastguard Worker# clean up the stale files by invoking us with "--clean" after having killed 589*6777b538SAndroid Build Coastguard Worker# all running processes. 590*6777b538SAndroid Build Coastguard Workerschroot -c "${session}" -e 591*6777b538SAndroid Build Coastguard Worker# Since no goma processes are running, we can remove goma directory. 592*6777b538SAndroid Build Coastguard Workerrm -rf "$GOMA_TMP_DIR" 593*6777b538SAndroid Build Coastguard Workerexit $rc 594*6777b538SAndroid Build Coastguard WorkerEOF 595*6777b538SAndroid Build Coastguard Workersudo chown root:root /usr/local/bin/"${target%bit}" 596*6777b538SAndroid Build Coastguard Workersudo chmod 755 /usr/local/bin/"${target%bit}" 597*6777b538SAndroid Build Coastguard Worker 598*6777b538SAndroid Build Coastguard Worker# Add the standard Ubuntu update repositories if requested. 599*6777b538SAndroid Build Coastguard Worker[ "${alt_repos}" = "y" -a \ 600*6777b538SAndroid Build Coastguard Worker -r "/var/lib/chroot/${target}/etc/apt/sources.list" ] && 601*6777b538SAndroid Build Coastguard Workersudo sed -i '/^deb .* [^ -]\+ main$/p 602*6777b538SAndroid Build Coastguard Worker s/^\(deb .* [^ -]\+\) main/\1-security main/ 603*6777b538SAndroid Build Coastguard Worker p 604*6777b538SAndroid Build Coastguard Worker t1 605*6777b538SAndroid Build Coastguard Worker d 606*6777b538SAndroid Build Coastguard Worker :1;s/-security main/-updates main/ 607*6777b538SAndroid Build Coastguard Worker t 608*6777b538SAndroid Build Coastguard Worker d' "/var/lib/chroot/${target}/etc/apt/sources.list" 609*6777b538SAndroid Build Coastguard Worker 610*6777b538SAndroid Build Coastguard Worker# Add a few more repositories to the chroot 611*6777b538SAndroid Build Coastguard Worker[ -r "/var/lib/chroot/${target}/etc/apt/sources.list" ] && 612*6777b538SAndroid Build Coastguard Workersudo sed -i 's/ main$/ main restricted universe multiverse/' \ 613*6777b538SAndroid Build Coastguard Worker "/var/lib/chroot/${target}/etc/apt/sources.list" 614*6777b538SAndroid Build Coastguard Worker 615*6777b538SAndroid Build Coastguard Worker# Add the Ubuntu "partner" repository, if available 616*6777b538SAndroid Build Coastguard Workerif [ -r "/var/lib/chroot/${target}/etc/apt/sources.list" ] && 617*6777b538SAndroid Build Coastguard Worker HEAD "http://archive.canonical.com/ubuntu/dists/${distname}/partner" \ 618*6777b538SAndroid Build Coastguard Worker >&/dev/null; then 619*6777b538SAndroid Build Coastguard Worker sudo sh -c ' 620*6777b538SAndroid Build Coastguard Worker echo "deb http://archive.canonical.com/ubuntu" \ 621*6777b538SAndroid Build Coastguard Worker "'"${distname}"' partner" \ 622*6777b538SAndroid Build Coastguard Worker >>"/var/lib/chroot/'"${target}"'/etc/apt/sources.list"' 623*6777b538SAndroid Build Coastguard Workerfi 624*6777b538SAndroid Build Coastguard Worker 625*6777b538SAndroid Build Coastguard Worker# Add source repositories, if the user requested we do so 626*6777b538SAndroid Build Coastguard Worker[ "${add_srcs}" = "y" -a \ 627*6777b538SAndroid Build Coastguard Worker -r "/var/lib/chroot/${target}/etc/apt/sources.list" ] && 628*6777b538SAndroid Build Coastguard Workersudo sed -i '/^deb[^-]/p 629*6777b538SAndroid Build Coastguard Worker s/^deb\([^-]\)/deb-src\1/' \ 630*6777b538SAndroid Build Coastguard Worker "/var/lib/chroot/${target}/etc/apt/sources.list" 631*6777b538SAndroid Build Coastguard Worker 632*6777b538SAndroid Build Coastguard Worker# Set apt proxy if host has set http_proxy 633*6777b538SAndroid Build Coastguard Workerif [ -n "${http_proxy}" ]; then 634*6777b538SAndroid Build Coastguard Worker sudo sh -c ' 635*6777b538SAndroid Build Coastguard Worker echo "Acquire::http::proxy \"'"${http_proxy}"'\";" \ 636*6777b538SAndroid Build Coastguard Worker >>"/var/lib/chroot/'"${target}"'/etc/apt/apt.conf"' 637*6777b538SAndroid Build Coastguard Workerfi 638*6777b538SAndroid Build Coastguard Worker 639*6777b538SAndroid Build Coastguard Worker# Update packages 640*6777b538SAndroid Build Coastguard Workersudo "/usr/local/bin/${target%bit}" /bin/sh -c ' 641*6777b538SAndroid Build Coastguard Worker apt-get update; apt-get -y dist-upgrade' || : 642*6777b538SAndroid Build Coastguard Worker 643*6777b538SAndroid Build Coastguard Worker# Install a couple of missing packages 644*6777b538SAndroid Build Coastguard Workerfor i in debian-keyring ubuntu-keyring locales sudo; do 645*6777b538SAndroid Build Coastguard Worker [ -d "/var/lib/chroot/${target}/usr/share/doc/$i" ] || 646*6777b538SAndroid Build Coastguard Worker sudo "/usr/local/bin/${target%bit}" apt-get -y install "$i" || : 647*6777b538SAndroid Build Coastguard Workerdone 648*6777b538SAndroid Build Coastguard Worker 649*6777b538SAndroid Build Coastguard Worker# Configure locales 650*6777b538SAndroid Build Coastguard Workersudo "/usr/local/bin/${target%bit}" /bin/sh -c ' 651*6777b538SAndroid Build Coastguard Worker l='"${LANG:-en_US}"'; l="${l%%.*}" 652*6777b538SAndroid Build Coastguard Worker [ -r /etc/locale.gen ] && 653*6777b538SAndroid Build Coastguard Worker sed -i "s/^# \($l\)/\1/" /etc/locale.gen 654*6777b538SAndroid Build Coastguard Worker locale-gen $LANG en_US en_US.UTF-8' || : 655*6777b538SAndroid Build Coastguard Worker 656*6777b538SAndroid Build Coastguard Worker# Enable multi-arch support, if available 657*6777b538SAndroid Build Coastguard Workersudo "/usr/local/bin/${target%bit}" dpkg --assert-multi-arch >&/dev/null && 658*6777b538SAndroid Build Coastguard Worker [ -r "/var/lib/chroot/${target}/etc/apt/sources.list" ] && { 659*6777b538SAndroid Build Coastguard Worker sudo sed -i 's/ / [arch=amd64,i386] /' \ 660*6777b538SAndroid Build Coastguard Worker "/var/lib/chroot/${target}/etc/apt/sources.list" 661*6777b538SAndroid Build Coastguard Worker [ -d /var/lib/chroot/${target}/etc/dpkg/dpkg.cfg.d/ ] && 662*6777b538SAndroid Build Coastguard Worker sudo "/usr/local/bin/${target%bit}" dpkg --add-architecture \ 663*6777b538SAndroid Build Coastguard Worker $([ "${arch}" = "32bit" ] && echo amd64 || echo i386) >&/dev/null || 664*6777b538SAndroid Build Coastguard Worker echo foreign-architecture \ 665*6777b538SAndroid Build Coastguard Worker $([ "${arch}" = "32bit" ] && echo amd64 || echo i386) | 666*6777b538SAndroid Build Coastguard Worker sudo sh -c \ 667*6777b538SAndroid Build Coastguard Worker "cat >'/var/lib/chroot/${target}/etc/dpkg/dpkg.cfg.d/multiarch'" 668*6777b538SAndroid Build Coastguard Worker} 669*6777b538SAndroid Build Coastguard Worker 670*6777b538SAndroid Build Coastguard Worker# Configure "sudo" package 671*6777b538SAndroid Build Coastguard Workersudo "/usr/local/bin/${target%bit}" /bin/sh -c ' 672*6777b538SAndroid Build Coastguard Worker egrep -qs '"'^$(id -nu) '"' /etc/sudoers || 673*6777b538SAndroid Build Coastguard Worker echo '"'$(id -nu) ALL=(ALL) ALL'"' >>/etc/sudoers' 674*6777b538SAndroid Build Coastguard Worker 675*6777b538SAndroid Build Coastguard Worker# Install a few more commonly used packages 676*6777b538SAndroid Build Coastguard Workersudo "/usr/local/bin/${target%bit}" apt-get -y install \ 677*6777b538SAndroid Build Coastguard Worker autoconf automake1.9 dpkg-dev g++-multilib gcc-multilib gdb less libtool \ 678*6777b538SAndroid Build Coastguard Worker lsof strace 679*6777b538SAndroid Build Coastguard Worker 680*6777b538SAndroid Build Coastguard Worker# If running a 32bit environment on a 64bit machine, install a few binaries 681*6777b538SAndroid Build Coastguard Worker# as 64bit. This is only done automatically if the chroot distro is the same as 682*6777b538SAndroid Build Coastguard Worker# the host, otherwise there might be incompatibilities in build settings or 683*6777b538SAndroid Build Coastguard Worker# runtime dependencies. The user can force it with the '-c' flag. 684*6777b538SAndroid Build Coastguard Workerhost_distro=$(grep -s DISTRIB_CODENAME /etc/lsb-release | \ 685*6777b538SAndroid Build Coastguard Worker cut -d "=" -f 2) 686*6777b538SAndroid Build Coastguard Workerif [ "${copy_64}" = "y" -o \ 687*6777b538SAndroid Build Coastguard Worker "${host_distro}" = "${distname}" -a "${arch}" = 32bit ] && \ 688*6777b538SAndroid Build Coastguard Worker file /bin/bash 2>/dev/null | grep -q x86-64; then 689*6777b538SAndroid Build Coastguard Worker readlinepkg=$(sudo "/usr/local/bin/${target%bit}" sh -c \ 690*6777b538SAndroid Build Coastguard Worker 'apt-cache search "lib64readline.\$" | sort | tail -n 1 | cut -d " " -f 1') 691*6777b538SAndroid Build Coastguard Worker sudo "/usr/local/bin/${target%bit}" apt-get -y install \ 692*6777b538SAndroid Build Coastguard Worker lib64expat1 lib64ncurses5 ${readlinepkg} lib64z1 lib64stdc++6 693*6777b538SAndroid Build Coastguard Worker dep= 694*6777b538SAndroid Build Coastguard Worker for i in binutils gdb; do 695*6777b538SAndroid Build Coastguard Worker [ -d /usr/share/doc/"$i" ] || dep="$dep $i" 696*6777b538SAndroid Build Coastguard Worker done 697*6777b538SAndroid Build Coastguard Worker [ -n "$dep" ] && sudo apt-get -y install $dep 698*6777b538SAndroid Build Coastguard Worker sudo mkdir -p "/var/lib/chroot/${target}/usr/local/lib/amd64" 699*6777b538SAndroid Build Coastguard Worker for i in libbfd libpython; do 700*6777b538SAndroid Build Coastguard Worker lib="$({ ldd /usr/bin/ld; ldd /usr/bin/gdb; } | 701*6777b538SAndroid Build Coastguard Worker grep -s "$i" | awk '{ print $3 }')" 702*6777b538SAndroid Build Coastguard Worker if [ -n "$lib" -a -r "$lib" ]; then 703*6777b538SAndroid Build Coastguard Worker sudo cp "$lib" "/var/lib/chroot/${target}/usr/local/lib/amd64" 704*6777b538SAndroid Build Coastguard Worker fi 705*6777b538SAndroid Build Coastguard Worker done 706*6777b538SAndroid Build Coastguard Worker for lib in libssl libcrypt; do 707*6777b538SAndroid Build Coastguard Worker for path in /usr/lib /usr/lib/x86_64-linux-gnu; do 708*6777b538SAndroid Build Coastguard Worker sudo cp $path/$lib* \ 709*6777b538SAndroid Build Coastguard Worker "/var/lib/chroot/${target}/usr/local/lib/amd64/" >&/dev/null || : 710*6777b538SAndroid Build Coastguard Worker done 711*6777b538SAndroid Build Coastguard Worker done 712*6777b538SAndroid Build Coastguard Worker for i in gdb ld; do 713*6777b538SAndroid Build Coastguard Worker sudo cp /usr/bin/$i "/var/lib/chroot/${target}/usr/local/lib/amd64/" 714*6777b538SAndroid Build Coastguard Worker sudo sh -c "cat >'/var/lib/chroot/${target}/usr/local/bin/$i'" <<EOF 715*6777b538SAndroid Build Coastguard Worker#!/bin/sh 716*6777b538SAndroid Build Coastguard Workerexec /lib64/ld-linux-x86-64.so.2 --library-path /usr/local/lib/amd64 \ 717*6777b538SAndroid Build Coastguard Worker /usr/local/lib/amd64/$i "\$@" 718*6777b538SAndroid Build Coastguard WorkerEOF 719*6777b538SAndroid Build Coastguard Worker sudo chmod 755 "/var/lib/chroot/${target}/usr/local/bin/$i" 720*6777b538SAndroid Build Coastguard Worker done 721*6777b538SAndroid Build Coastguard Workerfi 722*6777b538SAndroid Build Coastguard Worker 723*6777b538SAndroid Build Coastguard Worker 724*6777b538SAndroid Build Coastguard Worker# If the install-build-deps.sh script can be found, offer to run it now 725*6777b538SAndroid Build Coastguard Workerscript="$(dirname $(readlink -f "$0"))/install-build-deps.sh" 726*6777b538SAndroid Build Coastguard Workerif [ -x "${script}" ]; then 727*6777b538SAndroid Build Coastguard Worker while :; do 728*6777b538SAndroid Build Coastguard Worker echo 729*6777b538SAndroid Build Coastguard Worker echo "If you plan on building Chrome inside of the new chroot environment," 730*6777b538SAndroid Build Coastguard Worker echo "you now have to install the build dependencies. Do you want me to" 731*6777b538SAndroid Build Coastguard Worker printf "start the script that does this for you (y/n)? " 732*6777b538SAndroid Build Coastguard Worker read install_deps 733*6777b538SAndroid Build Coastguard Worker case "${install_deps}" in 734*6777b538SAndroid Build Coastguard Worker y|Y) 735*6777b538SAndroid Build Coastguard Worker echo 736*6777b538SAndroid Build Coastguard Worker # We prefer running the script in-place, but this might not be 737*6777b538SAndroid Build Coastguard Worker # possible, if it lives on a network filesystem that denies 738*6777b538SAndroid Build Coastguard Worker # access to root. 739*6777b538SAndroid Build Coastguard Worker tmp_script= 740*6777b538SAndroid Build Coastguard Worker if ! sudo /usr/local/bin/"${target%bit}" \ 741*6777b538SAndroid Build Coastguard Worker sh -c "[ -x '${script}' ]" >&/dev/null; then 742*6777b538SAndroid Build Coastguard Worker tmp_script="/tmp/${script##*/}" 743*6777b538SAndroid Build Coastguard Worker cp "${script}" "${tmp_script}" 744*6777b538SAndroid Build Coastguard Worker fi 745*6777b538SAndroid Build Coastguard Worker # Some distributions automatically start an instance of the system- 746*6777b538SAndroid Build Coastguard Worker # wide dbus daemon, cron daemon or of the logging daemon, when 747*6777b538SAndroid Build Coastguard Worker # installing the Chrome build depencies. This prevents the chroot 748*6777b538SAndroid Build Coastguard Worker # session from being closed. So, we always try to shut down any running 749*6777b538SAndroid Build Coastguard Worker # instance of dbus and rsyslog. 750*6777b538SAndroid Build Coastguard Worker sudo /usr/local/bin/"${target%bit}" sh -c "${script}; 751*6777b538SAndroid Build Coastguard Worker rc=$?; 752*6777b538SAndroid Build Coastguard Worker /etc/init.d/cron stop >/dev/null 2>&1 || :; 753*6777b538SAndroid Build Coastguard Worker /etc/init.d/rsyslog stop >/dev/null 2>&1 || :; 754*6777b538SAndroid Build Coastguard Worker /etc/init.d/dbus stop >/dev/null 2>&1 || :; 755*6777b538SAndroid Build Coastguard Worker exit $rc" 756*6777b538SAndroid Build Coastguard Worker rc=$? 757*6777b538SAndroid Build Coastguard Worker [ -n "${tmp_script}" ] && rm -f "${tmp_script}" 758*6777b538SAndroid Build Coastguard Worker [ $rc -ne 0 ] && exit $rc 759*6777b538SAndroid Build Coastguard Worker break 760*6777b538SAndroid Build Coastguard Worker ;; 761*6777b538SAndroid Build Coastguard Worker n|N) 762*6777b538SAndroid Build Coastguard Worker break 763*6777b538SAndroid Build Coastguard Worker ;; 764*6777b538SAndroid Build Coastguard Worker esac 765*6777b538SAndroid Build Coastguard Worker done 766*6777b538SAndroid Build Coastguard Worker echo 767*6777b538SAndroid Build Coastguard Workerfi 768*6777b538SAndroid Build Coastguard Worker 769*6777b538SAndroid Build Coastguard Worker# Check whether ~/chroot is on a (slow) network file system and offer to 770*6777b538SAndroid Build Coastguard Worker# relocate it. Also offer relocation, if the user appears to have multiple 771*6777b538SAndroid Build Coastguard Worker# spindles (as indicated by "${bind_mount}" being non-empty). 772*6777b538SAndroid Build Coastguard Worker# We only offer this option, if it doesn't look as if a chroot environment 773*6777b538SAndroid Build Coastguard Worker# is currently active. Otherwise, relocation is unlikely to work and it 774*6777b538SAndroid Build Coastguard Worker# can be difficult for the user to recover from the failed attempt to relocate 775*6777b538SAndroid Build Coastguard Worker# the ~/chroot directory. 776*6777b538SAndroid Build Coastguard Worker# We don't aim to solve this problem for every configuration, 777*6777b538SAndroid Build Coastguard Worker# but try to help with the common cases. For more advanced configuration 778*6777b538SAndroid Build Coastguard Worker# options, the user can always manually adjust things. 779*6777b538SAndroid Build Coastguard Workermkdir -p "${HOME}/chroot/" 780*6777b538SAndroid Build Coastguard Workerif [ ! -h "${HOME}/chroot" ] && 781*6777b538SAndroid Build Coastguard Worker ! egrep -qs '^[^[:space:]]*/chroot' /etc/fstab && 782*6777b538SAndroid Build Coastguard Worker { [ -n "${bind_mounts}" -a "${bind_mounts}" != "NONE" ] || 783*6777b538SAndroid Build Coastguard Worker is_network_drive "${HOME}/chroot"; } && 784*6777b538SAndroid Build Coastguard Worker ! egrep -qs '/var/lib/[^/]*chroot/.*/chroot' /proc/mounts; then 785*6777b538SAndroid Build Coastguard Worker echo "${HOME}/chroot is currently located on the same device as your" 786*6777b538SAndroid Build Coastguard Worker echo "home directory." 787*6777b538SAndroid Build Coastguard Worker echo "This might not be what you want. Do you want me to move it somewhere" 788*6777b538SAndroid Build Coastguard Worker echo "else?" 789*6777b538SAndroid Build Coastguard Worker # If the computer has multiple spindles, many users configure all or part of 790*6777b538SAndroid Build Coastguard Worker # the secondary hard disk to be writable by the primary user of this machine. 791*6777b538SAndroid Build Coastguard Worker # Make some reasonable effort to detect this type of configuration and 792*6777b538SAndroid Build Coastguard Worker # then offer a good location for where to put the ~/chroot directory. 793*6777b538SAndroid Build Coastguard Worker suggest= 794*6777b538SAndroid Build Coastguard Worker for i in $(echo "${bind_mounts}"|cut -d ' ' -f 1); do 795*6777b538SAndroid Build Coastguard Worker if [ -d "$i" -a -w "$i" -a \( ! -a "$i/chroot" -o -w "$i/chroot/." \) ] && 796*6777b538SAndroid Build Coastguard Worker ! is_network_drive "$i"; then 797*6777b538SAndroid Build Coastguard Worker suggest="$i" 798*6777b538SAndroid Build Coastguard Worker else 799*6777b538SAndroid Build Coastguard Worker for j in "$i/"*; do 800*6777b538SAndroid Build Coastguard Worker if [ -d "$j" -a -w "$j" -a \ 801*6777b538SAndroid Build Coastguard Worker \( ! -a "$j/chroot" -o -w "$j/chroot/." \) ] && 802*6777b538SAndroid Build Coastguard Worker ! is_network_drive "$j"; then 803*6777b538SAndroid Build Coastguard Worker suggest="$j" 804*6777b538SAndroid Build Coastguard Worker else 805*6777b538SAndroid Build Coastguard Worker for k in "$j/"*; do 806*6777b538SAndroid Build Coastguard Worker if [ -d "$k" -a -w "$k" -a \ 807*6777b538SAndroid Build Coastguard Worker \( ! -a "$k/chroot" -o -w "$k/chroot/." \) ] && 808*6777b538SAndroid Build Coastguard Worker ! is_network_drive "$k"; then 809*6777b538SAndroid Build Coastguard Worker suggest="$k" 810*6777b538SAndroid Build Coastguard Worker break 811*6777b538SAndroid Build Coastguard Worker fi 812*6777b538SAndroid Build Coastguard Worker done 813*6777b538SAndroid Build Coastguard Worker fi 814*6777b538SAndroid Build Coastguard Worker [ -n "${suggest}" ] && break 815*6777b538SAndroid Build Coastguard Worker done 816*6777b538SAndroid Build Coastguard Worker fi 817*6777b538SAndroid Build Coastguard Worker [ -n "${suggest}" ] && break 818*6777b538SAndroid Build Coastguard Worker done 819*6777b538SAndroid Build Coastguard Worker def_suggest="${HOME}" 820*6777b538SAndroid Build Coastguard Worker if [ -n "${suggest}" ]; then 821*6777b538SAndroid Build Coastguard Worker # For home directories that reside on network drives, make our suggestion 822*6777b538SAndroid Build Coastguard Worker # the default option. For home directories that reside on a local drive, 823*6777b538SAndroid Build Coastguard Worker # require that the user manually enters the new location. 824*6777b538SAndroid Build Coastguard Worker if is_network_drive "${HOME}"; then 825*6777b538SAndroid Build Coastguard Worker def_suggest="${suggest}" 826*6777b538SAndroid Build Coastguard Worker else 827*6777b538SAndroid Build Coastguard Worker echo "A good location would probably be in \"${suggest}\"" 828*6777b538SAndroid Build Coastguard Worker fi 829*6777b538SAndroid Build Coastguard Worker fi 830*6777b538SAndroid Build Coastguard Worker while :; do 831*6777b538SAndroid Build Coastguard Worker printf "Physical location [${def_suggest}]: " 832*6777b538SAndroid Build Coastguard Worker read dir 833*6777b538SAndroid Build Coastguard Worker [ -z "${dir}" ] && dir="${def_suggest}" 834*6777b538SAndroid Build Coastguard Worker [ "${dir%%/}" == "${HOME%%/}" ] && break 835*6777b538SAndroid Build Coastguard Worker if ! [ -d "${dir}" -a -w "${dir}" ] || 836*6777b538SAndroid Build Coastguard Worker [ -a "${dir}/chroot" -a ! -w "${dir}/chroot/." ]; then 837*6777b538SAndroid Build Coastguard Worker echo "Cannot write to ${dir}/chroot. Please try again" 838*6777b538SAndroid Build Coastguard Worker else 839*6777b538SAndroid Build Coastguard Worker mv "${HOME}/chroot" "${dir}/chroot" 840*6777b538SAndroid Build Coastguard Worker ln -s "${dir}/chroot" "${HOME}/chroot" 841*6777b538SAndroid Build Coastguard Worker for i in $(list_all_chroots); do 842*6777b538SAndroid Build Coastguard Worker sudo "$i" mkdir -p "${dir}/chroot" 843*6777b538SAndroid Build Coastguard Worker done 844*6777b538SAndroid Build Coastguard Worker sudo sed -i "s,${HOME}/chroot,${dir}/chroot,g" /etc/schroot/mount-* 845*6777b538SAndroid Build Coastguard Worker break 846*6777b538SAndroid Build Coastguard Worker fi 847*6777b538SAndroid Build Coastguard Worker done 848*6777b538SAndroid Build Coastguard Workerfi 849*6777b538SAndroid Build Coastguard Worker 850*6777b538SAndroid Build Coastguard Worker# Clean up package files 851*6777b538SAndroid Build Coastguard Workersudo schroot -c "${target%bit}" -p -- apt-get clean 852*6777b538SAndroid Build Coastguard Workersudo apt-get clean 853*6777b538SAndroid Build Coastguard Worker 854*6777b538SAndroid Build Coastguard Workertrap '' INT TERM QUIT HUP 855*6777b538SAndroid Build Coastguard Workertrap '' EXIT 856*6777b538SAndroid Build Coastguard Worker 857*6777b538SAndroid Build Coastguard Worker# Let the user know what we did 858*6777b538SAndroid Build Coastguard Workercat <<EOF 859*6777b538SAndroid Build Coastguard Worker 860*6777b538SAndroid Build Coastguard Worker 861*6777b538SAndroid Build Coastguard WorkerSuccessfully installed ${distname} ${arch} 862*6777b538SAndroid Build Coastguard Worker 863*6777b538SAndroid Build Coastguard WorkerYou can run programs inside of the chroot by invoking the 864*6777b538SAndroid Build Coastguard Worker"/usr/local/bin/${target%bit}" command. 865*6777b538SAndroid Build Coastguard Worker 866*6777b538SAndroid Build Coastguard WorkerThis command can be used with arguments, in order to just run a single 867*6777b538SAndroid Build Coastguard Workerprogram inside of the chroot environment (e.g. "${target%bit} make chrome") 868*6777b538SAndroid Build Coastguard Workeror without arguments, in order to run an interactive shell session inside 869*6777b538SAndroid Build Coastguard Workerof the chroot environment. 870*6777b538SAndroid Build Coastguard Worker 871*6777b538SAndroid Build Coastguard WorkerIf you need to run things as "root", you can use "sudo" (e.g. try 872*6777b538SAndroid Build Coastguard Worker"sudo ${target%bit} apt-get update"). 873*6777b538SAndroid Build Coastguard Worker 874*6777b538SAndroid Build Coastguard WorkerYour home directory is shared between the host and the chroot. But I 875*6777b538SAndroid Build Coastguard Workerconfigured "${HOME}/chroot" to be private to the chroot environment. 876*6777b538SAndroid Build Coastguard WorkerYou can use it for files that need to differ between environments. This 877*6777b538SAndroid Build Coastguard Workerwould be a good place to store binaries that you have built from your 878*6777b538SAndroid Build Coastguard Workersource files. 879*6777b538SAndroid Build Coastguard Worker 880*6777b538SAndroid Build Coastguard WorkerFor Chrome, this probably means you want to make your "out" directory a 881*6777b538SAndroid Build Coastguard Workersymbolic link that points somewhere inside of "${HOME}/chroot". 882*6777b538SAndroid Build Coastguard Worker 883*6777b538SAndroid Build Coastguard WorkerYou still need to run "gclient runhooks" whenever you switch from building 884*6777b538SAndroid Build Coastguard Workeroutside of the chroot to inside of the chroot. But you will find that you 885*6777b538SAndroid Build Coastguard Workerdon't have to repeatedly erase and then completely rebuild all your object 886*6777b538SAndroid Build Coastguard Workerand binary files. 887*6777b538SAndroid Build Coastguard Worker 888*6777b538SAndroid Build Coastguard WorkerEOF 889