# Copyright (c) 2012 The Chromium OS Authors. All rights reserved. # Distributed under the terms of the GNU General Public License v2 # This ebuild file installs the developer installer package. It: # + Copies dev_install. # + Copies some config files for emerge: make.defaults and make.conf. # + Generates a list of packages installed (in base images). # dev_install downloads and bootstraps emerge in base images without # modifying the root filesystem. EAPI="4" CROS_WORKON_PROJECT="chromiumos/platform/dev-util" CROS_WORKON_LOCALNAME="dev" CROS_WORKON_OUTOFTREE_BUILD="1" inherit cros-workon cros-board multiprocessing DESCRIPTION="Chromium OS Developer Packages installer" HOMEPAGE="http://www.chromium.org/chromium-os" LICENSE="BSD" SLOT="0" KEYWORDS="~amd64 ~arm ~x86" IUSE="cros-debug" DEPEND="app-arch/tar sys-apps/coreutils sys-apps/grep sys-apps/portage sys-apps/sed" # TODO(arkaitzr): remove dependency on tar if it's gonna be removed from the # base image. Also modify dev_install. RDEPEND="app-arch/tar net-misc/curl sys-apps/coreutils" src_prepare() { SRCDIR="${S}/dev-install" mkdir -p "$(cros-workon_get_build_dir)" } src_compile() { cd "$(cros-workon_get_build_dir)" local useflags pkg pkgs BOARD=$(get_current_board_with_variant) # We need to pass down cros-debug automatically because this is often # times toggled at the ./build_packages level. This is a hack of sorts, # but covers the most common case. useflags="${USE}" use cros-debug || useflags+=" -cros-debug" pkgs=( # Generate a list of packages that go into the base image. These # packages will be assumed to be installed by emerge in the target. chromeos # Get the list of the packages needed to bootstrap emerge. portage # Get the list of dev and test packages. chromeos-dev chromeos-test ) einfo "Ignore warnings below related to LD_PRELOAD/libsandbox.so" multijob_init for pkg in ${pkgs[@]} ; do # The ebuild env will modify certain variables in ways that we # do not care for. For example, PORTDIR_OVERLAY is modified to # only point to the current tree which screws up the search of # the board-specific overlays. ( multijob_child_init env -i PATH="${PATH}" PORTAGE_USERNAME="${PORTAGE_USERNAME}" USE="${useflags}" \ emerge-${BOARD} \ --pretend --quiet --emptytree --ignore-default-opts \ --root-deps=rdeps ${pkg} | \ egrep -o ' [[:alnum:]-]+/[^[:space:]/]+\b' | \ tr -d ' ' | \ sort > ${pkg}.packages _pipestatus=${PIPESTATUS[*]} [[ ${_pipestatus// } -eq 0 ]] || die "\`emerge-${BOARD} ${pkg}\` failed" ) & multijob_post_fork done multijob_finish # No virtual packages in package.provided. We store packages for # package.provided in file chromeos-base.packages as package.provided is a # directory. grep -v "virtual/" chromeos.packages > chromeos-base.packages python "${FILESDIR}"/filter.py || die # Add the board specific binhost repository. sed -e "s|BOARD|${BOARD}|g" "${SRCDIR}/repository.conf" > repository.conf # Add dhcp to the list of packages installed since its installation will not # complete (can not add dhcp group since /etc is not writeable). Bootstrap it # instead. grep "net-misc/dhcp-" chromeos-dev.packages >> chromeos-base.packages grep "net-misc/dhcp-" chromeos-dev.packages >> bootstrap.packages } src_install() { local build_dir=$(cros-workon_get_build_dir) cd "${SRCDIR}" dobin dev_install insinto /usr/share/${PN}/portage doins "${build_dir}"/{bootstrap.packages,repository.conf} insinto /usr/share/${PN}/portage/make.profile doins "${build_dir}"/package.installable make.{conf,defaults} insinto /usr/share/${PN}/portage/make.profile/package.provided doins "${build_dir}"/chromeos-base.packages insinto /etc/env.d doins 99devinstall sed -i "s:@LIBDIR@:$(get_libdir):g" "${ED}"/etc/env.d/99devinstall # Python will be installed in /usr/local after running dev_install. # Ideally this should always work. There's a minor bug that sometimes # shows up https://bugs.gentoo.org/380569 so work around it if need be. local pyver=$(eselect python show --ABI) if [[ -z ${pyver} ]]; then pyver=$(readlink "${SYSROOT}"/usr/bin/python2 | sed s:python::) fi dosym "/usr/local/bin/python${pyver}" "/usr/bin/python" } pkg_preinst() { if [[ $(cros_target) == "target_image" ]]; then # We don't want to install these files into the normal /build/ # dir because we need different settings at build time vs what # we want at runtime in release images. Thus, install the files # into /usr/share but symlink them into /etc for the images. local f srcdir="/usr/share/${PN}" pushd "${ED}/${srcdir}" >/dev/null for f in $(find -type f -printf '%P '); do dosym "${srcdir}/${f}" "/etc/${f}" done popd >/dev/null fi }