summary refs log tree commit diff
diff options
context:
space:
mode:
authorYury G. Kudryashov <urkud.urkud@gmail.com>2012-03-26 15:15:27 +0000
committerYury G. Kudryashov <urkud.urkud@gmail.com>2012-03-26 15:15:27 +0000
commit0fe84d6eed4fb3318270ff8b67316f25b216656e (patch)
treea1ce6a362584147dbffeb9af7821fc7924ba8a21
parentd465b0798cd9e10e4a35e4150a3d0cac47e6a7a3 (diff)
Rewrite modules-related packaging backups/kmod-MODULE_DIR@33576
* Replace module-init-tools by kmod
* Drop MODULE_DIR patch

We'll maintain /lib/modules/modversion symlink instead. This way both
module-init-tools and libkmod will work without patches.

svn path=/nixpkgs/branches/kmod-MODULE_DIR/; revision=33428
-rw-r--r--pkgs/applications/virtualization/virtualbox/default.nix3
-rw-r--r--pkgs/applications/virtualization/virtualbox/guest-additions/default.nix11
-rw-r--r--pkgs/build-support/kernel/modules-closure.nix10
-rw-r--r--pkgs/build-support/kernel/modules-closure.sh12
-rw-r--r--pkgs/os-specific/linux/kernel/builder.sh8
-rw-r--r--pkgs/os-specific/linux/kernel/linux-3.0.nix4
-rw-r--r--pkgs/os-specific/linux/kernel/linux-3.1.nix4
-rw-r--r--pkgs/os-specific/linux/kernel/linux-3.2.nix4
-rw-r--r--pkgs/os-specific/linux/kernel/linux-3.3.nix4
-rw-r--r--pkgs/os-specific/linux/kmod/aggregator.nix (renamed from pkgs/os-specific/linux/module-init-tools/aggregator.nix)5
-rw-r--r--pkgs/os-specific/linux/kmod/default.nix10
-rw-r--r--pkgs/os-specific/linux/module-init-tools/default.nix34
-rw-r--r--pkgs/os-specific/linux/module-init-tools/docbook2man.patch12
-rw-r--r--pkgs/os-specific/linux/module-init-tools/module-dir.patch161
-rw-r--r--pkgs/top-level/all-packages.nix11
15 files changed, 34 insertions, 259 deletions
diff --git a/pkgs/applications/virtualization/virtualbox/default.nix b/pkgs/applications/virtualization/virtualbox/default.nix
index 9fa26eba4ab0b..d2fc82c38e1e2 100644
--- a/pkgs/applications/virtualization/virtualbox/default.nix
+++ b/pkgs/applications/virtualization/virtualbox/default.nix
@@ -82,8 +82,7 @@ stdenv.mkDerivation {
     
     # Install kernel module
     cd src
-    kernelVersion=$(cd ${kernel}/lib/modules; ls)
-    export MODULE_DIR=$out/lib/modules/$kernelVersion/misc
+    export MODULE_DIR=$out/lib/modules/${kernel.modDirVersion}/misc
     
     # Remove root ownership stuff, since this does not work in a chroot environment
     for i in `find . -name Makefile`; do
diff --git a/pkgs/applications/virtualization/virtualbox/guest-additions/default.nix b/pkgs/applications/virtualization/virtualbox/guest-additions/default.nix
index f9adf6132f5da..eb8eddb6a3f19 100644
--- a/pkgs/applications/virtualization/virtualbox/guest-additions/default.nix
+++ b/pkgs/applications/virtualization/virtualbox/guest-additions/default.nix
@@ -114,12 +114,11 @@ stdenv.mkDerivation {
     for i in *
     do
         cd $i
-	kernelVersion=$(cd ${kernel}/lib/modules; ls)
-	export MODULE_DIR=$out/lib/modules/$kernelVersion/misc
-	find . -type f | xargs sed -i -e "s|-o root||g" \
-	                              -e "s|-g root||g"
-	make install
-	cd ..
+        export MODULE_DIR=$out/lib/modules/${kernel.modDirVersion}/misc
+        find . -type f | xargs sed -i -e "s|-o root||g" \
+                                      -e "s|-g root||g"
+        make install
+        cd ..
     done    
   '';
   
diff --git a/pkgs/build-support/kernel/modules-closure.nix b/pkgs/build-support/kernel/modules-closure.nix
index cc197edbef19c..a91d5a4bfc818 100644
--- a/pkgs/build-support/kernel/modules-closure.nix
+++ b/pkgs/build-support/kernel/modules-closure.nix
@@ -1,15 +1,15 @@
-# Given a kernel build (with modules in $kernel/lib/modules/VERSION),
+# Given a modules tree (with modules in $modulesTree/lib/modules/VERSION),
 # produce a module tree in $out/lib/modules/VERSION that contains only
 # the modules identified by `rootModules', plus their dependencies.
 # Also generate an appropriate modules.dep.
 
-{ stdenv, kernel, nukeReferences, rootModules
-, module_init_tools, allowMissing ? false }:
+{ stdenv, modulesTree, nukeReferences, rootModules
+, kmod, allowMissing ? false }:
 
 stdenv.mkDerivation {
-  name = kernel.name + "-shrunk";
+  name = modulesTree.name + "-shrunk";
   builder = ./modules-closure.sh;
   buildInputs = [nukeReferences];
-  inherit kernel rootModules module_init_tools allowMissing;
+  inherit modulesTree rootModules kmod allowMissing;
   allowedReferences = ["out"];
 }
diff --git a/pkgs/build-support/kernel/modules-closure.sh b/pkgs/build-support/kernel/modules-closure.sh
index aa2615eb578dc..9ce8d52ba211b 100644
--- a/pkgs/build-support/kernel/modules-closure.sh
+++ b/pkgs/build-support/kernel/modules-closure.sh
@@ -2,19 +2,17 @@ source $stdenv/setup
 
 set -o pipefail
 
-PATH=$module_init_tools/sbin:$PATH
-
-version=$(cd $kernel/lib/modules && ls -d *)
+PATH=$kmod/sbin:$PATH
+version=$(cd $modulesTree/lib/modules && ls -d *)
 
 echo "kernel version is $version"
 
-export MODULE_DIR=$(readlink -f $kernel/lib/modules/)
-
+mkdir empty
 # Determine the dependencies of each root module.
 closure=
 for module in $rootModules; do
     echo "root module: $module"
-    deps=$(modprobe --config /dev/null --set-version "$version" --show-depends "$module" \
+    deps=$(modprobe -S "$version" -d "$modulesTree" --show-depends "$module" \
         | sed 's/^insmod //') \
         || if test -z "$allowMissing"; then exit 1; fi
     #for i in $deps; do echo $i; done
@@ -41,4 +39,4 @@ for module in $closure; do
     echo $target >> $out/insmod-list
 done
 
-MODULE_DIR=$out/lib/modules/ depmod -a $version
+depmod -b $out -a $version
diff --git a/pkgs/os-specific/linux/kernel/builder.sh b/pkgs/os-specific/linux/kernel/builder.sh
index 5d6d48d2fc3d6..3baba17ef8031 100644
--- a/pkgs/os-specific/linux/kernel/builder.sh
+++ b/pkgs/os-specific/linux/kernel/builder.sh
@@ -70,14 +70,8 @@ installPhase() {
     cp vmlinux $out
 
     if grep -q "CONFIG_MODULES=y" .config; then
-        # Install the modules in $out/lib/modules with matching paths
-        # in modules.dep (i.e., refererring to $out/lib/modules, not
-        # /lib/modules).  The depmod_opts= is to prevent the kernel
-        # from passing `-b PATH' to depmod.
-        export MODULE_DIR=$out/lib/modules/
-        substituteInPlace Makefile --replace '-b $(INSTALL_MOD_PATH)' ''
         make modules_install \
-            DEPMOD=$module_init_tools/sbin/depmod depmod_opts= \
+            DEPMOD=$module_init_tools/sbin/depmod \
             $makeFlags "${makeFlagsArray[@]}" \
             $installFlags "${installFlagsArray[@]}"
 
diff --git a/pkgs/os-specific/linux/kernel/linux-3.0.nix b/pkgs/os-specific/linux/kernel/linux-3.0.nix
index 6624718501c9f..2ec8ac89f49e6 100644
--- a/pkgs/os-specific/linux/kernel/linux-3.0.nix
+++ b/pkgs/os-specific/linux/kernel/linux-3.0.nix
@@ -229,10 +229,6 @@ import ./generic.nix (
   rec {
     version = "3.0.24";
   
-    preConfigure = ''
-      substituteInPlace scripts/depmod.sh --replace '-b "$INSTALL_MOD_PATH"' ""
-    '';
-
     src = fetchurl {
       url = "mirror://kernel/linux/kernel/v3.x/linux-${version}.tar.bz2";
       sha256 = "0j783ivlgg66jvasxaapimyzaqyn61jlz4abhkynckr4h5hrpvw4";
diff --git a/pkgs/os-specific/linux/kernel/linux-3.1.nix b/pkgs/os-specific/linux/kernel/linux-3.1.nix
index 9321bbdd479b9..0f5567ae337af 100644
--- a/pkgs/os-specific/linux/kernel/linux-3.1.nix
+++ b/pkgs/os-specific/linux/kernel/linux-3.1.nix
@@ -229,10 +229,6 @@ import ./generic.nix (
   rec {
     version = "3.1.10";
 
-    preConfigure = ''
-      substituteInPlace scripts/depmod.sh --replace '-b "$INSTALL_MOD_PATH"' ""
-    '';
-  
     src = fetchurl {
       url = "mirror://kernel/linux/kernel/v3.x/linux-${version}.tar.bz2";
       sha256 = "1vcpbh7wnc9smw2l5ci27a5p0rgmc1a5dc6a1aljm6f6wcfic8lz";
diff --git a/pkgs/os-specific/linux/kernel/linux-3.2.nix b/pkgs/os-specific/linux/kernel/linux-3.2.nix
index c5d7dedb11182..d8be056279416 100644
--- a/pkgs/os-specific/linux/kernel/linux-3.2.nix
+++ b/pkgs/os-specific/linux/kernel/linux-3.2.nix
@@ -231,10 +231,6 @@ import ./generic.nix (
 
     modDirVersion = version;
 
-    preConfigure = ''
-      substituteInPlace scripts/depmod.sh --replace '-b "$INSTALL_MOD_PATH"' ""
-    '';
-
     src = fetchurl {
       url = "mirror://kernel/linux/kernel/v3.0/${if testing then "testing/" else ""}linux-${version}.tar.bz2";
       sha256 = "1hacfmf08ydzf4xlg6wkkckl5icj7w9h3nh17myz1s67bp7q61qs";
diff --git a/pkgs/os-specific/linux/kernel/linux-3.3.nix b/pkgs/os-specific/linux/kernel/linux-3.3.nix
index ecdcfc86a88a4..b663f49aa128f 100644
--- a/pkgs/os-specific/linux/kernel/linux-3.3.nix
+++ b/pkgs/os-specific/linux/kernel/linux-3.3.nix
@@ -231,10 +231,6 @@ import ./generic.nix (
 
     modDirVersion = "3.3.0";
 
-    preConfigure = ''
-      substituteInPlace scripts/depmod.sh --replace '-b "$INSTALL_MOD_PATH"' ""
-    '';
-
     src = fetchurl {
       url = "mirror://kernel/linux/kernel/v3.0/${if testing then "testing/" else ""}linux-${version}.tar.bz2";
       sha256 = "0czk8bj46r3r95iz6gi7xkavhjx847s5p9248vabi0c1wjs6kmlg";
diff --git a/pkgs/os-specific/linux/module-init-tools/aggregator.nix b/pkgs/os-specific/linux/kmod/aggregator.nix
index cc4e6ab355219..1fb95edd006eb 100644
--- a/pkgs/os-specific/linux/module-init-tools/aggregator.nix
+++ b/pkgs/os-specific/linux/kmod/aggregator.nix
@@ -1,4 +1,4 @@
-{stdenv, module_init_tools, modules, buildEnv}:
+{stdenv, kmod, modules, buildEnv}:
 
 buildEnv {
   name = "kernel-modules";
@@ -21,7 +21,8 @@ buildEnv {
       # kernel version number, otherwise depmod will use `uname -r'.
       if test -w $out/lib/modules/$kernelVersion; then
           rm -f $out/lib/modules/$kernelVersion/modules.*
-          MODULE_DIR=$out/lib/modules/ ${module_init_tools}/sbin/depmod -a $kernelVersion
+          echo ${kmod}/sbin/depmod -b $out -a $kernelVersion
+          ${kmod}/sbin/depmod -b $out -a $kernelVersion
       fi
     '';
 }
diff --git a/pkgs/os-specific/linux/kmod/default.nix b/pkgs/os-specific/linux/kmod/default.nix
index c75b8bec14660..75654226616eb 100644
--- a/pkgs/os-specific/linux/kmod/default.nix
+++ b/pkgs/os-specific/linux/kmod/default.nix
@@ -8,10 +8,18 @@ stdenv.mkDerivation {
     sha256 = "1xvsy2zcfdimj4j5b5yyxaqx2byabmwq8qlzjm0hqzpyxxgfw1lq";
   };
 
-  buildInputs = [ pkgconfig xz zlib ];
+  buildInputs = [ xz zlib ];
+  buildNativeInputs = [ pkgconfig ];
 
   configureFlags = [ "--with-xz" "--with-zlib" ];
 
+  postInstall = ''
+    mkdir -p $out/sbin
+    for i in depmod insmod lsmod modinfo modprobe rmmod; do
+      ln -sv ../bin/kmod $out/sbin/$i
+    done
+    '';
+
   meta = {
     homepage = http://www.kernel.org/pub/linux/utils/kernel/kmod/;
     description = "Tools for loading and managing Linux kernel modules";
diff --git a/pkgs/os-specific/linux/module-init-tools/default.nix b/pkgs/os-specific/linux/module-init-tools/default.nix
deleted file mode 100644
index 077d08f899daf..0000000000000
--- a/pkgs/os-specific/linux/module-init-tools/default.nix
+++ /dev/null
@@ -1,34 +0,0 @@
-{ stdenv, fetchurl, docbook2x, docbook_sgml_dtd_41 }:
-
-stdenv.mkDerivation {
-  name = "module-init-tools-3.16";
-
-  src = [
-    (fetchurl {
-      url = mirror://kernel/linux/utils/kernel/module-init-tools/module-init-tools-3.16.tar.bz2;
-      sha256 = "0jxnz9ahfic79rp93l5wxcbgh4pkv85mwnjlbv1gz3jawv5cvwp1";
-    })
-
-    # Upstream forgot to include the generated manpages.  Thankfully
-    # the Gentoo people fixed this for us :-)
-    (fetchurl {
-      url = mirror://gentoo/distfiles/module-init-tools-3.16-man.tar.bz2;
-      sha256 = "1j1nzi87kgsh4scl645fhwhjvljxj83cmdasa4n4p5krhasgw358";
-    })
-  ];
-
-  SGML_CATALOG_FILES = "${docbook_sgml_dtd_41}/sgml/dtd/docbook-4.1/docbook.cat";
-
-  patches = [ ./module-dir.patch ./docbook2man.patch ];
-
-  postInstall = "rm $out/sbin/insmod.static"; # don't need it
-
-  # We don't want bash (and therefore glibc) in the closure of the
-  # output, since we want to put this in a initrd.
-  dontPatchShebangs = stdenv ? isDietLibC;
-
-  meta = {
-    homepage = http://www.kernel.org/pub/linux/utils/kernel/module-init-tools/;
-    description = "Tools for loading and managing Linux kernel modules";
-  };
-}
diff --git a/pkgs/os-specific/linux/module-init-tools/docbook2man.patch b/pkgs/os-specific/linux/module-init-tools/docbook2man.patch
deleted file mode 100644
index 4de07b658a91b..0000000000000
--- a/pkgs/os-specific/linux/module-init-tools/docbook2man.patch
+++ /dev/null
@@ -1,12 +0,0 @@
-diff -Naur module-init-tools-3.16-orig/Makefile.in module-init-tools-3.16/Makefile.in
---- module-init-tools-3.16-orig/Makefile.in	2011-06-02 13:56:45.000000000 -0400
-+++ module-init-tools-3.16/Makefile.in	2011-10-01 23:59:30.584443193 -0400
-@@ -174,7 +174,7 @@
- CYGPATH_W = @CYGPATH_W@
- DEFS = @DEFS@
- DEPDIR = @DEPDIR@
--DOCBOOKTOMAN = @DOCBOOKTOMAN@
-+DOCBOOKTOMAN = @DOCBOOKTOMAN@ --sgml
- ECHO_C = @ECHO_C@
- ECHO_N = @ECHO_N@
- ECHO_T = @ECHO_T@
diff --git a/pkgs/os-specific/linux/module-init-tools/module-dir.patch b/pkgs/os-specific/linux/module-init-tools/module-dir.patch
deleted file mode 100644
index 95c7559604dd8..0000000000000
--- a/pkgs/os-specific/linux/module-init-tools/module-dir.patch
+++ /dev/null
@@ -1,161 +0,0 @@
-commit cf2c95edb7918bc658f6cae93793c1949fc9cb6e
-Author: David Guibert <david.guibert@gmail.com>
-Date:   Fri Aug 5 14:20:12 2011 +0200
-
-    introduce module-dir
-
-diff --git a/depmod.c b/depmod.c
-index a1d2f8c..9362a35 100644
---- a/depmod.c
-+++ b/depmod.c
-@@ -48,9 +48,6 @@
- 
- #include "testing.h"
- 
--#ifndef MODULE_DIR
--#define MODULE_DIR "/lib/modules/"
--#endif
- 
- #ifndef MODULE_BUILTIN_KEY
- #define MODULE_BUILTIN_KEY "built-in"
-@@ -1516,6 +1513,7 @@ static int parse_config_file(const char *filename,
- 	char *line;
- 	unsigned int linenum = 0;
- 	FILE *cfile;
-+ 	char *module_dir;
- 
- 	cfile = fopen(filename, "r");
- 	if (!cfile) {
-@@ -1525,6 +1523,10 @@ static int parse_config_file(const char *filename,
- 		return 0;
- 	}
- 
-+        if((module_dir = getenv("MODULE_DIR")) == NULL) {
-+                module_dir = "/lib/modules/";
-+        }
-+
- 	while ((line = getline_wrapped(cfile, &linenum)) != NULL) {
- 		char *ptr = line;
- 		char *cmd, *modname;
-@@ -1550,7 +1552,7 @@ static int parse_config_file(const char *filename,
- 					continue;
- 				}
- 				nofail_asprintf(&dirname, "%s%s%s/%s", basedir,
--					MODULE_DIR, kernelversion, search_path);
-+					module_dir, kernelversion, search_path);
- 				len = strlen(dirname);
- 				*search = add_search(dirname, len, *search);
- 				free(dirname);
-@@ -1565,7 +1567,7 @@ static int parse_config_file(const char *filename,
- 				continue;
- 
- 			nofail_asprintf(&pathname, "%s%s%s/%s/%s.ko", basedir,
--				MODULE_DIR, kernelversion, subdir, modname);
-+				module_dir, kernelversion, subdir, modname);
- 
- 			*overrides = add_override(pathname, *overrides);
- 			free(pathname);
-@@ -1737,6 +1739,7 @@ int main(int argc, char *argv[])
- 	char *basedir = "", *dirname, *version;
- 	char *system_map = NULL, *module_symvers = NULL;
- 	int i;
-+ 	char *module_dir;
- 	const char *config = NULL;
- 
- 	if (native_endianness() == 0)
-@@ -1832,7 +1835,11 @@ int main(int argc, char *argv[])
- 	if (optind == argc)
- 		all = 1;
- 
--	nofail_asprintf(&dirname, "%s%s%s", basedir, MODULE_DIR, version);
-+        if((module_dir = getenv("MODULE_DIR")) == NULL) {
-+                module_dir = "/lib/modules/";
-+        }
-+
-+	nofail_asprintf(&dirname, "%s%s%s", basedir, module_dir, version);
- 
- 	if (maybe_all) {
- 		if (!doing_stdout && !depfile_out_of_date(dirname))
-@@ -1850,7 +1857,7 @@ int main(int argc, char *argv[])
- 		size_t len;
- 
- 		nofail_asprintf(&dirname, "%s%s%s/updates", basedir,
--				MODULE_DIR, version);
-+				module_dir, version);
- 		len = strlen(dirname);
- 		search = add_search(dirname, len, search);
- 	}
-diff --git a/modinfo.c b/modinfo.c
-index 1dd8469..67b1041 100644
---- a/modinfo.c
-+++ b/modinfo.c
-@@ -19,9 +19,6 @@
- #include "zlibsupport.h"
- #include "testing.h"
- 
--#ifndef MODULE_DIR
--#define MODULE_DIR "/lib/modules"
--#endif
- 
- struct param
- {
-@@ -193,6 +190,11 @@ static struct elf_file *grab_module(const char *name,
- 	struct utsname buf;
- 	char *depname, *p, *moddir;
- 	struct elf_file *module;
-+ 	char *module_dir;
-+
-+        if((module_dir = getenv("MODULE_DIR")) == NULL) {
-+                module_dir = "/lib/modules/";
-+        }
- 
- 	if (strchr(name, '.') || strchr(name, '/')) {
- 		module = grab_elf_file(name);
-@@ -207,9 +209,9 @@ static struct elf_file *grab_module(const char *name,
- 		kernel = buf.release;
- 	}
- 	if (strlen(basedir))
--		nofail_asprintf(&moddir, "%s/%s/%s", basedir, MODULE_DIR, kernel);
-+		nofail_asprintf(&moddir, "%s/%s/%s", basedir, module_dir, kernel);
- 	else
--		nofail_asprintf(&moddir, "%s/%s", MODULE_DIR, kernel);
-+		nofail_asprintf(&moddir, "%s/%s", module_dir, kernel);
- 
- 	/* Search for it in modules.dep. */
- 	nofail_asprintf(&depname, "%s/%s", moddir, "modules.dep");
-diff --git a/modprobe.c b/modprobe.c
-index 5464f45..d9fbf9d 100644
---- a/modprobe.c
-+++ b/modprobe.c
-@@ -86,10 +86,6 @@ typedef enum
- 
- } modprobe_flags_t;
- 
--#ifndef MODULE_DIR
--#define MODULE_DIR "/lib/modules"
--#endif
--
- /**
-  * print_usage - output the prefered program usage
-  *
-@@ -2136,6 +2132,7 @@ int main(int argc, char *argv[])
- 	struct modprobe_conf conf = {};
- 
- 	recursion_depth = 0;
-+ 	char *module_dir = NULL;
- 
- 	/* Prepend options from environment. */
- 	argv = merge_args(getenv("MODPROBE_OPTIONS"), argv, &argc);
-@@ -2233,7 +2230,11 @@ int main(int argc, char *argv[])
- 	if (argc < optind + 1 && !dump_config && !list_only)
- 		print_usage(argv[0]);
- 
--	nofail_asprintf(&dirname, "%s%s/%s", basedir, MODULE_DIR, buf.release);
-+	if((module_dir = getenv("MODULE_DIR")) == NULL) {
-+		module_dir = "/lib/modules";
-+	}
-+
-+	nofail_asprintf(&dirname, "%s%s/%s", basedir, module_dir, buf.release);
- 
- 	/* Old-style -t xxx wildcard?  Only with -l. */
- 	if (list_only) {
diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix
index 52b3173fc594a..8c70085ff5632 100644
--- a/pkgs/top-level/all-packages.nix
+++ b/pkgs/top-level/all-packages.nix
@@ -325,10 +325,9 @@ let
 
   makeWrapper = makeSetupHook {} ../build-support/make-wrapper/make-wrapper.sh;
 
-  makeModulesClosure = {kernel, rootModules, allowMissing ? false}:
+  makeModulesClosure = {modulesTree, rootModules, allowMissing ? false}:
     import ../build-support/kernel/modules-closure.nix {
-      inherit stdenv module_init_tools kernel nukeReferences
-        rootModules allowMissing;
+      inherit stdenv kmod modulesTree nukeReferences rootModules allowMissing;
     };
 
   pathsFromGraph = ../build-support/kernel/paths-from-graph.pl;
@@ -5832,15 +5831,15 @@ let
 
   mingetty = callPackage ../os-specific/linux/mingetty { };
 
-  module_init_tools = callPackage ../os-specific/linux/module-init-tools { };
+  module_init_tools = pkgs.kmod;
 
   mountall = callPackage ../os-specific/linux/mountall {
     automake = automake111x;
   };
 
   aggregateModules = modules:
-    import ../os-specific/linux/module-init-tools/aggregator.nix {
-      inherit stdenv module_init_tools modules buildEnv;
+    import ../os-specific/linux/kmod/aggregator.nix {
+      inherit stdenv kmod modules buildEnv;
     };
 
   modutils = callPackage ../os-specific/linux/modutils {