| OLD | NEW | 
|    1 #!/bin/bash |    1 #!/bin/bash | 
|    2  |    2  | 
|    3 # Copyright (c) 2009 The Chromium OS Authors. All rights reserved. |    3 # Copyright (c) 2009 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 build a bootable keyfob-based chromeos system image from within |    7 # Script to build a bootable keyfob-based chromeos system image from within | 
|    8 # a chromiumos setup. This assumes that all needed packages have been built into |    8 # a chromiumos setup. This assumes that all needed packages have been built into | 
|    9 # the given target's root with binary packages turned on. This script will |    9 # the given target's root with binary packages turned on. This script will | 
|   10 # build the Chrome OS image using only pre-built binary packages. |   10 # build the Chrome OS image using only pre-built binary packages. | 
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   60  |   60  | 
|   61 # Determine build version. |   61 # Determine build version. | 
|   62 . "${SCRIPTS_DIR}/chromeos_version.sh" |   62 . "${SCRIPTS_DIR}/chromeos_version.sh" | 
|   63  |   63  | 
|   64 # Use canonical path since some tools (e.g. mount) do not like symlinks. |   64 # Use canonical path since some tools (e.g. mount) do not like symlinks. | 
|   65 # Append build attempt to output directory. |   65 # Append build attempt to output directory. | 
|   66 IMAGE_SUBDIR="${CHROMEOS_VERSION_STRING}-a${FLAGS_build_attempt}" |   66 IMAGE_SUBDIR="${CHROMEOS_VERSION_STRING}-a${FLAGS_build_attempt}" | 
|   67 OUTPUT_DIR="${FLAGS_output_root}/${FLAGS_board}/${IMAGE_SUBDIR}" |   67 OUTPUT_DIR="${FLAGS_output_root}/${FLAGS_board}/${IMAGE_SUBDIR}" | 
|   68 ROOT_FS_DIR="${OUTPUT_DIR}/rootfs" |   68 ROOT_FS_DIR="${OUTPUT_DIR}/rootfs" | 
|   69 ROOT_FS_IMG="${OUTPUT_DIR}/rootfs.image" |   69 ROOT_FS_IMG="${OUTPUT_DIR}/rootfs.image" | 
|   70 OUTPUT_IMG=${FLAGS_to:-${OUTPUT_DIR}/chromiumos_image.bin} |   70  | 
 |   71 # If we are creating a developer image, also create a pristine image with a | 
 |   72 # different name. | 
 |   73 DEVELOPER_IMAGE_NAME= | 
 |   74 PRISTINE_IMAGE_NAME=chromiumos_image.bin | 
 |   75 if [ "$FLAGS_withdev" -eq "$FLAGS_TRUE" ]; then | 
 |   76   PRISTINE_IMAGE_NAME=chromiumos_base_image.bin | 
 |   77   DEVELOPER_IMAGE_NAME=chromiumos_image.bin | 
 |   78 fi | 
 |   79 OUTPUT_IMG=${FLAGS_to:-${OUTPUT_DIR}/${PRISTINE_IMAGE_NAME}} | 
|   71  |   80  | 
|   72 BOARD="${FLAGS_board}" |   81 BOARD="${FLAGS_board}" | 
|   73 BOARD_ROOT="${FLAGS_build_root}/${BOARD}" |   82 BOARD_ROOT="${FLAGS_build_root}/${BOARD}" | 
|   74  |   83  | 
|   75 LOOP_DEV= |   84 LOOP_DEV= | 
|   76 STATEFUL_LOOP_DEV= |   85 STATEFUL_LOOP_DEV= | 
|   77 ESP_LOOP_DEV= |   86 ESP_LOOP_DEV= | 
|   78  |   87  | 
|   79 # What cross-build are we targeting? |   88 # What cross-build are we targeting? | 
|   80 . "${BOARD_ROOT}/etc/make.conf.board_setup" |   89 . "${BOARD_ROOT}/etc/make.conf.board_setup" | 
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  156   SURE="${SURE:0:1}" # Get just the first character |  165   SURE="${SURE:0:1}" # Get just the first character | 
|  157   if [ "${SURE}" == "y" ] ; then |  166   if [ "${SURE}" == "y" ] ; then | 
|  158     sudo rm -rf "$OUTPUT_DIR" |  167     sudo rm -rf "$OUTPUT_DIR" | 
|  159     echo "Deleted $OUTPUT_DIR" |  168     echo "Deleted $OUTPUT_DIR" | 
|  160   else |  169   else | 
|  161     echo "Not deleting $OUTPUT_DIR. Note dev server updates will not work" \ |  170     echo "Not deleting $OUTPUT_DIR. Note dev server updates will not work" \ | 
|  162       "until you successfully build another image or delete this directory" |  171       "until you successfully build another image or delete this directory" | 
|  163   fi |  172   fi | 
|  164 } |  173 } | 
|  165  |  174  | 
 |  175 # $1 - Directory where developer rootfs is mounted. | 
 |  176 # $2 - Directory where developer stateful_partition is mounted. | 
 |  177 developer_cleanup() { | 
 |  178   "$SCRIPTS_DIR/mount_gpt_image.sh" -u -r "$1" -s "$2" | 
 |  179   delete_prompt | 
 |  180 } | 
 |  181  | 
 |  182 # Creates a new image based on $OUTPUT_IMG with additional developer packages. | 
 |  183 create_developer_image() { | 
 |  184   local root_fs_dir="${OUTPUT_DIR}/rootfs_dev" | 
 |  185   local root_fs_img="${OUTPUT_DIR}/rootfs_dev.image" | 
 |  186   local output_img="${OUTPUT_DIR}/${DEVELOPER_IMAGE_NAME}" | 
 |  187  | 
 |  188   # Create stateful partition of the same size as the rootfs. | 
 |  189   local stateful_img="$OUTPUT_DIR/stateful_partition_dev.image" | 
 |  190   local stateful_dir="$OUTPUT_DIR/stateful_partition_dev" | 
 |  191  | 
 |  192   trap "developer_cleanup \"$root_fs_dir\" \"$stateful_dir\"" EXIT | 
 |  193  | 
 |  194   # Mount a new copy of the base image. | 
 |  195   echo "Creating developer image from base image $OUTPUT_IMG" | 
 |  196   cp "$OUTPUT_IMG" "$output_img" | 
 |  197   $SCRIPTS_DIR/mount_gpt_image.sh --from "$OUTPUT_DIR" \ | 
 |  198     --image "$DEVELOPER_IMAGE_NAME" -r "$root_fs_dir" -s "$stateful_dir" | 
 |  199  | 
 |  200   # Determine the root dir for developer packages. | 
 |  201   local root_dev_dir="$root_fs_dir" | 
 |  202   [ $FLAGS_statefuldev -eq $FLAGS_TRUE ] && \ | 
 |  203     root_dev_dir="$root_fs_dir/usr/local" | 
 |  204  | 
 |  205   # Install developer packages described in chromeos-dev. | 
 |  206   sudo INSTALL_MASK="$INSTALL_MASK" emerge-${BOARD} \ | 
 |  207       --root="$root_dev_dir" --root-deps=rdeps \ | 
 |  208       --usepkgonly chromeos-dev $EMERGE_JOBS | 
 |  209  | 
 |  210   # Re-run ldconfig to fix /etc/ldconfig.so.cache. | 
 |  211   sudo /sbin/ldconfig -r "$root_fs_dir" | 
 |  212  | 
 |  213   # Mark the image as a developer image (input to chromeos_startup). | 
 |  214   sudo mkdir -p "$root_fs_dir/root" | 
 |  215   sudo touch "$root_fs_dir/root/.dev_mode" | 
 |  216  | 
 |  217   # Additional changes to developer image. | 
 |  218  | 
 |  219   # The ldd tool is a useful shell script but lives in glibc; just copy it. | 
 |  220   sudo cp -a "$(which ldd)" "${root_dev_dir}/usr/bin" | 
 |  221  | 
 |  222   # If vim is installed, then a vi symlink would probably help. | 
 |  223   if [[ -x "${ROOT_FS_DIR}/usr/local/bin/vim" ]]; then | 
 |  224     sudo ln -sf vim "${ROOT_FS_DIR}/usr/local/bin/vi" | 
 |  225   fi | 
 |  226  | 
 |  227   # Check that the image has been correctly created. | 
 |  228   "${SCRIPTS_DIR}/test_image" \ | 
 |  229     --root="$root_fs_dir" \ | 
 |  230     --target="$ARCH" | 
 |  231  | 
 |  232   trap - EXIT | 
 |  233   $SCRIPTS_DIR/mount_gpt_image.sh -u -r "$root_fs_dir" -s "$stateful_dir" | 
 |  234   echo "Developer image built and stored at $output_img" | 
 |  235 } | 
 |  236  | 
|  166 # ${DEV_IMAGE_ROOT} specifies the location of where developer packages will |  237 # ${DEV_IMAGE_ROOT} specifies the location of where developer packages will | 
|  167 # be installed on the stateful dir.  On a Chromium OS system, this will |  238 # be installed on the stateful dir.  On a Chromium OS system, this will | 
|  168 # translate to /usr/local |  239 # translate to /usr/local | 
|  169 DEV_IMAGE_ROOT= |  240 DEV_IMAGE_ROOT= | 
|  170  |  241  | 
|  171 trap "cleanup && delete_prompt" EXIT |  242 trap "cleanup && delete_prompt" EXIT | 
|  172  |  243  | 
|  173 mkdir -p "$ROOT_FS_DIR" |  244 mkdir -p "$ROOT_FS_DIR" | 
|  174  |  245  | 
|  175 # Create and format the root file system. |  246 # Create and format the root file system. | 
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  295 sudo mount --bind "${STATEFUL_DIR}/var" "${ROOT_FS_DIR}/var" |  366 sudo mount --bind "${STATEFUL_DIR}/var" "${ROOT_FS_DIR}/var" | 
|  296  |  367  | 
|  297 # We "emerge --root=$ROOT_FS_DIR --root-deps=rdeps --usepkgonly" all of the |  368 # We "emerge --root=$ROOT_FS_DIR --root-deps=rdeps --usepkgonly" all of the | 
|  298 # runtime packages for chrome os. This builds up a chrome os image from binary |  369 # runtime packages for chrome os. This builds up a chrome os image from binary | 
|  299 # packages with runtime dependencies only.  We use INSTALL_MASK to trim the |  370 # packages with runtime dependencies only.  We use INSTALL_MASK to trim the | 
|  300 # image size as much as possible. |  371 # image size as much as possible. | 
|  301 sudo INSTALL_MASK="$INSTALL_MASK" emerge-${BOARD} \ |  372 sudo INSTALL_MASK="$INSTALL_MASK" emerge-${BOARD} \ | 
|  302   --root="$ROOT_FS_DIR" --root-deps=rdeps \ |  373   --root="$ROOT_FS_DIR" --root-deps=rdeps \ | 
|  303   --usepkgonly chromeos $EMERGE_JOBS |  374   --usepkgonly chromeos $EMERGE_JOBS | 
|  304  |  375  | 
|  305 # Determine the root dir for development packages. |  | 
|  306 ROOT_DEV_DIR="$ROOT_FS_DIR" |  | 
|  307 [ $FLAGS_statefuldev -eq $FLAGS_TRUE ] && ROOT_DEV_DIR="$ROOT_FS_DIR/usr/local" |  | 
|  308  |  | 
|  309 # Install development packages. |  | 
|  310 if [[ $FLAGS_withdev -eq $FLAGS_TRUE ]] ; then |  | 
|  311   sudo INSTALL_MASK="$INSTALL_MASK" emerge-${BOARD} \ |  | 
|  312       --root="$ROOT_DEV_DIR" --root-deps=rdeps \ |  | 
|  313       --usepkgonly chromeos-dev $EMERGE_JOBS |  | 
|  314  |  | 
|  315   # TODO(sosa@chromium.org) - Re-hide under statefuldev after switch |  | 
|  316   # Flag will mount /usr/local on target device |  | 
|  317   sudo mkdir -p "$ROOT_FS_DIR/root" |  | 
|  318  |  | 
|  319   # The ldd tool is a useful shell script but lives in glibc; just copy it. |  | 
|  320   sudo cp -a "$(which ldd)" "${ROOT_DEV_DIR}/usr/bin" |  | 
|  321 fi |  | 
|  322  |  | 
|  323 # Extract the kernel from the root filesystem for use by the GPT image. Legacy |  376 # Extract the kernel from the root filesystem for use by the GPT image. Legacy | 
|  324 # BIOS will use the kernel in the rootfs (via syslinux), Chrome OS BIOS will |  377 # BIOS will use the kernel in the rootfs (via syslinux), Chrome OS BIOS will | 
|  325 # use the kernel partition. |  378 # use the kernel partition. | 
|  326 sudo cp -f "${ROOT_FS_DIR}/boot/vmlinuz" "${OUTPUT_DIR}/vmlinuz.image" |  379 sudo cp -f "${ROOT_FS_DIR}/boot/vmlinuz" "${OUTPUT_DIR}/vmlinuz.image" | 
|  327  |  380  | 
|  328 # Create EFI System Partition to boot stock EFI BIOS (but not ChromeOS EFI |  381 # Create EFI System Partition to boot stock EFI BIOS (but not ChromeOS EFI | 
|  329 # BIOS). We only need this for x86, but it's simpler and safer to keep the disk |  382 # BIOS). We only need this for x86, but it's simpler and safer to keep the disk | 
|  330 # images the same for both x86 and ARM. |  383 # images the same for both x86 and ARM. | 
|  331 ESP_IMG=${OUTPUT_DIR}/esp.image |  384 ESP_IMG=${OUTPUT_DIR}/esp.image | 
|  332 # NOTE: The size argument for mkfs.vfat is in 1024-byte blocks. We'll hard-code |  385 # NOTE: The size argument for mkfs.vfat is in 1024-byte blocks. We'll hard-code | 
| (...skipping 21 matching lines...) Expand all  Loading... | 
|  354 menuentry "local image A" { |  407 menuentry "local image A" { | 
|  355   linux $grubpartA/boot/vmlinuz quiet console=tty2 init=/sbin/init boot=local ro
     otwait root=/dev/$linuxpartA ro noresume noswap i915.modeset=1 loglevel=1 |  408   linux $grubpartA/boot/vmlinuz quiet console=tty2 init=/sbin/init boot=local ro
     otwait root=/dev/$linuxpartA ro noresume noswap i915.modeset=1 loglevel=1 | 
|  356 } |  409 } | 
|  357  |  410  | 
|  358 menuentry "local image B" { |  411 menuentry "local image B" { | 
|  359   linux $grubpartB/boot/vmlinuz quiet console=tty2 init=/sbin/init boot=local ro
     otwait root=/dev/$linuxpartB ro noresume noswap i915.modeset=1 loglevel=1 |  412   linux $grubpartB/boot/vmlinuz quiet console=tty2 init=/sbin/init boot=local ro
     otwait root=/dev/$linuxpartB ro noresume noswap i915.modeset=1 loglevel=1 | 
|  360 } |  413 } | 
|  361  |  414  | 
|  362 EOF |  415 EOF | 
|  363  |  416  | 
|  364 # By default, dev mode should be activated for either development builds or |  | 
|  365 # test builds. |  | 
|  366 if [[ $FLAGS_withdev -eq $FLAGS_TRUE ]] ; then |  | 
|  367   sudo touch "$ROOT_FS_DIR/root/.dev_mode" |  | 
|  368  |  | 
|  369   # Re-run ldconfig to fix /etc/ldconfig.so.cache. |  | 
|  370   sudo /sbin/ldconfig -r "$ROOT_FS_DIR" |  | 
|  371 fi |  | 
|  372  |  | 
|  373 # Perform any customizations on the root file system that are needed. |  417 # Perform any customizations on the root file system that are needed. | 
|  374 "${SCRIPTS_DIR}/customize_rootfs" \ |  418 "${SCRIPTS_DIR}/customize_rootfs" \ | 
|  375   --root="$ROOT_FS_DIR" \ |  419   --root="$ROOT_FS_DIR" \ | 
|  376   --target="$ARCH" \ |  420   --target="$ARCH" \ | 
|  377   --board="$BOARD" |  421   --board="$BOARD" | 
|  378  |  422  | 
|  379 # Don't test the factory install shim. |  423 # Don't test the factory install shim. | 
|  380 if [[ $FLAGS_factory_install -eq ${FLAGS_FALSE} ]] ; then |  424 if [[ $FLAGS_factory_install -eq ${FLAGS_FALSE} ]] ; then | 
|  381   # Check that the image has been correctly created. |  425   # Check that the image has been correctly created. | 
|  382   "${SCRIPTS_DIR}/test_image" \ |  426   "${SCRIPTS_DIR}/test_image" \ | 
| (...skipping 18 matching lines...) Expand all  Loading... | 
|  401   --arm_extra_bootargs="${FLAGS_arm_extra_bootargs}" \ |  445   --arm_extra_bootargs="${FLAGS_arm_extra_bootargs}" \ | 
|  402   "${OUTPUT_DIR}" \ |  446   "${OUTPUT_DIR}" \ | 
|  403   "${OUTPUT_IMG}" |  447   "${OUTPUT_IMG}" | 
|  404  |  448  | 
|  405 # Clean up temporary files. |  449 # Clean up temporary files. | 
|  406 rm -f "${ROOT_FS_IMG}" "${STATEFUL_IMG}" "${OUTPUT_DIR}/vmlinuz.image" \ |  450 rm -f "${ROOT_FS_IMG}" "${STATEFUL_IMG}" "${OUTPUT_DIR}/vmlinuz.image" \ | 
|  407   "${ESP_IMG}" |  451   "${ESP_IMG}" | 
|  408 rmdir "${ROOT_FS_DIR}" "${STATEFUL_DIR}" "${ESP_DIR}" |  452 rmdir "${ROOT_FS_DIR}" "${STATEFUL_DIR}" "${ESP_DIR}" | 
|  409  |  453  | 
|  410 OUTSIDE_OUTPUT_DIR="../build/images/${FLAGS_board}/${IMAGE_SUBDIR}" |  454 OUTSIDE_OUTPUT_DIR="../build/images/${FLAGS_board}/${IMAGE_SUBDIR}" | 
 |  455  | 
 |  456 # Create a developer image based on the chromium os base image | 
 |  457 [ "$FLAGS_withdev" -eq "$FLAGS_TRUE" ] && create_developer_image | 
 |  458 trap - EXIT | 
 |  459  | 
|  411 echo "Done.  Image created in ${OUTPUT_DIR}" |  460 echo "Done.  Image created in ${OUTPUT_DIR}" | 
 |  461 echo "Chromium OS image created as $PRISTINE_IMAGE_NAME" | 
 |  462 if [ "$FLAGS_withdev" -eq "$FLAGS_TRUE" ]; then | 
 |  463   echo "Developer image created as $DEVELOPER_IMAGE_NAME" | 
 |  464 fi | 
|  412 echo "To copy to USB keyfob, OUTSIDE the chroot, do something like:" |  465 echo "To copy to USB keyfob, OUTSIDE the chroot, do something like:" | 
|  413 echo "  ./image_to_usb.sh --from=${OUTSIDE_OUTPUT_DIR} --to=/dev/sdX" |  466 echo "  ./image_to_usb.sh --from=${OUTSIDE_OUTPUT_DIR} --to=/dev/sdX" | 
|  414 echo "To convert to VMWare image, OUTSIDE the chroot, do something like:" |  467 echo "To convert to VMWare image, OUTSIDE the chroot, do something like:" | 
|  415 echo "  ./image_to_vmware.sh --from=${OUTSIDE_OUTPUT_DIR}" |  468 echo "  ./image_to_vmware.sh --from=${OUTSIDE_OUTPUT_DIR}" | 
|  416 echo "from the scripts directory where you entered the chroot." |  469 echo "from the scripts directory where you entered the chroot." | 
|  417  |  | 
|  418 trap - EXIT |  | 
| OLD | NEW |