blob: 0fc7cbb5f4bbb82c067482ff6a7b946fe5cba92d [file] [log] [blame]
# Copyright (c) 2012 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 dev
# images from base images. The main function for export in this
# library is 'install_dev_packages'.
# Modifies an existing image to add development packages.
# Takes as an arg the name of the image to be created.
install_dev_packages() {
local image_name=$1
info "Adding developer packages to ${image_name}"
trap "unmount_image ; delete_prompt" EXIT
mount_image "${BUILD_DIR}/${image_name}" "${root_fs_dir}" \
"${stateful_fs_dir}" "${esp_fs_dir}"
# Determine the root dir for developer packages.
local root_dev_dir="${root_fs_dir}/usr/local"
# Install dev-specific init scripts into / from chromeos-dev-init.
emerge_to_image --root="${root_fs_dir}" chromeos-dev-init
# Install developer packages described in chromeos-dev.
emerge_to_image --root="${root_dev_dir}" chromeos-dev
# Copy over the libc debug info so that gdb
# works with threads and also for a better debugging experience.
sudo mkdir -p "${root_fs_dir}/usr/local/usr/lib/debug"
pbzip2 -dc --ignore-trailing-garbage=1 "${LIBC_PATH}" | \
sudo tar xpf - -C "${root_fs_dir}/usr/local/usr/lib/debug" \
./usr/lib/debug/usr/${CHOST} --strip-components=6
# Since gdb only looks in /usr/lib/debug, symlink the /usr/local
# path so that it is found automatically.
sudo ln -s /usr/local/usr/lib/debug "${root_fs_dir}/usr/lib/debug"
# Install the bare necessary files so that the "emerge" command works
sudo cp -a ${root_dev_dir}/share/portage ${root_fs_dir}/usr/share
sudo sed -i s,/usr/bin/wget,wget, \
${root_fs_dir}/usr/share/portage/config/make.globals
sudo mkdir -p ${root_fs_dir}/etc/make.profile
# 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).
# TODO(arkaitzr): Remove this file when applications no longer rely on it
# (crosbug.com/16648). The preferred way of determining developer mode status
# is via crossystem cros_debug?1 (checks boot args for "cros_debug").
sudo mkdir -p "${root_fs_dir}/root"
sudo touch "${root_fs_dir}/root/.dev_mode"
# Additional changes to developer image.
# Leave core files for developers to inspect.
sudo touch "${root_fs_dir}/root/.leave_core"
# This hack is only needed for devs who have old versions of glibc, which
# filtered out ldd when cross-compiling. TODO(davidjames): Remove this hack
# once everybody has upgraded to a new version of glibc.
if [[ ! -x "${root_fs_dir}/usr/bin/ldd" ]]; then
sudo cp -a "$(which ldd)" "${root_fs_dir}/usr/bin"
fi
# 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
# If pygtk is installed in stateful-dev, then install a path.
local d
for d in "${root_fs_dir}"/usr/local/lib/python*/site-packages/gtk-2.0; do
if [[ -d ${d} ]]; then
sudo_clobber "${d%/*}/pygtk.pth" <<<"gtk-2.0"
fi
done
# File searches /usr/share by default, so add a wrapper script so it
# can find the right path in /usr/local.
local path="${root_fs_dir}/usr/local/bin/file"
if [[ -x ${path} ]]; then
sudo mv "${path}" "${path}.bin"
sudo_clobber "${path}" <<EOF
#!/bin/sh
exec file.bin -m /usr/local/share/misc/magic.mgc "\$@"
EOF
sudo chmod a+rx "${path}"
fi
# If python is installed on stateful-dev, fix python symlinks.
# Really we need to do this in order to clean up the python-wrapper
# mess from the eselect-python package.
if [[ -n $(ls "${root_fs_dir}"/usr/local/bin/python* 2>/dev/null) ]]; then
local pyver=$(ROOT="${root_fs_dir}/usr/local" eselect python show --ABI)
if [[ -z ${pyver} ]]; then
# TODO(build): Should be able to make this fatal once python-2.7 lands.
pyver=$(readlink "${root_fs_dir}"/usr/local/bin/python2 | sed s:python::)
fi
local python_path="/usr/local/bin/python${pyver}"
info "Fixing python symlinks for developer and test images."
local cmds=() path python_paths=(
/usr/{local/,}bin/python
/usr/{local/,}bin/python${pyver:0:1}
)
for path in "${python_paths[@]}"; do
cmds+=(
"ln -sfT '${python_path}' '${root_fs_dir}${path}'"
)
done
sudo_multi "${cmds[@]}"
fi
# If bash is not installed on rootfs, we'll need a bash symlink.
# Otherwise, emerge won't work.
if [[ ! -e "${root_fs_dir}"/bin/bash ]]; then
info "Fixing bash path for developer and test images."
sudo ln -sf /usr/local/bin/bash "${root_fs_dir}"/bin/bash
fi
info "Developer image built and stored at ${image_name}"
cleanup_mounts
trap - EXIT
if [[ ${skip_kernelblock_install} -ne 1 ]]; then
if should_build_image ${image_name}; then
${SCRIPTS_DIR}/bin/cros_make_image_bootable "${BUILD_DIR}" \
${image_name} --force_developer_mode
fi
fi
}