{ liminix , lib , targets ? [] , kernel ? null , runCommand , pkgsBuildBuild , dependencies ? [] } : let inherit (liminix.services) oneshot; inherit (lib) concatStringsSep; loader = runCommand "modules" { nativeBuildInputs = with pkgsBuildBuild ;[ kmod cpio gawk ]; } '' kernel=${kernel.modulesupport} mkdir -p lib/modules/0.0 (cd $kernel && find . -name \*.ko | cpio --verbose --make-directories -p $NIX_BUILD_TOP/lib/modules/0.0) cp $kernel/modules.* lib/modules/0.0 depmod -b . 0.0 (for i in ${lib.concatStringsSep " " targets}; do modprobe -S 0.0 -d $NIX_BUILD_TOP --show-depends $i | sed "s,^insmod $NIX_BUILD_TOP/lib/modules/0.0/,,g" done) | awk '!a[$0]++' > load-order mkdir $out for i in $(cat load-order); do install -v $NIX_BUILD_TOP/lib/modules/0.0/$i -D $out/$i done echo "O=$out" > $out/load.sh sed "s,^,insmod \$O/,g" < load-order >> $out/load.sh echo "O=$out" > $out/unload.sh tac load-order | sed "s,^,rmmod \$O/,g" > $out/unload.sh ''; in oneshot { name = "kmodloader-" + (concatStringsSep "-" targets); up = "sh ${loader}/load.sh"; down = "sh ${loader}/unload.sh"; inherit dependencies; }