blob: e781142553e95b38c509ed05fe36033ffd517319 [file] [log] [blame]
# Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
# Distributed under the terms of the GNU General Public License v2
# WARNING: cros_workon cannot detect changes to files/, please ensure
# that you manually bump or make some change to the 9999 ebuild until
# this is fixed.
EAPI=2
CROS_WORKON_COMMIT="85a6943b54156a109cbd512371605a39d20a2831"
CROS_WORKON_PROJECT="chromiumos/platform/initramfs"
inherit cros-workon
DESCRIPTION="Create Chrome OS initramfs"
HOMEPAGE="http://www.chromium.org/"
LICENSE="GPL-2"
SLOT="0"
KEYWORDS="amd64 arm x86"
IUSE=""
DEPEND="chromeos-base/vboot_reference
chromeos-base/vpd
media-gfx/ply-image
sys-apps/busybox
sys-apps/flashrom
sys-apps/pciutils
sys-apps/pv
sys-fs/lvm2"
RDEPEND=""
CROS_WORKON_LOCALNAME="../platform/initramfs"
INITRAMFS_TMP_S=${WORKDIR}/initramfs_tmp
# Suffixed with cpio or not recognize filetype.
INITRAMFS_FILE="initramfs.cpio.gz"
build_initramfs_file() {
mkdir -p ${INITRAMFS_TMP_S}/bin ${INITRAMFS_TMP_S}/sbin
mkdir -p ${INITRAMFS_TMP_S}/usr/bin ${INITRAMFS_TMP_S}/usr/sbin
mkdir -p ${INITRAMFS_TMP_S}/etc ${INITRAMFS_TMP_S}/dev
mkdir -p ${INITRAMFS_TMP_S}/root ${INITRAMFS_TMP_S}/proc
mkdir -p ${INITRAMFS_TMP_S}/sys ${INITRAMFS_TMP_S}/usb
mkdir -p ${INITRAMFS_TMP_S}/newroot
mkdir -p ${INITRAMFS_TMP_S}/lib ${INITRAMFS_TMP_S}/usr/lib
mkdir -p ${INITRAMFS_TMP_S}/stateful ${INITRAMFS_TMP_S}/tmp
mkdir -p ${INITRAMFS_TMP_S}/log
# Copy source files not merged from our dependencies.
cp "${S}/init" "${INITRAMFS_TMP_S}/init" || die
chmod +x "${INITRAMFS_TMP_S}/init"
for shlib in *.sh; do
cp "${S}"/${shlib} ${INITRAMFS_TMP_S}/lib || die
done
cp -r ${S}/screens ${INITRAMFS_TMP_S}/etc || die
# Load libraries for busybox, dmsetup, & vbutil_kernel
# TODO: how can ebuilds support static busybox?
if use x86 ; then
LIBS="
ld-linux.so.2
../usr/lib/libdrm_intel.so.1.0.0
"
else
# TODO ARM: why does arm use a different dynamic linker here?
LIBS="
ld-linux.so.3
libgcc_s.so.1
"
fi
LIBS="${LIBS}
libm.so.6
libc.so.6
libresolv.so.2
../usr/lib/libcrypto.so.0.9.8
../usr/lib/libpng12.so.0.44.0
../usr/lib/libdrm.so.2.4.0
../usr/lib/libpci.so.3
libdevmapper.so.1.02
libdl.so.2
libpthread.so.0
librt.so.1
libz.so.1
"
for lib in $LIBS; do
cp ${ROOT}/lib/${lib} ${INITRAMFS_TMP_S}/lib || die
done
ln -s libpng12.so.0.44.0 ${INITRAMFS_TMP_S}/lib/libpng12.so.0
ln -s libpng12.so.0.44.0 ${INITRAMFS_TMP_S}/lib/libpng12.so
ln -s libdrm.so.2.4.0 ${INITRAMFS_TMP_S}/lib/libdrm.so
ln -s libdrm.so.2.4.0 ${INITRAMFS_TMP_S}/lib/libdrm.so.2
if use x86 ; then
ln -s libdrm_intel.so.1.0.0 ${INITRAMFS_TMP_S}/lib/libdrm_intel.so
ln -s libdrm_intel.so.1.0.0 ${INITRAMFS_TMP_S}/lib/libdrm_intel.so.1
fi
cp ${ROOT}/bin/busybox ${INITRAMFS_TMP_S}/bin || die
ln -s "busybox" "${INITRAMFS_TMP_S}/bin/sh"
# For verified rootfs
cp ${ROOT}/sbin/dmsetup ${INITRAMFS_TMP_S}/bin || die
# For message screen display and progress bars
cp ${ROOT}/usr/bin/ply-image ${INITRAMFS_TMP_S}/bin || die
cp ${ROOT}/usr/bin/pv ${INITRAMFS_TMP_S}/bin || die
# For recovery behavior
cp ${ROOT}/usr/bin/tpmc ${INITRAMFS_TMP_S}/bin || die
cp ${ROOT}/usr/bin/dev_sign_file ${INITRAMFS_TMP_S}/bin || die
cp ${ROOT}/usr/bin/vbutil_kernel ${INITRAMFS_TMP_S}/bin || die
cp ${ROOT}/usr/bin/crossystem ${INITRAMFS_TMP_S}/bin || die
# The 'vpd' and 'cgpt' commands are statically linked; we assert
# as much for the protection of posterity who might otherwise be
# forced to debug a harder problem.
file ${ROOT}/usr/bin/cgpt | grep -q "statically linked" || die
file ${ROOT}/usr/sbin/vpd | grep -q "statically linked" || die
cp ${ROOT}/usr/bin/cgpt ${INITRAMFS_TMP_S}/usr/bin || die
cp ${ROOT}/usr/sbin/vpd ${INITRAMFS_TMP_S}/usr/bin || die
cp ${ROOT}/usr/sbin/flashrom ${INITRAMFS_TMP_S}/usr/bin || die
# The kernel emake expects the file in cpio format.
( cd "${INITRAMFS_TMP_S}"
find . | cpio -o -H newc |
gzip -9 > "${WORKDIR}/${INITRAMFS_FILE}" ) ||
die "cannot package initramfs"
}
src_compile() {
einfo "Creating ${INITRAMFS_FILE}"
build_initramfs_file
INITRAMFS_FILE_SIZE=$(stat --printf="%s" "${WORKDIR}/${INITRAMFS_FILE}")
einfo "${INITRAMFS_FILE}: ${INITRAMFS_FILE_SIZE} bytes"
}
src_install() {
dodir /boot
dobin ${WORKDIR}/${INITRAMFS_FILE}
}