about summary refs log tree commit diff
path: root/pkgs/build-support/kernel
diff options
context:
space:
mode:
authorCrystalGamma <dev@crystalgamma.de>2020-07-02 20:15:08 +0200
committerCrystalGamma <dev@crystalgamma.de>2020-07-16 20:44:07 +0200
commitb155b1dafb52b4b9e352da2da9bf914be29a325a (patch)
tree8fa237fafd722c38478db39b82f5e8953bb0142a /pkgs/build-support/kernel
parent83ec61c486bd219e9941046557d4cfa7a2de3065 (diff)
makeModulesClosure: handle builtin modules better
The previous code discarded entire dependency trees if the first entry in the dependency list compiled by `modprobe --show-depends` is a builtin and otherwise handled its output in a rather hackish way.
Diffstat (limited to 'pkgs/build-support/kernel')
-rw-r--r--pkgs/build-support/kernel/modules-closure.sh67
1 files changed, 43 insertions, 24 deletions
diff --git a/pkgs/build-support/kernel/modules-closure.sh b/pkgs/build-support/kernel/modules-closure.sh
index 220f3b00a7717..68d840f16140c 100644
--- a/pkgs/build-support/kernel/modules-closure.sh
+++ b/pkgs/build-support/kernel/modules-closure.sh
@@ -19,36 +19,55 @@ version=$(cd $kernel/lib/modules && ls -d *)
 echo "kernel version is $version"
 
 # Determine the dependencies of each root module.
-closure=
+mkdir -p $out/lib/modules/"$version"
+touch closure
 for module in $rootModules; do
     echo "root module: $module"
-    deps=$(modprobe --config no-config -d $kernel --set-version "$version" --show-depends "$module" \
-        | sed 's/^insmod //') \
-        || if test -z "$allowMissing"; then exit 1; fi
-    if [[ "$deps" != builtin* ]]; then
-        closure="$closure $deps"
+    modprobe --config no-config -d $kernel --set-version "$version" --show-depends "$module" \
+    | while read cmd module args; do
+        case "$cmd" in
+            builtin)
+                touch found
+                echo "$module" >>closure
+                echo "  builtin dependency: $module";;
+            insmod)
+                touch found
+                if ! test -e "$module"; then
+                    echo "  dependency not found: $module"
+                    exit 1
+                fi
+                target=$(echo "$module" | sed "s^$NIX_STORE.*/lib/modules/^$out/lib/modules/^")
+                if test -e "$target"; then
+                    echo "  dependency already copied: $module"
+                    continue
+                fi
+                echo "$module" >>closure
+                echo "  copying dependency: $module"
+                mkdir -p $(dirname $target)
+                cp "$module" "$target"
+                # If the kernel is compiled with coverage instrumentation, it
+                # contains the paths of the *.gcda coverage data output files
+                # (which it doesn't actually use...).  Get rid of them to prevent
+                # the whole kernel from being included in the initrd.
+                nuke-refs "$target"
+                echo "$target" >> $out/insmod-list;;
+             *)
+                echo "  unexpected modprobe output: $cmd $module"
+                exit 1;;
+        esac
+    done || test -n "$allowMissing"
+    if ! test -e found; then
+        echo "  not found"
+        if test -z "$allowMissing"; then
+            exit 1
+        fi
+    else
+        rm found
     fi
 done
 
-echo "closure:"
-mkdir -p $out/lib/modules/"$version"
-for module in $closure; do
-    target=$(echo $module | sed "s^$NIX_STORE.*/lib/modules/^$out/lib/modules/^")
-    if test -e "$target"; then continue; fi
-    if test \! -e "$module"; then continue; fi # XXX: to avoid error with "cp builtin builtin"
-    mkdir -p $(dirname $target)
-    echo $module
-    cp $module $target
-    # If the kernel is compiled with coverage instrumentation, it
-    # contains the paths of the *.gcda coverage data output files
-    # (which it doesn't actually use...).  Get rid of them to prevent
-    # the whole kernel from being included in the initrd.
-    nuke-refs $target
-    echo $target >> $out/insmod-list
-done
-
 mkdir -p $out/lib/firmware
-for module in $closure; do
+for module in $(cat closure); do
     for i in $(modinfo -F firmware $module); do
         mkdir -p "$out/lib/firmware/$(dirname "$i")"
         echo "firmware for $module: $i"