diff --git a/build_image b/build_image index 272ed424d9..4723ed22be 100755 --- a/build_image +++ b/build_image @@ -67,7 +67,16 @@ IMAGE_SUBDIR="${CHROMEOS_VERSION_STRING}-a${FLAGS_build_attempt}" OUTPUT_DIR="${FLAGS_output_root}/${FLAGS_board}/${IMAGE_SUBDIR}" ROOT_FS_DIR="${OUTPUT_DIR}/rootfs" ROOT_FS_IMG="${OUTPUT_DIR}/rootfs.image" -OUTPUT_IMG=${FLAGS_to:-${OUTPUT_DIR}/chromiumos_image.bin} + +# If we are creating a developer image, also create a pristine image with a +# different name. +DEVELOPER_IMAGE_NAME= +PRISTINE_IMAGE_NAME=chromiumos_image.bin +if [ "$FLAGS_withdev" -eq "$FLAGS_TRUE" ]; then + PRISTINE_IMAGE_NAME=chromiumos_base_image.bin + DEVELOPER_IMAGE_NAME=chromiumos_image.bin +fi +OUTPUT_IMG=${FLAGS_to:-${OUTPUT_DIR}/${PRISTINE_IMAGE_NAME}} BOARD="${FLAGS_board}" BOARD_ROOT="${FLAGS_build_root}/${BOARD}" @@ -163,6 +172,68 @@ delete_prompt() { fi } +# $1 - Directory where developer rootfs is mounted. +# $2 - Directory where developer stateful_partition is mounted. +developer_cleanup() { + "$SCRIPTS_DIR/mount_gpt_image.sh" -u -r "$1" -s "$2" + delete_prompt +} + +# Creates a new image based on $OUTPUT_IMG with additional developer packages. +create_developer_image() { + local root_fs_dir="${OUTPUT_DIR}/rootfs_dev" + local root_fs_img="${OUTPUT_DIR}/rootfs_dev.image" + local output_img="${OUTPUT_DIR}/${DEVELOPER_IMAGE_NAME}" + + # Create stateful partition of the same size as the rootfs. + local stateful_img="$OUTPUT_DIR/stateful_partition_dev.image" + local stateful_dir="$OUTPUT_DIR/stateful_partition_dev" + + trap "developer_cleanup \"$root_fs_dir\" \"$stateful_dir\"" EXIT + + # Mount a new copy of the base image. + echo "Creating developer image from base image $OUTPUT_IMG" + cp "$OUTPUT_IMG" "$output_img" + $SCRIPTS_DIR/mount_gpt_image.sh --from "$OUTPUT_DIR" \ + --image "$DEVELOPER_IMAGE_NAME" -r "$root_fs_dir" -s "$stateful_dir" + + # Determine the root dir for developer packages. + local root_dev_dir="$root_fs_dir" + [ $FLAGS_statefuldev -eq $FLAGS_TRUE ] && \ + root_dev_dir="$root_fs_dir/usr/local" + + # Install developer packages described in chromeos-dev. + sudo INSTALL_MASK="$INSTALL_MASK" emerge-${BOARD} \ + --root="$root_dev_dir" --root-deps=rdeps \ + --usepkgonly chromeos-dev $EMERGE_JOBS + + # Re-run ldconfig to fix /etc/ldconfig.so.cache. + sudo /sbin/ldconfig -r "$root_fs_dir" + + # Mark the image as a developer image (input to chromeos_startup). + sudo mkdir -p "$root_fs_dir/root" + sudo touch "$root_fs_dir/root/.dev_mode" + + # Additional changes to developer image. + + # The ldd tool is a useful shell script but lives in glibc; just copy it. + sudo cp -a "$(which ldd)" "${root_dev_dir}/usr/bin" + + # If vim is installed, then a vi symlink would probably help. + if [[ -x "${ROOT_FS_DIR}/usr/local/bin/vim" ]]; then + sudo ln -sf vim "${ROOT_FS_DIR}/usr/local/bin/vi" + fi + + # Check that the image has been correctly created. + "${SCRIPTS_DIR}/test_image" \ + --root="$root_fs_dir" \ + --target="$ARCH" + + trap - EXIT + $SCRIPTS_DIR/mount_gpt_image.sh -u -r "$root_fs_dir" -s "$stateful_dir" + echo "Developer image built and stored at $output_img" +} + # ${DEV_IMAGE_ROOT} specifies the location of where developer packages will # be installed on the stateful dir. On a Chromium OS system, this will # translate to /usr/local @@ -302,24 +373,6 @@ sudo INSTALL_MASK="$INSTALL_MASK" emerge-${BOARD} \ --root="$ROOT_FS_DIR" --root-deps=rdeps \ --usepkgonly chromeos $EMERGE_JOBS -# Determine the root dir for development packages. -ROOT_DEV_DIR="$ROOT_FS_DIR" -[ $FLAGS_statefuldev -eq $FLAGS_TRUE ] && ROOT_DEV_DIR="$ROOT_FS_DIR/usr/local" - -# Install development packages. -if [[ $FLAGS_withdev -eq $FLAGS_TRUE ]] ; then - sudo INSTALL_MASK="$INSTALL_MASK" emerge-${BOARD} \ - --root="$ROOT_DEV_DIR" --root-deps=rdeps \ - --usepkgonly chromeos-dev $EMERGE_JOBS - - # TODO(sosa@chromium.org) - Re-hide under statefuldev after switch - # Flag will mount /usr/local on target device - sudo mkdir -p "$ROOT_FS_DIR/root" - - # The ldd tool is a useful shell script but lives in glibc; just copy it. - sudo cp -a "$(which ldd)" "${ROOT_DEV_DIR}/usr/bin" -fi - # Extract the kernel from the root filesystem for use by the GPT image. Legacy # BIOS will use the kernel in the rootfs (via syslinux), Chrome OS BIOS will # use the kernel partition. @@ -361,15 +414,6 @@ menuentry "local image B" { EOF -# By default, dev mode should be activated for either development builds or -# test builds. -if [[ $FLAGS_withdev -eq $FLAGS_TRUE ]] ; then - sudo touch "$ROOT_FS_DIR/root/.dev_mode" - - # Re-run ldconfig to fix /etc/ldconfig.so.cache. - sudo /sbin/ldconfig -r "$ROOT_FS_DIR" -fi - # Perform any customizations on the root file system that are needed. "${SCRIPTS_DIR}/customize_rootfs" \ --root="$ROOT_FS_DIR" \ @@ -408,11 +452,18 @@ rm -f "${ROOT_FS_IMG}" "${STATEFUL_IMG}" "${OUTPUT_DIR}/vmlinuz.image" \ rmdir "${ROOT_FS_DIR}" "${STATEFUL_DIR}" "${ESP_DIR}" OUTSIDE_OUTPUT_DIR="../build/images/${FLAGS_board}/${IMAGE_SUBDIR}" + +# Create a developer image based on the chromium os base image +[ "$FLAGS_withdev" -eq "$FLAGS_TRUE" ] && create_developer_image +trap - EXIT + echo "Done. Image created in ${OUTPUT_DIR}" +echo "Chromium OS image created as $PRISTINE_IMAGE_NAME" +if [ "$FLAGS_withdev" -eq "$FLAGS_TRUE" ]; then + echo "Developer image created as $DEVELOPER_IMAGE_NAME" +fi echo "To copy to USB keyfob, OUTSIDE the chroot, do something like:" echo " ./image_to_usb.sh --from=${OUTSIDE_OUTPUT_DIR} --to=/dev/sdX" echo "To convert to VMWare image, OUTSIDE the chroot, do something like:" echo " ./image_to_vmware.sh --from=${OUTSIDE_OUTPUT_DIR}" echo "from the scripts directory where you entered the chroot." - -trap - EXIT diff --git a/mount_gpt_image.sh b/mount_gpt_image.sh index a739675d49..a40a6bc315 100755 --- a/mount_gpt_image.sh +++ b/mount_gpt_image.sh @@ -41,12 +41,10 @@ function unmount_image() { "and ${FLAGS_rootfs_mountpt}" # Don't die on error to force cleanup set +e - if [ -e "${FLAGS_rootfs_mountpt}/root/.dev_mode" ] ; then - # Reset symlinks in /usr/local. - setup_symlinks_on_root "/usr/local" "/var" \ - "${FLAGS_stateful_mountpt}" - sudo umount "${FLAGS_rootfs_mountpt}/usr/local" - fi + # Reset symlinks in /usr/local. + setup_symlinks_on_root "/usr/local" "/var" \ + "${FLAGS_stateful_mountpt}" + sudo umount "${FLAGS_rootfs_mountpt}/usr/local" sudo umount "${FLAGS_rootfs_mountpt}/var" sudo umount -d "${FLAGS_stateful_mountpt}" sudo umount -d "${FLAGS_rootfs_mountpt}" @@ -84,16 +82,14 @@ function mount_image() { get_gpt_partitions fi - # Mount var unconditionally and then setup /usr/local for user of dev mode. + # Mount directories and setup symlinks. sudo mount --bind "${FLAGS_stateful_mountpt}/var" \ "${FLAGS_rootfs_mountpt}/var" - if [ -e "${FLAGS_rootfs_mountpt}/root/.dev_mode" ] ; then - sudo mount --bind "${FLAGS_stateful_mountpt}/dev_image" \ - "${FLAGS_rootfs_mountpt}/usr/local" - # Setup symlinks in /usr/local so you can emerge packages into /usr/local. - setup_symlinks_on_root "${FLAGS_stateful_mountpt}/dev_image" \ - "${FLAGS_stateful_mountpt}/var" "${FLAGS_stateful_mountpt}" - fi + sudo mount --bind "${FLAGS_stateful_mountpt}/dev_image" \ + "${FLAGS_rootfs_mountpt}/usr/local" + # Setup symlinks in /usr/local so you can emerge packages into /usr/local. + setup_symlinks_on_root "${FLAGS_stateful_mountpt}/dev_image" \ + "${FLAGS_stateful_mountpt}/var" "${FLAGS_stateful_mountpt}" echo "Image specified by ${FLAGS_from} mounted at"\ "${FLAGS_rootfs_mountpt} successfully." }