diff options
Diffstat (limited to 'prefix-stack-setup')
-rw-r--r-- | prefix-stack-setup | 201 |
1 files changed, 201 insertions, 0 deletions
diff --git a/prefix-stack-setup b/prefix-stack-setup new file mode 100644 index 0000000..28e3efa --- /dev/null +++ b/prefix-stack-setup @@ -0,0 +1,201 @@ +#!@GENTOO_PORTAGE_EPREFIX@/bin/bash +# Copyright 1999-2019 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +PARENT_EPREFIX="@GENTOO_PORTAGE_EPREFIX@" +PARENT_CHOST="@GENTOO_PORTAGE_CHOST@" +CHILD_EPREFIX= +CHILD_PROFILE= + +# +# get ourselfs the functions.sh script for ebegin/eend/etc. +# +for f in \ + /lib/gentoo/functions.sh \ + /etc/init.d/functions.sh \ + /sbin/functions.sh \ +; do + if [[ -r ${PARENT_EPREFIX}${f} ]] ; then + . "${PARENT_EPREFIX}${f}" + f=found + break + fi +done + +if [[ ${f} != found ]] ; then + echo "Cannot find Gentoo functions, aborting." >&2 + exit 1 +fi + +for arg in "$@"; do + case "${arg}" in + --eprefix=*) CHILD_EPREFIX="${arg#--eprefix=}" ;; + --profile=*) CHILD_PROFILE="${arg#--profile=}" ;; + + --help) + einfo "$0 usage:" + einfo " --eprefix=[PATH] Path to new EPREFIX to create stacked to the prefix" + einfo " where this script is installed (${PARENT_EPREFIX})" + einfo " --profile=[PATH] The absolute path to the profile to use. This path" + einfo " must point to a directory within ${PARENT_EPREFIX}" + exit 0 + ;; + esac +done + +# +# sanity check of given values +# + +test -n "${CHILD_EPREFIX}" || { eerror "no eprefix argument given"; exit 1; } +test -d "${CHILD_EPREFIX}" && { eerror "${CHILD_EPREFIX} already exists"; exit 1; } +test -n "${CHILD_PROFILE}" || { eerror "no profile argument given"; exit 1; } +test -d "${CHILD_PROFILE}" || { eerror "${CHILD_PROFILE} does not exist"; exit 1; } + +einfo "creating stacked prefix ${CHILD_EPREFIX}" + +# +# functions needed below. +# +eend_exit() { + eend $1 + [[ $1 != 0 ]] && exit 1 +} + +# +# create the directories required to bootstrap the least. +# +ebegin "creating directory structure" +( + set -e + mkdir -p "${CHILD_EPREFIX}"/etc/portage/profile/use.mask + mkdir -p "${CHILD_EPREFIX}"/etc/portage/profile/use.force + mkdir -p "${CHILD_EPREFIX}"/etc/portage/env + mkdir -p "${CHILD_EPREFIX}"/etc/portage/package.env + ln -s "${PARENT_EPREFIX}"/etc/portage/repos.conf "${CHILD_EPREFIX}"/etc/portage/repos.conf +) +eend_exit $? + +# +# create a make.conf and set PORTDIR and PORTAGE_TMPDIR +# +ebegin "creating make.conf" +( + set -e + echo "#" + echo "# The following values where taken from the parent prefix's" + echo "# environment. Feel free to adopt them as you like." + echo "#" + echo "CFLAGS=\"$(portageq envvar CFLAGS)\"" + echo "CXXFLAGS=\"$(portageq envvar CXXFLAGS)\"" + echo "MAKEOPTS=\"$(portageq envvar MAKEOPTS)\"" + niceness=$(portageq envvar PORTAGE_NICENESS || true) + [[ -n ${niceness} ]] && + echo "PORTAGE_NICENESS=\"${niceness}\"" + echo + echo "# Mirrors from parent prefix." + echo "GENTOO_MIRRORS=\"$(portageq envvar GENTOO_MIRRORS || true)\"" + echo + echo "# Below comes the prefix-stack setup. Only change things" + echo "# if you know exactly what you are doing!" + echo "EPREFIX=\"${CHILD_EPREFIX}\"" + echo "PORTAGE_OVERRIDE_EPREFIX=\"${PARENT_EPREFIX}\"" + echo "BROOT=\"${PARENT_EPREFIX}\"" +) > "${CHILD_EPREFIX}"/etc/portage/make.conf +eend_exit $? + +ebegin "creating use.mask/prefix-stack" +printf -- '-%s\n' prefix{,-guest,-stack} > "${CHILD_EPREFIX}"/etc/portage/profile/use.mask/prefix-stack +eend_exit $? + +ebegin "creating use.force/prefix-stack" +printf -- '%s\n' prefix{,-guest,-stack} > "${CHILD_EPREFIX}"/etc/portage/profile/use.force/prefix-stack +eend_exit $? + +ebegin "creating env/host-cc.conf" +cat > "${CHILD_EPREFIX}"/etc/portage/env/host-cc.conf <<-EOM + CC=${PARENT_CHOST}-gcc + CXX=${PARENT_CHOST}-g++ + EOM +eend_exit $? + +ebegin "creating package.env/prefix-stack" +cat > "${CHILD_EPREFIX}"/etc/portage/package.env/prefix-stack <<-'EOM' + # merge with the parent's chost. this forces the use of the parent + # compiler, which generally would be illegal - this is an exception. + # This is required for example on winnt, because the wrapper has to + # be able to use/resolve symlinks, etc. native winnt binaries miss + # that ability, but cygwin binaries don't. + sys-devel/gcc-config host-cc.conf + sys-apps/gentoo-functions host-cc.conf + EOM +eend_exit $? + +# +# create the make.profile symlinks. +# +ebegin "creating make.profile" +( + ln -s "${CHILD_PROFILE}" "${CHILD_EPREFIX}/etc/portage/make.profile" +) +eend_exit $? + +# +# adjust permissions of generated files. +# +ebegin "adjusting permissions" +( + set -e + chmod 644 "${CHILD_EPREFIX}"/etc/portage/make.conf + chmod 644 "${CHILD_EPREFIX}"/etc/portage/env/host-cc.conf + chmod 644 "${CHILD_EPREFIX}"/etc/portage/package.env/prefix-stack +) +eend_exit $? + +# +# now merge some basics. +# +ebegin "installing required basic packages" +( + set -e + export PORTAGE_CONFIGROOT@=@"${CHILD_EPREFIX}" + export EPREFIX@=@"${CHILD_EPREFIX}" + export PORTAGE_OVERRIDE_EPREFIX@=@"${PARENT_EPREFIX}" + +# # this -pv is there to avoid the global update output, which is +# # there on the first emerge run. (thus, just cosmetics). +# emerge --pretend --oneshot --nodeps baselayout-prefix + + # let baselayout create the directories + USE@=@"${USE} build" \ + emerge --verbose --nodeps --oneshot \ + '>=baselayout-prefix-2.6' + + # Record the prefix-toolkit into @world file, as it provides the + # env.d telling the PM to manage this stacked Prefix, but may not + # (unlike baselayout) be part of @system set per the profile. + emerge --verbose --nodeps \ + prefix-toolkit + + emerge --verbose --nodeps --oneshot \ + gentoo-functions \ + elt-patches \ + gnuconfig \ + gcc-config + + # select the stack wrapper profile from gcc-config + env -i PORTAGE_CONFIGROOT="${CHILD_EPREFIX}" "$(type -P bash)" "${CHILD_EPREFIX}"/usr/bin/gcc-config 1 + + # do this _after_ selecting the correct compiler! + emerge --verbose --nodeps --oneshot \ + libtool +) +eend_exit $? + +# +# wow, all ok :) +# +ewarn +ewarn "all done. don't forget to tune ${CHILD_EPREFIX}/etc/portage/make.conf." +ewarn "to enter the new prefix, run \"${CHILD_EPREFIX}/startprefix\"." +ewarn |