OLD | NEW |
1 #!/bin/bash | 1 #!/bin/bash |
2 | 2 |
3 # Copyright (c) 2009 The Chromium OS Authors. All rights reserved. | 3 # Copyright (c) 2011 The Chromium OS Authors. All rights reserved. |
4 # Use of this source code is governed by a BSD-style license that can be | 4 # Use of this source code is governed by a BSD-style license that can be |
5 # found in the LICENSE file. | 5 # found in the LICENSE file. |
6 | 6 |
7 # Script to modify a keyfob-based chromeos system image for testability. | 7 # Script to modify a keyfob-based chromeos system image for testability. |
8 | 8 |
9 # --- BEGIN COMMON.SH BOILERPLATE --- | 9 # --- BEGIN COMMON.SH BOILERPLATE --- |
10 # Load common CrOS utilities. Inside the chroot this file is installed in | 10 # Load common CrOS utilities. Inside the chroot this file is installed in |
11 # /usr/lib/crosutils. Outside the chroot we find it relative to the script's | 11 # /usr/lib/crosutils. Outside the chroot we find it relative to the script's |
12 # location. | 12 # location. |
13 find_common_sh() { | 13 find_common_sh() { |
(...skipping 27 matching lines...) Expand all Loading... |
41 "Modify the image for manufacturing testing" f | 41 "Modify the image for manufacturing testing" f |
42 DEFINE_string image "" "Location of the rootfs raw image file" i | 42 DEFINE_string image "" "Location of the rootfs raw image file" i |
43 DEFINE_boolean installmask $FLAGS_TRUE \ | 43 DEFINE_boolean installmask $FLAGS_TRUE \ |
44 "Use INSTALL_MASK to shrink the resulting image." m | 44 "Use INSTALL_MASK to shrink the resulting image." m |
45 DEFINE_integer jobs -1 \ | 45 DEFINE_integer jobs -1 \ |
46 "How many packages to build in parallel at maximum." j | 46 "How many packages to build in parallel at maximum." j |
47 DEFINE_string qualdb "" "Location of qualified component file" d | 47 DEFINE_string qualdb "" "Location of qualified component file" d |
48 DEFINE_boolean yes $FLAGS_FALSE "Answer yes to all prompts" y | 48 DEFINE_boolean yes $FLAGS_FALSE "Answer yes to all prompts" y |
49 DEFINE_string build_root "/build" \ | 49 DEFINE_string build_root "/build" \ |
50 "The root location for board sysroots." | 50 "The root location for board sysroots." |
51 DEFINE_boolean fast ${DEFAULT_FAST} "Call many emerges in parallel" | 51 DEFINE_boolean fast $DEFAULT_FAST "Call many emerges in parallel" |
52 DEFINE_boolean inplace $FLAGS_TRUE \ | 52 DEFINE_boolean inplace $FLAGS_TRUE \ |
53 "Modify/overwrite the image ${CHROMEOS_IMAGE_NAME} in place. \ | 53 "Modify/overwrite the image $CHROMEOS_IMAGE_NAME in place. \ |
54 Otherwise the image will be copied to ${CHROMEOS_TEST_IMAGE_NAME} \ | 54 Otherwise the image will be copied to $CHROMEOS_TEST_IMAGE_NAME \ |
55 (or ${CHROMEOS_FACTORY_TEST_IMAGE_NAME} for --factory) if needed, and \ | 55 (or $CHROMEOS_FACTORY_TEST_IMAGE_NAME for --factory) if needed, and \ |
56 modified there" | 56 modified there" |
57 DEFINE_boolean force_copy ${FLAGS_FALSE} \ | 57 DEFINE_boolean force_copy $FLAGS_FALSE \ |
58 "Always rebuild test image if --noinplace" | 58 "Always rebuild test image if --noinplace" |
59 | 59 |
60 # Parse command line | 60 # Parse command line |
61 FLAGS "$@" || exit 1 | 61 FLAGS "$@" || exit 1 |
62 eval set -- "${FLAGS_ARGV}" | 62 eval set -- "$FLAGS_ARGV" |
63 | 63 |
64 EMERGE_CMD="emerge" | 64 EMERGE_CMD="emerge" |
65 EMERGE_BOARD_CMD="emerge-${FLAGS_board}" | 65 EMERGE_BOARD_CMD="emerge-$FLAGS_board" |
66 if [ "${FLAGS_fast}" -eq "${FLAGS_TRUE}" ]; then | 66 if [ $FLAGS_fast -eq $FLAGS_TRUE ]; then |
67 echo "Using alternate emerge" | 67 echo "Using alternate emerge" |
68 EMERGE_CMD="${GCLIENT_ROOT}/chromite/bin/parallel_emerge" | 68 EMERGE_CMD="$GCLIENT_ROOT/chromite/bin/parallel_emerge" |
69 EMERGE_BOARD_CMD="${EMERGE_CMD} --board=${FLAGS_board}" | 69 EMERGE_BOARD_CMD="$EMERGE_CMD --board=$FLAGS_board" |
70 fi | 70 fi |
71 | 71 |
72 # No board, no default and no image set then we can't find the image | 72 # No board, no default and no image set then we can't find the image |
73 if [ -z $FLAGS_image ] && [ -z $FLAGS_board ] ; then | 73 if [ -z "$FLAGS_image" -a -z "$FLAGS_board" ] ; then |
74 setup_board_warning | 74 setup_board_warning |
75 die "mod_image_for_test failed. No board set and no image set" | 75 die "mod_image_for_test failed. No board set and no image set" |
76 fi | 76 fi |
77 | 77 |
78 # We have a board name but no image set. Use image at default location | 78 # We have a board name but no image set. Use image at default location |
79 if [ -z $FLAGS_image ] ; then | 79 if [ -z "$FLAGS_image" ] ; then |
80 IMAGES_DIR="${DEFAULT_BUILD_ROOT}/images/${FLAGS_board}" | 80 IMAGES_DIR="$DEFAULT_BUILD_ROOT/images/$FLAGS_board" |
81 FILENAME="${CHROMEOS_IMAGE_NAME}" | 81 FILENAME="$CHROMEOS_IMAGE_NAME" |
82 FLAGS_image="${IMAGES_DIR}/$(ls -t $IMAGES_DIR 2>&-| head -1)/${FILENAME}" | 82 FLAGS_image="$IMAGES_DIR/$(ls -t $IMAGES_DIR 2>&-| head -1)/$FILENAME" |
83 fi | 83 fi |
84 | 84 |
85 # Turn path into an absolute path. | 85 # Turn path into an absolute path. |
86 FLAGS_image=`eval readlink -f ${FLAGS_image}` | 86 FLAGS_image=$(eval readlink -f $FLAGS_image) |
87 | 87 |
88 # What cross-build are we targeting? | 88 # What cross-build are we targeting? |
89 . "${FLAGS_build_root}/${FLAGS_board}/etc/make.conf.board_setup" | 89 . "$FLAGS_build_root/$FLAGS_board/etc/make.conf.board_setup" |
90 # Figure out ARCH from the given toolchain. | 90 # Figure out ARCH from the given toolchain. |
91 # TODO: Move to common.sh as a function after scripts are switched over. | 91 # TODO: Move to common.sh as a function after scripts are switched over. |
92 TC_ARCH=$(echo "${CHOST}" | awk -F'-' '{ print $1 }') | 92 TC_ARCH=$(echo "$CHOST" | awk -F'-' '{ print $1 }') |
93 case "${TC_ARCH}" in | 93 case "$TC_ARCH" in |
94 arm*) | 94 arm*) |
95 ARCH="arm" | 95 ARCH="arm" |
96 ;; | 96 ;; |
97 *86) | 97 *86) |
98 ARCH="x86" | 98 ARCH="x86" |
99 ;; | 99 ;; |
100 *) | 100 *) |
101 error "Unable to determine ARCH from toolchain: ${CHOST}" | 101 error "Unable to determine ARCH from toolchain: $CHOST" |
102 exit 1 | 102 exit 1 |
103 esac | 103 esac |
104 | 104 |
105 # Make sure anything mounted in the rootfs/stateful is cleaned up ok on exit. | 105 # Make sure anything mounted in the rootfs/stateful is cleaned up ok on exit. |
106 cleanup_mounts() { | 106 cleanup_mounts() { |
107 # Occasionally there are some daemons left hanging around that have our | 107 # Occasionally there are some daemons left hanging around that have our |
108 # root/stateful image file system open. We do a best effort attempt to kill | 108 # root/stateful image file system open. We do a best effort attempt to kill |
109 # them. | 109 # them. |
110 PIDS=`sudo lsof -t "$1" | sort | uniq` | 110 PIDS=$(sudo lsof -t "$1" | sort | uniq) |
111 for pid in ${PIDS}; do | 111 for pid in $PIDS; do |
112 local cmdline=`cat /proc/$pid/cmdline` | 112 local cmdline=$(cat /proc/$pid/cmdline) |
113 echo "Killing process that has open file on the mounted directory: $cmdline" | 113 echo "Killing process that has open file on the mounted directory: $cmdline" |
114 sudo kill $pid || /bin/true | 114 sudo kill $pid || true |
115 done | 115 done |
116 } | 116 } |
117 | 117 |
118 cleanup() { | 118 cleanup() { |
119 "$SCRIPTS_DIR/mount_gpt_image.sh" -u -r "$ROOT_FS_DIR" -s "$STATEFUL_DIR" | 119 "$SCRIPTS_DIR/mount_gpt_image.sh" -u -r "$ROOT_FS_DIR" -s "$STATEFUL_DIR" |
120 } | 120 } |
121 | 121 |
122 # Emerges chromeos-test onto the image. | 122 # Emerges chromeos-test onto the image. |
123 emerge_chromeos_test() { | 123 emerge_chromeos_test() { |
124 INSTALL_MASK="" | 124 INSTALL_MASK="" |
125 if [[ $FLAGS_installmask -eq ${FLAGS_TRUE} ]]; then | 125 if [[ $FLAGS_installmask -eq $FLAGS_TRUE ]]; then |
126 INSTALL_MASK="$DEFAULT_INSTALL_MASK" | 126 INSTALL_MASK="$DEFAULT_INSTALL_MASK" |
127 fi | 127 fi |
128 | 128 |
129 # Determine the root dir for test packages. | 129 # Determine the root dir for test packages. |
130 ROOT_DEV_DIR="$ROOT_FS_DIR/usr/local" | 130 ROOT_DEV_DIR="$ROOT_FS_DIR/usr/local" |
131 | 131 |
132 sudo INSTALL_MASK="$INSTALL_MASK" $EMERGE_BOARD_CMD \ | 132 sudo INSTALL_MASK="$INSTALL_MASK" $EMERGE_BOARD_CMD \ |
133 --root="$ROOT_DEV_DIR" --root-deps=rdeps \ | 133 --root="$ROOT_DEV_DIR" --root-deps=rdeps \ |
134 --usepkgonly chromeos-test $EMERGE_JOBS | 134 --usepkgonly chromeos-test $EMERGE_JOBS |
135 } | 135 } |
136 | 136 |
137 | 137 |
138 install_autotest() { | 138 install_autotest() { |
139 SYSROOT="${FLAGS_build_root}/${FLAGS_board}" | 139 local autotest_src="$FLAGS_build_root/$FLAGS_board/usr/local/autotest" |
140 AUTOTEST_SRC="${SYSROOT}/usr/local/autotest" | 140 local stateful_root="$ROOT_FS_DIR/usr/local" |
141 stateful_root="${ROOT_FS_DIR}/usr/local" | 141 local autotest_client="$stateful_root/autotest" |
142 autotest_client="/autotest" | |
143 | 142 |
144 echo "Install autotest into stateful partition from $AUTOTEST_SRC" | 143 echo "Install autotest into stateful partition from $AUTOTEST_SRC" |
145 | 144 |
146 sudo mkdir -p "${stateful_root}${autotest_client}" | 145 sudo mkdir -p "$autotest_client" |
147 | 146 |
148 # Remove excess files from stateful partition. | 147 # Remove excess files from stateful partition. |
149 # If these aren't there, that's fine. | 148 sudo rm -rf "$autotest_client/"* |
150 sudo rm -rf "${stateful_root}${autotest_client}/*" || true | 149 sudo rm -rf "$stateful_root/autotest-pkgs" |
151 sudo rm -rf "${stateful_root}/autotest-pkgs" || true | 150 sudo rm -rf "$stateful_root/lib/icedtea6" |
152 sudo rm -rf "${stateful_root}/lib/icedtea6" || true | |
153 | 151 |
154 sudo rsync --delete --delete-excluded -auv \ | 152 sudo rsync --delete --delete-excluded -auv \ |
155 --exclude=deps/realtimecomm_playground \ | 153 --exclude=deps/realtimecomm_playground \ |
156 --exclude=tests/ltp \ | 154 --exclude=tests/ltp \ |
157 --exclude=site_tests/graphics_O3DSelenium \ | 155 --exclude=site_tests/graphics_O3DSelenium \ |
158 --exclude=site_tests/realtimecomm_GTalk\* \ | 156 --exclude=site_tests/realtimecomm_GTalk\* \ |
159 --exclude=site_tests/platform_StackProtector \ | 157 --exclude=site_tests/platform_StackProtector \ |
160 --exclude=deps/chrome_test \ | 158 --exclude=deps/chrome_test \ |
161 --exclude=site_tests/desktopui_BrowserTest \ | 159 --exclude=site_tests/desktopui_BrowserTest \ |
162 --exclude=site_tests/desktopui_PageCyclerTests \ | 160 --exclude=site_tests/desktopui_PageCyclerTests \ |
163 --exclude=site_tests/desktopui_UITest \ | 161 --exclude=site_tests/desktopui_UITest \ |
164 --exclude=.svn \ | 162 --exclude=.svn \ |
165 ${AUTOTEST_SRC}/client/* "${stateful_root}/${autotest_client}" | 163 "$autotest_src/client/"* "$autotest_client" |
166 | 164 |
167 sudo chmod 755 "${stateful_root}/${autotest_client}" | 165 sudo chmod 755 "$autotest_client" |
168 sudo chown -R 1000:1000 "${stateful_root}/${autotest_client}" | 166 sudo chown -R 1000:1000 "$autotest_client" |
169 } | 167 } |
170 | 168 |
171 # main process begins here. | 169 # main process begins here. |
172 | 170 |
173 IMAGE_DIR="$(dirname "${FLAGS_image}")" | 171 IMAGE_DIR=$(dirname "$FLAGS_image") |
174 | 172 |
175 # Copy the image to a test location if required | 173 # Copy the image to a test location if required |
176 if [ ${FLAGS_inplace} -eq ${FLAGS_FALSE} ]; then | 174 if [ $FLAGS_inplace -eq $FLAGS_FALSE ]; then |
177 if [ ${FLAGS_factory} -eq ${FLAGS_TRUE} ]; then | 175 if [ $FLAGS_factory -eq $FLAGS_TRUE ]; then |
178 TEST_PATHNAME="${IMAGE_DIR}/${CHROMEOS_FACTORY_TEST_IMAGE_NAME}" | 176 TEST_PATHNAME="$IMAGE_DIR/$CHROMEOS_FACTORY_TEST_IMAGE_NAME" |
179 typename="factory" | 177 typename="factory" |
180 else | 178 else |
181 TEST_PATHNAME="${IMAGE_DIR}/${CHROMEOS_TEST_IMAGE_NAME}" | 179 TEST_PATHNAME="$IMAGE_DIR/$CHROMEOS_TEST_IMAGE_NAME" |
182 typename="test" | 180 typename="test" |
183 fi | 181 fi |
184 if [ ! -f "${TEST_PATHNAME}" ] || \ | 182 if [ ! -f "$TEST_PATHNAME" -o $FLAGS_force_copy -eq $FLAGS_TRUE ] ; then |
185 [ ${FLAGS_force_copy} -eq ${FLAGS_TRUE} ] ; then | |
186 echo "Creating test image from original..." | 183 echo "Creating test image from original..." |
187 ${COMMON_PV_CAT} "${FLAGS_image}" >"${TEST_PATHNAME}" \ | 184 $COMMON_PV_CAT "$FLAGS_image" >"$TEST_PATHNAME" || |
188 || die "Cannot copy ${FLAGS_image} to test image" | 185 die "Cannot copy $FLAGS_image to test image" |
189 FLAGS_image="${TEST_PATHNAME}" | 186 FLAGS_image="$TEST_PATHNAME" |
190 else | 187 else |
191 echo "Using cached ${typename} image" | 188 echo "Using cached $typename image" |
192 exit | 189 exit |
193 fi | 190 fi |
194 | 191 |
195 # No need to confirm now, since we are not overwriting the main image | 192 # No need to confirm now, since we are not overwriting the main image |
196 FLAGS_yes="$FLAGS_TRUE" | 193 FLAGS_yes="$FLAGS_TRUE" |
197 fi | 194 fi |
198 | 195 |
199 # Make sure this is really what the user wants, before nuking the device | 196 # Make sure this is really what the user wants, before nuking the device |
200 if [ $FLAGS_yes -ne $FLAGS_TRUE ]; then | 197 if [ $FLAGS_yes -ne $FLAGS_TRUE ]; then |
201 read -p "Modifying image ${FLAGS_image} for test; are you sure (y/N)? " SURE | 198 read -p "Modifying image $FLAGS_image for test; are you sure (y/N)? " SURE |
202 SURE="${SURE:0:1}" # Get just the first character | 199 SURE="${SURE:0:1}" # Get just the first character |
203 if [ "$SURE" != "y" ]; then | 200 if [ "$SURE" != "y" ]; then |
204 echo "Ok, better safe than sorry." | 201 echo "Ok, better safe than sorry." |
205 exit 1 | 202 exit 1 |
206 fi | 203 fi |
207 else | 204 else |
208 echo "Modifying image ${FLAGS_image} for test..." | 205 echo "Modifying image $FLAGS_image for test..." |
209 fi | 206 fi |
210 | 207 |
211 # Abort early if we can't find the image | 208 # Abort early if we can't find the image |
212 if [ ! -f $FLAGS_image ] && [ ${FLAGS_inplace} -eq ${FLAGS_TRUE} ; then | 209 if [ ! -f $FLAGS_image -a $FLAGS_inplace -eq $FLAGS_TRUE ] ; then |
213 die "No image found at $FLAGS_image to modify" | 210 die "No image found at $FLAGS_image to modify" |
214 fi | 211 fi |
215 | 212 |
216 set -e | 213 set -e |
217 | 214 |
218 IMAGE_DIR=$(dirname "$FLAGS_image") | 215 IMAGE_DIR=$(dirname "$FLAGS_image") |
219 IMAGE_NAME="$(basename "$FLAGS_image")" | 216 IMAGE_NAME=$(basename "$FLAGS_image") |
220 ROOT_FS_DIR="$IMAGE_DIR/rootfs" | 217 ROOT_FS_DIR="$IMAGE_DIR/rootfs" |
221 STATEFUL_DIR="$IMAGE_DIR/stateful_partition" | 218 STATEFUL_DIR="$IMAGE_DIR/stateful_partition" |
222 | 219 |
223 trap cleanup EXIT | 220 trap cleanup EXIT |
224 | 221 |
225 # Mounts gpt image and sets up var, /usr/local and symlinks. | 222 # Mounts gpt image and sets up var, /usr/local and symlinks. |
226 "$SCRIPTS_DIR/mount_gpt_image.sh" -i "$IMAGE_NAME" -f "$IMAGE_DIR" \ | 223 "$SCRIPTS_DIR/mount_gpt_image.sh" -i "$IMAGE_NAME" -f "$IMAGE_DIR" \ |
227 -r "$ROOT_FS_DIR" -s "$STATEFUL_DIR" | 224 -r "$ROOT_FS_DIR" -s "$STATEFUL_DIR" |
228 | 225 |
229 emerge_chromeos_test | 226 emerge_chromeos_test |
230 | 227 |
231 MOD_TEST_ROOT="${GCLIENT_ROOT}/src/scripts/mod_for_test_scripts" | 228 MOD_TEST_SCRIPT="$SCRIPTS_DIR/mod_for_test_scripts/test_setup.sh" |
232 # Run test setup script to modify the image | 229 # Run test setup script to modify the image |
233 sudo GCLIENT_ROOT="${GCLIENT_ROOT}" ROOT_FS_DIR="${ROOT_FS_DIR}" \ | 230 sudo GCLIENT_ROOT="$GCLIENT_ROOT" ROOT_FS_DIR="$ROOT_FS_DIR" \ |
234 STATEFUL_DIR="${STATEFUL_DIR}" ARCH="${ARCH}" "${MOD_TEST_ROOT}/test_setup.s
h" | 231 STATEFUL_DIR="$STATEFUL_DIR" ARCH="$ARCH" "$MOD_TEST_SCRIPT" |
235 | 232 |
236 if [ ${FLAGS_factory} -eq ${FLAGS_TRUE} ]; then | 233 if [ $FLAGS_factory -eq $FLAGS_TRUE ]; then |
237 install_autotest | 234 install_autotest |
238 | 235 |
239 MOD_FACTORY_ROOT="${GCLIENT_ROOT}/src/scripts/mod_for_factory_scripts" | 236 MOD_FACTORY_SCRIPT="$SCRIPTS_DIR/mod_for_factory_scripts/factory_setup.sh" |
240 # Run factory setup script to modify the image | 237 # Run factory setup script to modify the image |
241 sudo GCLIENT_ROOT="${GCLIENT_ROOT}" ROOT_FS_DIR="${ROOT_FS_DIR}" \ | 238 sudo GCLIENT_ROOT="$GCLIENT_ROOT" ROOT_FS_DIR="$ROOT_FS_DIR" \ |
242 QUALDB="${FLAGS_qualdb}" BOARD=${FLAGS_board} \ | 239 QUALDB="$FLAGS_qualdb" BOARD=$FLAGS_board "$MOD_FACTORY_SCRIPT" |
243 "${MOD_FACTORY_ROOT}/factory_setup.sh" | |
244 fi | 240 fi |
245 | 241 |
246 # Re-run ldconfig to fix /etc/ldconfig.so.cache. | 242 # Re-run ldconfig to fix /etc/ldconfig.so.cache. |
247 sudo /sbin/ldconfig -r "${ROOT_FS_DIR}" | 243 sudo ldconfig -r "$ROOT_FS_DIR" |
248 | 244 |
249 # Let's have a look at the image just in case.. | 245 # Let's have a look at the image just in case.. |
250 if [ "${VERIFY}" = "true" ]; then | 246 if [ "$VERIFY" = "true" ]; then |
251 pushd "${ROOT_FS_DIR}" | 247 pushd "$ROOT_FS_DIR" |
252 bash | 248 bash |
253 popd | 249 popd |
254 fi | 250 fi |
255 | 251 |
256 cleanup | 252 cleanup |
257 | 253 |
258 # Now make it bootable with the flags from build_image | 254 # Now make it bootable with the flags from build_image |
259 "${SCRIPTS_DIR}/bin/cros_make_image_bootable" "$(dirname "${FLAGS_image}")" \ | 255 "$SCRIPTS_DIR/bin/cros_make_image_bootable" "$(dirname "$FLAGS_image")" \ |
260 $(basename "${FLAGS_image}") | 256 "$(basename "$FLAGS_image")" |
261 | 257 |
262 print_time_elapsed | 258 print_time_elapsed |
263 | 259 |
264 trap - EXIT | 260 trap - EXIT |
265 | |
OLD | NEW |