diff options
author | Mike Frysinger <vapier@gentoo.org> | 2008-03-19 02:09:10 +0000 |
---|---|---|
committer | Mike Frysinger <vapier@gentoo.org> | 2008-03-19 02:09:10 +0000 |
commit | 8c725905e360fb54b0a444c67d4b111d9e435fd7 (patch) | |
tree | e54d215d7424558cd8747142a8cdabe19d16e457 /sys-apps/module-init-tools | |
parent | Stable for HPPA too. (diff) | |
download | gentoo-2-8c725905e360fb54b0a444c67d4b111d9e435fd7.tar.gz gentoo-2-8c725905e360fb54b0a444c67d4b111d9e435fd7.tar.bz2 gentoo-2-8c725905e360fb54b0a444c67d4b111d9e435fd7.zip |
Rewrite update-modules script. It is now leaner, POSIX-compat, and encourages people to stop using deprecated module config files.
(Portage version: 2.2_pre2)
Diffstat (limited to 'sys-apps/module-init-tools')
-rw-r--r-- | sys-apps/module-init-tools/ChangeLog | 11 | ||||
-rwxr-xr-x | sys-apps/module-init-tools/files/update-modules-3.4.sh | 386 | ||||
-rw-r--r-- | sys-apps/module-init-tools/module-init-tools-3.4-r1.ebuild | 167 |
3 files changed, 562 insertions, 2 deletions
diff --git a/sys-apps/module-init-tools/ChangeLog b/sys-apps/module-init-tools/ChangeLog index b1c70041e8c4..00ee31e45e6d 100644 --- a/sys-apps/module-init-tools/ChangeLog +++ b/sys-apps/module-init-tools/ChangeLog @@ -1,6 +1,13 @@ # ChangeLog for sys-apps/module-init-tools -# Copyright 1999-2007 Gentoo Foundation; Distributed under the GPL v2 -# $Header: /var/cvsroot/gentoo-x86/sys-apps/module-init-tools/ChangeLog,v 1.136 2007/12/12 17:31:13 jer Exp $ +# Copyright 1999-2008 Gentoo Foundation; Distributed under the GPL v2 +# $Header: /var/cvsroot/gentoo-x86/sys-apps/module-init-tools/ChangeLog,v 1.137 2008/03/19 02:09:09 vapier Exp $ + +*module-init-tools-3.4-r1 (19 Mar 2008) + + 19 Mar 2008; Mike Frysinger <vapier@gentoo.org> + +files/update-modules-3.4.sh, +module-init-tools-3.4-r1.ebuild: + Rewrite update-modules script. It is now leaner, POSIX-compat, and + encourages people to stop using deprecated module config files. 12 Dec 2007; Jeroen Roovers <jer@gentoo.org> module-init-tools-3.4.ebuild: Stable for HPPA (bug #201444). diff --git a/sys-apps/module-init-tools/files/update-modules-3.4.sh b/sys-apps/module-init-tools/files/update-modules-3.4.sh new file mode 100755 index 000000000000..b41b579a899f --- /dev/null +++ b/sys-apps/module-init-tools/files/update-modules-3.4.sh @@ -0,0 +1,386 @@ +#!/bin/bash +# vim:ts=4 +# Distributed under the terms of the GNU General Public License v2 +# +# This script will do: +# - create /etc/modules.conf from /etc/modules.d/* +# - create /etc/modprobe.conf from /etc/modprobe.d/* +# - update modules.dep if modules.conf has been updated so depmod doesnt whine +# +# This is all for backwards compatibility. In the perfect world, we would be +# running a linux-2.6 kernel and not have any modules.d directory. Then there +# would be no work for us as module-init-tools automatically scans modprobe.d. +# Until that happens, we'll keep scanning and warning and being a pita. +# + + +ROOT="${ROOT%/}/" +[ "${ROOT}" = "${ROOT#/}" ] && ROOT="${PWD}/${ROOT}" +cd "${ROOT}" + +argv0=${0##*/} +. /etc/init.d/functions.sh || { + echo "${argv0}: Could not source /etc/init.d/functions.sh!" 1>&2 + exit 1 +} +umask 022 +esyslog() { :; } +export PATH=/sbin:${PATH} + +[ "${argv0}" = "modules-update" ] && ewarn "Please run 'update-modules' from now on; 'modules-update' is going away" + + +# +# Setup some variables +# + +HEADER="### This file is automatically generated by update-modules" + +# +# Parse command-line +# + +VERBOSE=0 +DEBUG=0 +FORCE="false" +BACKUP="false" +KV= +while [ -n "$1" ] ; do + case $1 in + --assume-kernel=*) KV=${1#*=};; + -b|--backup) BACKUP="true";; + -f|--force|force) FORCE="true";; + -v|--verbose) ((VERBOSE+=1));; + -d|--debug) ((DEBUG+=1));; + -V|--version) exec echo "${argv0}: $Revision: 1.1 $ $Date: 2008/03/19 02:09:10 $";; + -h|--help) + cat <<-EOF + Usage: update-modules [options] + + Options: + --assume-kernel=KV Assume the kernel is at least version KV + -b, --backup Backup existing config files (add .old ext) + -f, --force Force execution in face of bad things + -v, --verbose Be a bit more verbose in what we do + -d, --debug Helpful debug output + -V, --version Dump version info + -h, --help This help screen, duh + EOF + exit 0 + ;; + *) + eerror "Error: I don't understand $1" + exit 1 + ;; + esac + shift +done + +if [ ! -w ./etc ] ; then + eerror "You must be root to do this" + exit 2 +fi + +KV=${KV:-$(uname -r)} +[ ${DEBUG} -gt 0 ] && set -x + +veinfo() { [ ${VERBOSE} -gt 0 ] && einfo "$*" ; return 0 ; } +vewarn() { [ ${VERBOSE} -gt 0 ] && ewarn "$*" ; return 0 ; } + +[ "${ROOT}" != "/" ] && veinfo "Operating on ROOT = '${ROOT}'" + +if type -P modprobe.old > /dev/null || \ + LC_ALL=C modprobe -V 2>/dev/null | grep -qs "modprobe version" +then + GENERATE_OLD="true" +else + GENERATE_OLD="false" +fi + + +# Reset the sorting order since we depend on it +export LC_COLLATE="C" + + +# +# Let's check the optimal case first: nothing to do +# +if ! ${FORCE_UPDATE} ; then + if [ ! -d "./etc/modules.d" ] ; then + if [ ! -d "./etc/modprobe.d" ] ; then + veinfo "No /etc/modules.d or /etc/modprobe.d dir; Nothing to do!" + exit 0 + + elif [ -e "./etc/modprobe.conf" ] ; then + vewarn "You should put settings in /etc/modprobe.d/ rather than modprobe.conf" + + elif [ -e "./etc/modules.conf" ] ; then + vewarn "If you only run linux-2.4, you should delete /etc/modules.conf" + + else + veinfo "We have just /etc/modprobe.d; Nothing to do!" + exit 0 + fi + else + vewarn "You have /etc/modules.d, so things need to get coalesced" + fi +fi + +# +# Build list of config files to generate and verify none +# have been modified in any way +# +for x in modprobe.conf modules.conf ; do + x="./etc/${x}" + [ -r ${x} ] || continue + + if [ "$(sed -ne 1p ${x})" != "${HEADER}" ] ; then + ewarn "Warning: ${x#.} has not been automatically generated" + + if ${FORCE} ; then + ewarn "--force specified, (re)generating file anyway" + else + eerror "Use \"update-modules force\" to force (re)generation" + exit 1 + fi + fi +done + + +# +# Desc: backup a config file if need be and replace with new one +# Usage: backup <old config file to backup> <new config file to replace with> +# Ex: backup /etc/modules.conf /etc/modules.conf.tempfile +# +backup() { + if ${BACKUP} && [ -e "$1" ] ; then + mv -f "$1" "$1".old + fi + mv -f "$2" "$1" +} + + +# +# Desc: Create module header +# Usage: create_header <config dir> +# Ex: create_header /etc/modules.d +create_header() { + local moddir=$1 + + cat <<-EOF + ${HEADER} + # + # Please do not edit this file directly. If you want to change or add + # anything please take a look at the files in ${moddir} and read + # the manpage for update-modules(8). + # + EOF +} + + +# +# Desc: Combine all config files in a dir and place output in a file +# Usage: generate_config <output config file> <config dir> <reference config dir> <silent> +# Ex: generate_config /etc/modules.conf /etc/modules.d +# +generate_config() { + local config=$1 + local moddir=$2 + local refdir=$3 + local silent=$4 + local tmpfile="${config}.$$" + + [ -z "${silent}" ] && ebegin "Updating ${config#./etc/}" + + create_header ${refdir:-${moddir}} > "${tmpfile}" + + for cfg in "${moddir}"/* ; do + [ -d "${cfg}" ] && continue + [ ! -r "${cfg}" ] && continue + + # Skip backup and RCS files #20597 + case ${cfg} in *~|*.bak|*,v) continue;; esac + + # If config file is found in the reference dir, then skip it + [ -n "${refdir}" ] && [ -e "${refdir}/${cfg##*/}" ] && continue + + ( + echo "### update-modules: start processing ${cfg#.}" + if [ -x "${cfg}" ] ; then + # $cfg can be executable; nice touch, Wichert! :) + "${cfg}" + else + cat "${cfg}" + fi + echo + echo "### update-modules: end processing ${cfg#.}" + echo + ) >> "${tmpfile}" + done + + backup "${config}" "${tmpfile}" + + [ -z "${silent}" ] && eend 0 + + return 0 +} + + +# +# Generate the old modules.conf file based upon all the snippets in +# modules.d. Since modprobe doesnt handle modules.d, we need to gather +# the files together in modules.conf for it. +# + +if [ ! -d "./etc/modules.d" ] ; then + veinfo "No need to generate modules.conf :)" + +elif ${FORCE} || is_older_than ./etc/modules.conf ./etc/modules.d ; then + generate_config ./etc/modules.conf ./etc/modules.d + +else + veinfo "modules.conf: already up-to-date wheatness" +fi + +# +# Call depmod to keep insmod from complaining that modules.conf is more +# recent then the modules.dep file. +# +if [ -e "./etc/modules.conf" ] ; then + depfile=$( + # the modules.conf file has optional syntax: + # depfile=/path/to/modules.dep + ret=$(sed -n -e '/^[[:space:]]*depfile=/s:.*=::p' ./etc/modules.conf) + eval echo "${ret:-/lib/modules/${KV}/modules.dep}" + ) + + if [ -d "${depfile%/*}" ] ; then + if [ ./etc/modules.conf -nt "${depfile}" ] ; then + arch=$(uname -m) + ebegin "Updating modules.dep" + for cfg in /lib/modules/${KV}/build /usr/src/linux-${KV} \ + /lib/modules/${KV} /boot /usr/src/linux "" + do + cfg=".${cfg}/System.map" + for suffix in -genkernel-${arch}-${KV} -genkernel-'*'-${KV} -${KV} "" ; do + scfg=$(echo ${cfg}${suffix}) + scfg=${scfg%% *} + [ -f "${scfg}" ] && cfg=${scfg} && break 2 + done + cfg="" + done + [ -n "${cfg}" ] && cfg="-F ${cfg}" + depmod -b "${ROOT}" -a ${cfg} ${KV} + eend $? + veinfo "Ran: depmod -b '${ROOT}' -a ${cfg} ${KV}" + else + veinfo "modules.dep: already up-to-date goodness" + fi + else + vewarn "The dir '${depfile}' does not exist, skipping call to depmod" + fi +fi + + +# +# Generate the new modprobe.conf file if possible. What this entails is +# grabbing details from the old modprobe via the -c option and sticking +# it in the newer config file. This is useful for backwards compat support +# and for packages that provide older style /etc/modules.d/ files but not +# newer style /etc/modprobe.d/ files. +# +# First we try to use the script `generate-modprobe.conf` from the +# module-init-tools and if that fails us, we try and generate modprobe.conf +# ourselves from the /etc/modules.d/ files. +# +if ! type -P generate-modprobe.conf > /dev/null ; then + vewarn "Skipping /etc/modprobe.conf generation (generate-modprobe.conf doesn't exist)" + +elif ! ${FORCE} && ! is_older_than ./etc/modprobe.conf ./etc/modules.d ./etc/modprobe.d ; then + veinfo "modprobe.conf: already up-to-date nutness" + +else + # + # First, bitch like crazy + # + for f in ./etc/modules.d/* ; do + # hack: ignore baselayout ;x + case ${f##*/} in + aliases|i386) continue;; + esac + if [ ! -e "./etc/modprobe.d/${f##*/}" ] ; then + ewarn "Please file a bug about ${f#.}: it needs an /etc/modprobe.d/${f##*/}" + fi + done + + generated_ok=0 + tmpfile="./etc/modprobe.conf.$$" + + # + # First we try to use regular generate-modprobe.conf + # + if ${GENERATE_OLD} ; then + ebegin "Updating modprobe.conf" + create_header /etc/modprobe.d > "${tmpfile}" + if generate-modprobe.conf ${ASSUME_KV:+--assume-kernel=${KV}} \ + >> "${tmpfile}" 2> "${tmpfile}.err" + then + backup "./etc/modprobe.conf" "${tmpfile}" + eend 0 + generated_ok=1 + else + [[ ${VERBOSE} -gt 0 ]] && cat "${tmpfile}.err" + eend 1 "Warning: could not generate /etc/modprobe.conf!" + fi + fi + + # + # If the helper script failed, we fall back to doing it by hand + # + if [[ ${generated_ok} -eq 0 ]] ; then + ebegin "Updating modprobe.conf by hand" + + generate_config ./etc/modprobe.conf ./etc/modules.d ./etc/modprobe.d 0 + create_header /etc/modprobe.d > "${tmpfile}" + + # Just use generate-modprobe.conf to filter compatible syntax + if TESTING_MODPROBE_CONF=./etc/modprobe.conf \ + generate-modprobe.conf ${ASSUME_KV:+--assume-kernel=${KV}} \ + >> "${tmpfile}" 2> "${tmpfile}.err" + then + # we use mv here instead of backup_config() as the call to + # generate_config() above already took care of the backup + mv -f "${tmpfile}" "./etc/modprobe.conf" + eend $? + else + [[ ${VERBOSE} -gt 0 ]] && cat "${tmpfile}.err" + eend 1 "Warning: could not generate /etc/modprobe.conf!" + fi + fi + + # + # Now append all the new files ... modprobe will not scan /etc/modprobe.d/ + # if /etc/modprobe.conf exists, so we need to append /etc/modprobe.conf with + # /etc/modprobe.d/* ... http://bugs.gentoo.org/145962 + # + if [[ -e ./etc/modprobe.conf ]] ; then + for cfg in ./etc/modprobe.d/* ; do + [ -d "${cfg}" ] && continue + [ ! -r "${cfg}" ] && continue + + # Skip backup and RCS files #20597 + case ${cfg} in *~|*.bak|*,v) continue;; esac + + ( + echo + echo "### update-modules: start processing ${cfg#.}" + cat "${cfg}" + echo "### update-modules: end processing ${cfg#.}" + ) >> "./etc/modprobe.conf" + done + fi + + rm -f "${tmpfile}" "${tmpfile}.err" +fi + +: # make sure we fall through with 0 exit status diff --git a/sys-apps/module-init-tools/module-init-tools-3.4-r1.ebuild b/sys-apps/module-init-tools/module-init-tools-3.4-r1.ebuild new file mode 100644 index 000000000000..9253ea0ba6e0 --- /dev/null +++ b/sys-apps/module-init-tools/module-init-tools-3.4-r1.ebuild @@ -0,0 +1,167 @@ +# Copyright 1999-2008 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: /var/cvsroot/gentoo-x86/sys-apps/module-init-tools/module-init-tools-3.4-r1.ebuild,v 1.1 2008/03/19 02:09:09 vapier Exp $ + +inherit flag-o-matic eutils toolchain-funcs fixheadtails + +MODUTILS_PV="2.4.27" + +MY_P="${P/_pre/-pre}" +DESCRIPTION="tools for managing linux kernel modules" +HOMEPAGE="http://kerneltools.org/" +SRC_URI="mirror://kernel/linux/kernel/people/jcm/module-init-tools/${MY_P}.tar.bz2 + old-linux? ( mirror://kernel/linux/utils/kernel/modutils/v2.4/modutils-${MODUTILS_PV}.tar.bz2 ) + mirror://gentoo/${P}-manpages.tar.bz2" + +LICENSE="GPL-2" +SLOT="0" +KEYWORDS="~alpha ~amd64 ~arm ~hppa ~ia64 ~m68k ~mips ~ppc ~ppc64 ~s390 ~sh ~sparc ~x86" +IUSE="old-linux" +# The test code runs `make clean && configure` and screws up src_compile() +RESTRICT="test" + +DEPEND="sys-libs/zlib + >=sys-apps/baselayout-1.12.7-r2 + !virtual/modutils" +PROVIDE="virtual/modutils" + +S=${WORKDIR}/${MY_P} + +src_unpack() { + unpack ${A} + + # Patches for old modutils + if use old-linux ; then + cd "${WORKDIR}"/modutils-${MODUTILS_PV} + epatch "${FILESDIR}"/modutils-2.4.27-alias.patch + epatch "${FILESDIR}"/modutils-2.4.27-gcc.patch + epatch "${FILESDIR}"/modutils-2.4.27-flex.patch + epatch "${FILESDIR}"/modutils-2.4.27-no-nested-function.patch + epatch "${FILESDIR}"/modutils-2.4.27-hppa.patch + epatch "${FILESDIR}"/modutils-2.4.27-build.patch #154281 + fi + + # Fixes for new module-init-tools + cd "${S}" + ht_fix_file tests/test-depmod/10badcommand.sh + # Test fails due since it needs to write to /lib/modules so disable it + rm -f tests/test-depmod/01backcompat.sh + + # Fix bug 49926: This patch allows generate-modprobe.conf to + # accept the --assume-kernel=x.x.x option for generating livecds. + # This is a companion to a patch in baselayout-1.9.0 which allows + # the same flag to modules-update. + epatch "${FILESDIR}"/${PN}-3.1_generate-modprobe-assume-kernel.patch + + # Abort if we fail to run modprobe, bug #68689 + epatch "${FILESDIR}"/${PN}-3.2_pre7-abort-on-modprobe-failure.patch + + epatch "${FILESDIR}"/${PN}-3.2.2-handle-dupliate-aliases.patch #149426 + + # make sure we link dynamically with zlib; our zlib.so is in /lib vs + # /usr/lib so it's safe to link with. fixes ugly textrels as well. + sed -i \ + -e 's:-Wl,-Bstatic -lz -Wl,-Bdynamic:-lz:' \ + configure || die + + # make sure we don't try to regen the manpages + touch *.5 *.8 +} + +src_compile() { + # Configure script uses BUILDCFLAGS for cross-compiles but this + # defaults to CFLAGS which can be bad mojo + export BUILDCFLAGS=-pipe + export BUILDCC=$(tc-getBUILD_CC) + + if use old-linux ; then + einfo "Building modutils ..." + cd "${WORKDIR}"/modutils-${MODUTILS_PV} + econf \ + --disable-strip \ + --prefix=/ \ + --enable-insmod-static \ + --disable-zlib \ + || die "econf failed" + emake || die "emake modutils failed" + + einfo "Building module-init-tools ..." + cd "${S}" + fi + + econf \ + --prefix=/ \ + --enable-zlib \ + || die "econf failed" + emake || die "emake module-init-tools failed" +} + +modutils_src_install() { + cd "${WORKDIR}"/modutils-${MODUTILS_PV} + einstall prefix="${D}" || die + docinto modutils-${MODUTILS_PV} + dodoc CREDITS ChangeLog NEWS README TODO + + # remove man pages provided by the man-pages package now #124127 + rm -r "${D}"/usr/share/man/man2 + + cd "${S}" + # This copies the old version of modutils to *.old so it still works + # with kernels <= 2.4; new versions will execve() the .old version if + # a 2.4 kernel is running... + # This code was borrowed from the module-init-tools Makefile + local runme f + for f in lsmod modprobe rmmod depmod insmod insmod.static modinfo ; do + if [[ -L ${D}/sbin/${f} ]] ; then + einfo "Moving symlink $f to ${f}.old" + #runme = the target of the symlink with a .old tagged on. + runme=$(ls -l "${D}"/sbin/${f} | sed 's/.* -> //').old + [[ ! -e ${D}/sbin/${runme} ]] || einfo "${D}/sbin/${runme} not found" + dosym ${runme} /sbin/${f} || die + elif [[ -e ${D}/sbin/${f} ]] ; then + einfo "Moving executable $f to ${f}.old" + fi + mv -f "${D}"/sbin/${f} "${D}"/sbin/${f}.old + done + # Move the man pages as well. We only do this for the man pages of the + # tools that module-init-tools will replace. + for f in "${D}"/usr/share/man/man8/{lsmod,modprobe,rmmod,depmod,insmod}.8 + do + mv -f ${f} ${f%\.*}.old.${f##*\.} + done + # Fix the ksyms links #35601 + for f in ksyms kallsyms ; do + dosym insmod.old /sbin/${f} + dosym insmod.static.old /sbin/${f}.static + done +} + +src_install() { + use old-linux && modutils_src_install + + cd "${S}" + emake install DESTDIR="${D}" || die + dosym modprobe.conf.5 /usr/share/man/man5/modprobe.d.5 + + # Install compat symlink + dosym ../bin/lsmod /sbin/lsmod + use old-linux && dosym ../sbin/insmod.old /bin/lsmod.old + # Install the modules.conf2modprobe.conf tool, so we can update + # modprobe.conf. + into / + dosbin "${S}"/generate-modprobe.conf || die + newsbin"${FILESDIR}"/update-modules-3.4 update-modules || die + dosym update-modules /sbin/modules-update + doman "${FILESDIR}"/update-modules.8 + + doman *.[1-8] + docinto / + dodoc AUTHORS ChangeLog INSTALL NEWS README TODO +} + +pkg_postinst() { + # cheat to keep users happy + if grep -qs modules-update "${ROOT}"/etc/init.d/modules ; then + sed -i 's:modules-update:update-modules:' "${ROOT}"/etc/init.d/modules + fi +} |