123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176 |
- # Copyright 1999-2012 Gentoo Foundation
- # Distributed under the terms of the GNU General Public License v2
- # XXX: we need to review menu.lst vs grub.conf handling. We've been converting
- # all systems to grub.conf (and symlinking menu.lst to grub.conf), but
- # we never updated any of the source code (it still all wants menu.lst),
- # and there is no indication that upstream is making the transition.
- inherit eutils mount-boot toolchain-funcs linux-info
- PATCHVER="1.9" # Not used, just for tracking with main grub
- DESCRIPTION="GNU GRUB Legacy boot loader (static build)"
- HOMEPAGE="https://www.gnu.org/software/grub/"
- SRC_URI="mirror://gentoo/${PF}.tar.bz2"
- LICENSE="GPL-2"
- SLOT="0"
- KEYWORDS="-* amd64 ~x86"
- IUSE=""
- DEPEND="!<sys-boot/grub-2"
- RDEPEND="${DEPEND}"
- # These are already stripped since we use a binpkg.
- QA_PRESTRIPPED="/sbin/grub /bin/mbchk"
- pkg_setup() {
- local arch="$(tc-arch)"
- case ${arch} in
- amd64)
- CONFIG_CHECK='~IA32_EMULATION'
- WARNING_IA32_EMULATION="You will NOT be able to run grub unless you have IA32_EMULATION set!"
- check_extra_config
- ;;
- esac
- }
- src_install() {
- cp -a "${WORKDIR}"/* "${D}"/
- if [[ -z "${I_KNOW_WHAT_I_AM_DOING}" ]]; then
- run_test_grub "${D}"/sbin/grub && einfo "New grub can run on your system, good!"
- fi
- }
- run_test_grub() {
- local grub="$1"
- local version="$(${grub} \
- --read-only --no-pager --no-floppy --no-curses \
- --no-config-file --batch --version)"
- local error="grub test-run failed"
- use amd64 && error="${error} Is IA32_EMULATION set?"
- [ "${version/${PV}}" != "${version}" ] || die "${error}"
- return 0
- }
- #
- # Below this point, everything is also used in grub-static!
- # Please keep in sync!
- #
- setup_boot_dir() {
- local boot_dir=$1
- local dir=${boot_dir}
- if [[ -z "${I_KNOW_WHAT_I_AM_DOING}" ]]; then
- run_test_grub /sbin/grub
- fi
- mkdir -p "${dir}"
- [[ ! -L ${dir}/boot ]] && ln -s . "${dir}/boot"
- dir="${dir}/grub"
- if [[ ! -e ${dir} ]] ; then
- mkdir "${dir}" || die "${dir} does not exist!"
- fi
- # change menu.lst to grub.conf
- if [[ ! -e ${dir}/grub.conf ]] && [[ -e ${dir}/menu.lst ]] ; then
- mv -f "${dir}"/menu.lst "${dir}"/grub.conf
- ewarn
- ewarn "*** IMPORTANT NOTE: menu.lst has been renamed to grub.conf"
- ewarn
- fi
- if [[ ! -e ${dir}/menu.lst ]]; then
- einfo "Linking from new grub.conf name to menu.lst"
- ln -snf grub.conf "${dir}"/menu.lst
- fi
- if [[ -e ${dir}/stage2 ]] ; then
- mv "${dir}"/stage2{,.old}
- ewarn "*** IMPORTANT NOTE: you must run grub and install"
- ewarn "the new version's stage1 to your MBR. Until you do,"
- ewarn "stage1 and stage2 will still be the old version, but"
- ewarn "later stages will be the new version, which could"
- ewarn "cause problems such as an unbootable system."
- ewarn "This means you must use either grub-install or perform"
- ewarn "root/setup manually! For more help, see the handbook:"
- ewarn "https://www.gentoo.org/doc/en/handbook/handbook-${ARCH}.xml?part=1&chap=10#grub-install-auto"
- ebeep
- fi
- einfo "Copying files from /lib/grub, /usr/lib/grub and /usr/share/grub to ${dir}"
- for x in \
- "${ROOT}"/lib*/grub/*/* \
- "${ROOT}"/usr/lib*/grub/*/* \
- "${ROOT}"/usr/share/grub/* ; do
- [[ -f ${x} ]] && cp -p "${x}" "${dir}"/
- done
- if [[ ! -e ${dir}/grub.conf ]] ; then
- s="${ROOT}/usr/share/doc/${PF}/grub.conf.gentoo"
- [[ -e "${s}" ]] && cat "${s}" >${dir}/grub.conf
- [[ -e "${s}.gz" ]] && zcat "${s}.gz" >${dir}/grub.conf
- [[ -e "${s}.bz2" ]] && bzcat "${s}.bz2" >${dir}/grub.conf
- fi
- # Per bug 218599, we support grub.conf.install for users that want to run a
- # specific set of Grub setup commands rather than the default ones.
- grub_config=${dir}/grub.conf.install
- [[ -e ${grub_config} ]] || grub_config=${dir}/grub.conf
- if [[ -e ${grub_config} ]] ; then
- local tmp="${TMPDIR}/${P}-setup_boot_dir-$$"
- egrep \
- -v '^[[:space:]]*(#|$|default|fallback|initrd|password|splashimage|timeout|title)' \
- "${grub_config}" >"${tmp}"
- # Do NOT fail here, only warn.
- /sbin/grub --batch \
- --device-map="${dir}"/device.map \
- >/dev/null <"${tmp}"
- rc=$?
- [[ $rc -ne 0 ]] && ewarn "Grub failed to run!"
- fi
- # the grub default commands silently piss themselves if
- # the default file does not exist ahead of time
- if [[ ! -e ${dir}/default ]] ; then
- # This may fail, don't worry about it.
- grub-set-default --root-directory="${boot_dir}" default
- :
- fi
- einfo "Grub has been installed to ${boot_dir} successfully."
- }
- pkg_postinst() {
- mount-boot_pkg_postinst
- if [[ -n ${DONT_MOUNT_BOOT} ]]; then
- elog "WARNING: you have DONT_MOUNT_BOOT in effect, so you must apply"
- elog "the following instructions for your /boot!"
- elog "Neglecting to do so may cause your system to fail to boot!"
- elog
- else
- setup_boot_dir "${ROOT}"/boot
- # Trailing output because if this is run from pkg_postinst, it gets mixed into
- # the other output.
- einfo ""
- fi
- elog "To interactively install grub files to another device such as a USB"
- elog "stick, just run the following and specify the directory as prompted:"
- elog " emerge --config =${PF}"
- elog "Alternately, you can export GRUB_ALT_INSTALLDIR=/path/to/use to tell"
- elog "grub where to install in a non-interactive way."
- }
- pkg_config() {
- local dir
- if [ ! -d "${GRUB_ALT_INSTALLDIR}" ]; then
- einfo "Enter the directory where you want to setup grub:"
- read dir
- else
- dir="${GRUB_ALT_INSTALLDIR}"
- fi
- setup_boot_dir "${dir}"
- }
|