diff options
Diffstat (limited to 'SOURCES/mod-extra.sh')
-rwxr-xr-x | SOURCES/mod-extra.sh | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/SOURCES/mod-extra.sh b/SOURCES/mod-extra.sh new file mode 100755 index 0000000..7dc075b --- /dev/null +++ b/SOURCES/mod-extra.sh @@ -0,0 +1,86 @@ +#! /bin/bash + +Dir=$1 +List=$2 +Dest="extra" + +# Destination was specified on the command line +test -n "$3" && Dest="$3" + +pushd $Dir +rm -rf modnames +find . -name "*.ko" -type f > modnames +# Look through all of the modules, and throw any that have a dependency in +# our list into the list as well. +rm -rf dep.list dep2.list +rm -rf req.list req2.list +touch dep.list req.list +cp "$List" . + +# This variable needs to be exported because it is used in sub-script +# executed by xargs +export ListName=$(basename "$List") + +# NB: this loop runs 2000+ iterations. Try to be fast. +NPROC=`nproc` +[ -z "$NPROC" ] && NPROC=1 +cat modnames | xargs -r -n1 -P $NPROC sh -c ' + dep=$1 + depends=`modinfo $dep | sed -n -e "/^depends/ s/^depends:[ \t]*//p"` + [ -z "$depends" ] && exit + for mod in ${depends//,/ } + do + match=$(grep "^$mod.ko" "$ListName") + [ -z "$match" ] && continue + # check if the module we are looking at is in mod-extra too. + # if so we do not need to mark the dep as required. + mod2=${dep##*/} # same as `basename $dep`, but faster + match2=$(grep "^$mod2" "$ListName") + if [ -n "$match2" ] + then + #echo $mod2 >> notreq.list + continue + fi + echo $mod.ko >> req.list + done +' DUMMYARG0 # xargs appends MODNAME, which becomes $dep in the script above + +sort -u req.list > req2.list +sort -u "$ListName" > modules2.list +join -v 1 modules2.list req2.list > modules3.list + +for mod in $(cat modules3.list) +do + # get the path for the module + modpath=`grep /$mod modnames` + [ -z "$modpath" ] && continue + echo $modpath >> dep.list +done + +sort -u dep.list > dep2.list + +# now move the modules into the extra/ directory +for mod in `cat dep2.list` +do + newpath=`dirname $mod | sed -e "s/kernel\\//$Dest\//"` + mkdir -p $newpath + mv $mod $newpath +done + +popd + +# If we're signing modules, we can't leave the .mod files for the .ko files +# we've moved in .tmp_versions/. Remove them so the Kbuild 'modules_sign' +# target doesn't try to sign a non-existent file. This is kinda ugly, but +# so is modules-extra. + +for mod in `cat ${Dir}/dep2.list` +do + modfile=`basename $mod | sed -e 's/.ko/.mod/'` + rm .tmp_versions/$modfile +done + +pushd $Dir +rm modnames dep.list dep2.list req.list req2.list +rm "$ListName" modules2.list modules3.list +popd |