summary refs log tree commit diff
path: root/pkgs/os-specific/linux/kernel
diff options
context:
space:
mode:
authorShea Levy <shea@shealevy.com>2012-07-29 01:23:51 -0400
committerShea Levy <shea@shealevy.com>2012-07-29 01:23:51 -0400
commitbf7467cbb1f08470854db73ee2c07d9f896aefc8 (patch)
tree5cfe120bb748aeab52e8be27082ed30b477a06d2 /pkgs/os-specific/linux/kernel
parentc3c68b6510dd1e6b3713be5746e36f3212422ae6 (diff)
downloadnixpkgs-bf7467cbb1f08470854db73ee2c07d9f896aefc8.tar
nixpkgs-bf7467cbb1f08470854db73ee2c07d9f896aefc8.tar.gz
nixpkgs-bf7467cbb1f08470854db73ee2c07d9f896aefc8.tar.bz2
nixpkgs-bf7467cbb1f08470854db73ee2c07d9f896aefc8.tar.lz
nixpkgs-bf7467cbb1f08470854db73ee2c07d9f896aefc8.tar.xz
nixpkgs-bf7467cbb1f08470854db73ee2c07d9f896aefc8.tar.zst
nixpkgs-bf7467cbb1f08470854db73ee2c07d9f896aefc8.zip
Add first attempt at linux/kernel/manual-config.
The goal of this function is to make it possible to build a kernel with a user provided .config.
As a secondary goal, it will extract NixOS-relevant features from the config automatically.
As a tertiary goal, the build will aim to be simpler than the current generic kernel builder.sh.

Unfortunately, that simplicity is offset by the complexity of the feature extraction, especially since nix segfaults when trying to split the file into lines (so an import from a derivation is used)
Diffstat (limited to 'pkgs/os-specific/linux/kernel')
-rw-r--r--pkgs/os-specific/linux/kernel/manual-config.nix81
1 files changed, 81 insertions, 0 deletions
diff --git a/pkgs/os-specific/linux/kernel/manual-config.nix b/pkgs/os-specific/linux/kernel/manual-config.nix
new file mode 100644
index 00000000000..8cf8b650216
--- /dev/null
+++ b/pkgs/os-specific/linux/kernel/manual-config.nix
@@ -0,0 +1,81 @@
+{ stdenv, runCommand }:
+
+{ version, modDirVersion ? version, src, patches ? [], config }:
+
+with stdenv.lib;
+
+let
+
+  # Function to parse the config file to get the features supported
+  readFeatures = config:
+    let
+      # !!! Original causes recursion too deep, need to import from derivation
+      # linesWithComments = splitString "\n" (builtins.readFile config);
+      lines = import "${runCommand "lines.nix" {} ''
+        echo "[" >> $out
+        while read line; do
+            if [ -n "$line" ] && [ `expr index "$line" "#"` -ne 1 ]; then
+                echo "${"''"}" >> $out
+                echo $(echo $line | sed "s@${"''"}@\$\{\"${"''"}\"}@g")"${"''"}" >> $out
+            fi
+        done < ${config} 
+        echo "]" >> $out
+      ''}";
+
+      nvpairs = map (s: let split = splitString "=" s; fst = head split; in {
+        name = substring (stringLength "CONFIG_") (stringLength fst) fst;
+        value = head (tail split);
+      }) lines;
+
+      configAttrs = listToAttrs nvpairs;
+
+      getValue = option:
+        if hasAttr option configAttrs then getAttr option configAttrs else null;
+
+      isYes = option: (getValue option) == "y";
+    in
+
+    {
+      modular = isYes "MODULES";
+    };
+
+  features = readFeatures config;
+
+in
+
+stdenv.mkDerivation ({
+  name = "linux-${version}";
+
+  enableParallelBuilding = true;
+
+  passthru = {
+    inherit version modDirVersion features;
+  };
+
+  inherit patches src;
+
+  postPatch = ''
+    for mf in $(find -name Makefile); do
+        echo "stripping FHS paths in \`$mf'..."
+        sed -i "$mf" -e 's|/usr/bin/||g ; s|/bin/||g'
+    done
+  '';
+
+  configurePhase = ''
+    runHook preConfigure
+    ln -sv ${config} .config
+    make oldconfig
+    runHook postConfigure
+  '';
+
+  INSTALL_PATH = "$out";
+} // optionalAttrs features.modular {
+  MODLIB = "$out/lib/modules/${modDirVersion}";
+
+  INSTALL_MOD_STRIP = "1";
+
+  postInstall = ''
+    make modules_install $makeFlags "$\{makeFlagsArray[@]}" \
+      $installFlags "$\{installFlagsArray[@]}"
+  '';
+})