mirror of
https://github.com/flatcar/scripts.git
synced 2025-08-08 05:26:58 +02:00
This CL does two things. First it introduces an argument interface that works with all the following combinations: factory_install | [base|dev[test|factory_test]] rather than use --test etc. This does not build extra images. If you just want a test image you can run build_image --board=<board> test and all that's in your latest_dir is chromiumos_test_image.bin. Second, we only build what we ask and only finalize what we ask so on an invocation of build_image test we only actually run cros_make_image_bootable once saving 2 minutes on my machine (from 6:50->4:50 on multiple iterations). BUG=chromium-os:22048 TEST=build_image test, all possible combinations of args through to start of build. Built factory_install using new and old methods and dev test with both methods. Also verified mod_image_for_test still works as advertises stand-alone. Change-Id: I9fe2feb50a941c007214decd9ba1627012c050af Reviewed-on: https://gerrit.chromium.org/gerrit/10621 Commit-Ready: Chris Sosa <sosa@chromium.org> Reviewed-by: Chris Sosa <sosa@chromium.org> Tested-by: Chris Sosa <sosa@chromium.org>
180 lines
5.6 KiB
Bash
Executable File
180 lines
5.6 KiB
Bash
Executable File
# Copyright (c) 2011 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.
|
|
|
|
# Shell function library for functions specific to creating test
|
|
# images from dev images. This file also contains additional
|
|
# functions and initialization shared between build_image and
|
|
# mod_image_for_test.sh.
|
|
#
|
|
# TODO(jrbarnette): The two halves of this file aren't particularly
|
|
# related; they're together merely to consolidate the shared code in
|
|
# one file. Arguably, they should be broken up.
|
|
|
|
|
|
# ----
|
|
# The initialization and functions below are shared between
|
|
# build_image and mod_image_for_test.sh. The code is not used
|
|
# by the mod_image_for_test function.
|
|
|
|
EMERGE_BOARD_CMD="emerge-$BOARD"
|
|
if [ $FLAGS_fast -eq $FLAGS_TRUE ]; then
|
|
echo "Using alternate emerge"
|
|
EMERGE_BOARD_CMD="$GCLIENT_ROOT/chromite/bin/parallel_emerge"
|
|
EMERGE_BOARD_CMD="$EMERGE_BOARD_CMD --board=$BOARD"
|
|
fi
|
|
if [ $FLAGS_jobs -ne -1 ]; then
|
|
EMERGE_JOBS="--jobs=$FLAGS_jobs"
|
|
fi
|
|
|
|
export INSTALL_MASK="${DEFAULT_INSTALL_MASK}"
|
|
|
|
|
|
# Utility function for creating a copy of an image prior to
|
|
# modification from the BUILD_DIR:
|
|
# $1: source filename
|
|
# $2: destination filename
|
|
copy_image() {
|
|
local src="${BUILD_DIR}/$1"
|
|
local dst="${BUILD_DIR}/$2"
|
|
if should_build_image $1; then
|
|
echo "Creating $2 from $1..."
|
|
$COMMON_PV_CAT "$src" >"$dst" || die "Cannot copy $1 to $2"
|
|
else
|
|
mv "${src}" "${dst}" || die "Cannot move $1 to $2"
|
|
fi
|
|
}
|
|
|
|
# Basic command to emerge binary packages into the target image.
|
|
# Arguments to this command are passed as addition options/arguments
|
|
# to the basic emerge command.
|
|
emerge_to_image() {
|
|
sudo -E ${EMERGE_BOARD_CMD} --root-deps=rdeps --usepkgonly -v \
|
|
"$@" ${EMERGE_JOBS}
|
|
}
|
|
|
|
|
|
# Returns 0 if this image was requested to be built, 1 otherwise.
|
|
# $1 The name of the image to build.
|
|
should_build_image() {
|
|
# Fast pass back if we should build all incremental images.
|
|
local image_name=$1
|
|
local image_to_build
|
|
[ -z "${IMAGES_TO_BUILD}" ] && return 0
|
|
|
|
for image_to_build in ${IMAGES_TO_BUILD}; do
|
|
[ ${image_to_build} = ${image_name} ] && return 0
|
|
done
|
|
|
|
return 1
|
|
}
|
|
|
|
# ----
|
|
# From here down, the main exported function is
|
|
# 'mod_image_for_test'. The remainder of the code is not used
|
|
# outside this file.
|
|
|
|
# Emerges chromeos-test onto the image.
|
|
emerge_chromeos_test() {
|
|
# Determine the root dir for test packages.
|
|
local root_dev_dir="${ROOT_FS_DIR}/usr/local"
|
|
|
|
emerge_to_image --root="${root_dev_dir}" chromeos-test
|
|
}
|
|
|
|
prepare_hwid_for_factory() {
|
|
local hwid_dest="$1/hwid"
|
|
local hwid_src="${BOARD_ROOT}/usr/share/chromeos-hwid"
|
|
|
|
# Force refreshing source folder in build root folder
|
|
sudo rm -rf "${hwid_src}" "${hwid_dest}"
|
|
emerge_to_image chromeos-hwid
|
|
if [ -d "${hwid_src}" ]; then
|
|
# TODO(hungte) After being archived by chromite, the HWID files will be in
|
|
# factory_test/hwid; we should move it to top level folder.
|
|
cp -r "${hwid_src}" "${hwid_dest}"
|
|
else
|
|
echo "Skipping HWID: No HWID bundles found."
|
|
fi
|
|
}
|
|
|
|
install_autotest_for_factory() {
|
|
local autotest_src="${BOARD_ROOT}/usr/local/autotest"
|
|
local stateful_root="${ROOT_FS_DIR}/usr/local"
|
|
local autotest_client="${stateful_root}/autotest"
|
|
|
|
echo "Install autotest into stateful partition from ${autotest_src}"
|
|
|
|
sudo mkdir -p "${autotest_client}"
|
|
|
|
# Remove excess files from stateful partition.
|
|
sudo rm -rf "${autotest_client}/"*
|
|
sudo rm -rf "${stateful_root}/autotest-pkgs"
|
|
sudo rm -rf "${stateful_root}/lib/icedtea6"
|
|
|
|
sudo rsync --delete --delete-excluded -au \
|
|
--exclude=deps/realtimecomm_playground \
|
|
--exclude=tests/ltp \
|
|
--exclude=site_tests/graphics_O3DSelenium \
|
|
--exclude=site_tests/realtimecomm_GTalk\* \
|
|
--exclude=site_tests/platform_StackProtector \
|
|
--exclude=deps/chrome_test \
|
|
--exclude=site_tests/desktopui_BrowserTest \
|
|
--exclude=site_tests/desktopui_PageCyclerTests \
|
|
--exclude=site_tests/desktopui_UITest \
|
|
--exclude=.svn \
|
|
"${autotest_src}/client/"* "${autotest_client}"
|
|
|
|
sudo chmod 755 "${autotest_client}"
|
|
sudo chown -R 1000:1000 "${autotest_client}"
|
|
}
|
|
|
|
# Converts a dev image into a test or factory test image
|
|
# Takes as an arg the name of the image to be created.
|
|
mod_image_for_test () {
|
|
local image_name="$1"
|
|
|
|
trap unmount_image EXIT
|
|
mount_image "${BUILD_DIR}/${image_name}" \
|
|
"${ROOT_FS_DIR}" "${STATEFUL_FS_DIR}"
|
|
|
|
emerge_chromeos_test
|
|
|
|
BACKDOOR=0
|
|
if [ $FLAGS_standard_backdoor -eq $FLAGS_TRUE ]; then
|
|
BACKDOOR=1
|
|
fi
|
|
|
|
local mod_test_script="${SCRIPTS_DIR}/mod_for_test_scripts/test_setup.sh"
|
|
# Run test setup script to modify the image
|
|
sudo -E GCLIENT_ROOT="${GCLIENT_ROOT}" ROOT_FS_DIR="${ROOT_FS_DIR}" \
|
|
STATEFUL_DIR="${STATEFUL_FS_DIR}" ARCH="${ARCH}" BACKDOOR="${BACKDOOR}" \
|
|
"${mod_test_script}"
|
|
|
|
if [ ${FLAGS_factory} -eq ${FLAGS_TRUE} ]; then
|
|
emerge_to_image --root="${ROOT_FS_DIR}" factorytest-init
|
|
|
|
prepare_hwid_for_factory "${BUILD_DIR}"
|
|
install_autotest_for_factory
|
|
|
|
local mod_factory_script
|
|
mod_factory_script="${SCRIPTS_DIR}/mod_for_factory_scripts/factory_setup.sh"
|
|
# Run factory setup script to modify the image
|
|
sudo -E GCLIENT_ROOT="${GCLIENT_ROOT}" ROOT_FS_DIR="${ROOT_FS_DIR}" \
|
|
BOARD="${BOARD}" "${mod_factory_script}"
|
|
fi
|
|
|
|
# Re-run ldconfig to fix /etc/ldconfig.so.cache.
|
|
sudo ldconfig -r "${ROOT_FS_DIR}"
|
|
|
|
unmount_image
|
|
trap - EXIT
|
|
|
|
# Now make it bootable with the flags from build_image.
|
|
if should_build_image ${image_name}; then
|
|
"${SCRIPTS_DIR}/bin/cros_make_image_bootable" "${BUILD_DIR}" \
|
|
${image_name} \
|
|
--force_developer_mode
|
|
fi
|
|
}
|