Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(172)

Unified Diff: src/scripts/install_packages.sh

Issue 517003: Change install_packages.sh to run from outside of the target rootfs (Closed)
Patch Set: Created 11 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/scripts/build_image.sh ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/scripts/install_packages.sh
diff --git a/src/scripts/install_packages.sh b/src/scripts/install_packages.sh
index 86bcfebea26d500daf63dd1fc09d4c1a8eb465f8..79917b634babb7840c2a3b476ea9d3dd2481307d 100755
--- a/src/scripts/install_packages.sh
+++ b/src/scripts/install_packages.sh
@@ -1,37 +1,103 @@
-#!/bin/sh
+#!/bin/bash
# Copyright (c) 2009 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.
-# Sets up the chromium-based os from inside a chroot of the root fs.
+# Script to install packages into the target root file system.
+#
# NOTE: This script should be called by build_image.sh. Do not run this
# on your own unless you know what you are doing.
-set -e
+# Load common constants. This should be the first executable line.
+# The path to common.sh should be relative to your script's location.
+. "$(dirname "$0")/common.sh"
+
+# Script must be run inside the chroot
+assert_inside_chroot
-# Read options from the config file created by build_image.sh.
-echo "Reading options..."
-cat "$(dirname $0)/customize_opts.sh"
-. "$(dirname $0)/customize_opts.sh"
+# Flags
+DEFINE_string target "x86" \
+ "The target architecture to build for. One of { x86, arm }."
+DEFINE_string root "" \
+ "The root file system to install packages in."
+DEFINE_string output_dir "" \
+ "The location of the output directory to use."
+DEFINE_string package_list "" \
+ "The package list file to use."
+DEFINE_string setup_dir "/tmp" \
+ "The staging directory to use."
+DEFINE_string server "" \
+ "The package server to use."
+DEFINE_string suite "" \
+ "The package suite to use."
+DEFINE_string kernel_version "" \
+ "The kernel version to use."
-PACKAGE_LIST_FILE="${SETUP_DIR}/package-list-prod.txt"
-PACKAGE_LIST_FILE2="${SETUP_DIR}/package-list-2.txt"
-COMPONENTS=`cat $PACKAGE_LIST_FILE | grep -v ' *#' | grep -v '^ *$' | sed '/$/{N;s/\n/ /;}'`
+# Parse command line
+FLAGS "$@" || exit 1
+eval set -- "${FLAGS_ARGV}"
+
+# Die on any errors.
+set -e
+
+ROOT_FS_DIR="$FLAGS_root"
+if [[ -z "$ROOT_FS_DIR" ]]; then
+ echo "Error: --root is required."
+ exit 1
+fi
+if [[ ! -d "$ROOT_FS_DIR" ]]; then
+ echo "Error: Root FS does not exist? ($ROOT_FS_DIR)"
+ exit 1
+fi
# Create the temporary apt source.list used to install packages.
-cat <<EOF > /etc/apt/sources.list
-deb file:"$SETUP_DIR" local_packages/
-deb $SERVER $SUITE main restricted multiverse universe
+APT_SOURCE="${ROOT_FS_DIR}/../sources.list"
+cat <<EOF > "$APT_SOURCE"
+deb file:"$FLAGS_setup_dir" local_packages/
+deb $FLAGS_server $FLAGS_suite main restricted multiverse universe
EOF
+# Cache directory for APT to use.
+APT_CACHE_DIR="${FLAGS_output_dir}/tmp/cache/"
+mkdir -p "${APT_CACHE_DIR}/archives/partial"
+
+# Create the apt configuration file. See "man apt.conf"
+APT_CONFIG="${ROOT_FS_DIR}/../apt.conf"
+cat <<EOF > "$APT_CONFIG"
+Dir
+{
+ Cache "$APT_CACHE_DIR"; # TODO: Empty string to disable?
+ Cache {
+ archives "${APT_CACHE_DIR}/archives"; # TODO: Why do we need this?
+ };
+ Etc
+ {
+ sourcelist "$APT_SOURCE"
+ };
+ State "${ROOT_FS_DIR}/var/lib/apt/";
+ State
+ {
+ status "${ROOT_FS_DIR}/var/lib/dpkg/status";
+ };
+};
+DPkg
+{
+ options {"--root=${ROOT_FS_DIR}";};
+};
+EOF
+
+# TODO: Full audit of the apt conf dump to make sure things are ok.
+apt-config -c="$APT_CONFIG" dump > "${ROOT_FS_DIR}/../apt.conf.dump"
+
# Install prod packages
-apt-get update
-apt-get --yes --force-yes install $COMPONENTS
+COMPONENTS=`cat $FLAGS_package_list | grep -v ' *#' | grep -v '^ *$' | sed '/$/{N;s/\n/ /;}'`
+sudo apt-get -c="$APT_CONFIG" update
+sudo apt-get -c="$APT_CONFIG" --yes --force-yes install $COMPONENTS
# Create kernel installation configuration to suppress warnings,
# install the kernel in /boot, and manage symlinks.
-cat <<EOF > /etc/kernel-img.conf
+cat <<EOF | sudo dd of="${ROOT_FS_DIR}/etc/kernel-img.conf"
link_in_boot = yes
do_symlinks = yes
minimal_swap = yes
@@ -42,41 +108,23 @@ do_initrd = yes
warn_initrd = no
EOF
-# NB: KERNEL_VERSION comes from customize_opts.sh
-apt-get --yes --force-yes --no-install-recommends \
- install "linux-image-${KERNEL_VERSION}"
+# Install the kernel.
+sudo apt-get -c="$APT_CONFIG" --yes --force-yes --no-install-recommends \
+ install "linux-image-${FLAGS_kernel_version}"
# Setup bootchart.
# TODO: Move this and other developer oriented "components" into an optional
# package-list-prod-dev.txt (ideally with a better name).
-apt-get --yes --force-yes --no-install-recommends install bootchart
-
-# Install additional packages from a second mirror, if necessary. This must
-# be done after all packages from the first repository are installed; after
-# the apt-get update, apt-get and debootstrap will prefer the newest package
-# versions (which are probably on this second mirror).
-if [ -f "$PACKAGE_LIST_FILE2" ]
-then
- COMPONENTS2=`cat $PACKAGE_LIST_FILE2 | grep -v ' *#' | grep -v '^ *$' | sed '/$/{N;s/\n/ /;}'`
-
- echo "deb $SERVER2 $SUITE2 main restricted multiverse universe" \
- >> /etc/apt/sources.list
- apt-get update
- apt-get --yes --force-yes --no-install-recommends \
- install $COMPONENTS2
-fi
+sudo apt-get -c="$APT_CONFIG" --yes --force-yes --no-install-recommends \
+ install bootchart
+
+# Clean up the apt cache.
+# TODO: The cache was populated by debootstrap, not these installs. Remove
+# this line when we can get debootstrap to stop doing this.
+sudo rm -f "${ROOT_FS_DIR}"/var/cache/apt/archives/*.deb
# List all packages installed so far, since these are what the local
# repository needs to contain.
-# TODO: better place to put the list. Must still exist after the chroot
-# is dismounted, so build_image.sh can get it. That rules out /tmp and
-# $SETUP_DIR (which is under /tmp).
-sudo sh -c "/trunk/src/scripts/list_installed_packages.sh \
- > /etc/package_list_installed.txt"
-
-# Clean up other useless stuff created as part of the install process.
-rm -f /var/cache/apt/archives/*.deb
-
-# List all packages still installed post-pruning
-sudo sh -c "/trunk/src/scripts/list_installed_packages.sh \
- > /etc/package_list_pruned.txt"
+# TODO: Replace with list_installed_packages.sh when it is fixed up.
+dpkg --root="${ROOT_FS_DIR}" -l > \
+ "${FLAGS_output_dir}/package_list_installed.txt"
« no previous file with comments | « src/scripts/build_image.sh ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698