summary refs log tree commit diff
path: root/pkgs/os-specific/linux/kernel/manual-config.nix
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/os-specific/linux/kernel/manual-config.nix')
-rw-r--r--pkgs/os-specific/linux/kernel/manual-config.nix112
1 files changed, 65 insertions, 47 deletions
diff --git a/pkgs/os-specific/linux/kernel/manual-config.nix b/pkgs/os-specific/linux/kernel/manual-config.nix
index 41dbbc22760..a9f0b8f052b 100644
--- a/pkgs/os-specific/linux/kernel/manual-config.nix
+++ b/pkgs/os-specific/linux/kernel/manual-config.nix
@@ -4,26 +4,41 @@ with stdenv.lib;
 
 let
 
-  # Function to parse the config file to get the features supported
-  readFeatures = config:
+  # Function to parse the config file into a nix expression
+  readConfig = configFile:
     let
-      configAttrs = import "${runCommand "attrList.nix" {} ''
-        grep -E -v '(^#|^$)' < ${config} | \
-          sed 's/CONFIG_// ; s/=/ /' | \
-          awk \
-            'BEGIN { print "{" }
-             END { print "}" }
-             { printf "\"%s\" = '"'''"'%s'"'''"';\n", $1, $2 }' > $out
+      configAttrs = import "${runCommand "config.nix" {} ''
+        (. ${configFile}
+        echo "{"
+        for var in `set`; do
+            if [[ "$var" =~ ^CONFIG_ ]]; then
+                IFS="="
+                set -- $var
+                echo "\"$1\" = \"''${*:2}\";"
+            fi
+        done
+        echo "}") > $out
       ''}";
-      getValue = option:
-        if hasAttr option configAttrs then getAttr option configAttrs else null;
 
-      isYes = option: (getValue option) == "y";
-    in
+      config = configAttrs // rec {
+        attrName = attr: "CONFIG_" + attr;
+
+        isSet = attr: hasAttr (attrName attr) config;
+
+        getValue = attr: if isSet attr then getAttr (attrName attr) config else null;
+
+        isYes = attr: (isSet attr) && ((getValue attr) == "y");
+
+        isNo = attr: (isSet attr) && ((getValue attr) == "n");
 
-    {
-      modular = isYes "MODULES";
-    };
+        isModule = attr: (isSet attr) && ((getValue attr) == "m");
+
+        isEnabled = attr: (isModule attr) || (isYes attr);
+
+        isDisabled = attr: (!(isSet attr)) || (isNo attr);
+      };
+    in
+      config;
 
 in
 
@@ -37,36 +52,35 @@ in
   # Any patches
   patches ? [],
   # The kernel .config file
-  config,
-  # Manually specified features the kernel supports
+  configfile,
+  # Manually specified nixexpr representing the config
   # If unspecified, this will be autodetected from the .config
-  features ? optionalAttrs allowImportFromDerivation (readFeatures config),
+  config ? optionalAttrs allowImportFromDerivation (readConfig configfile),
   # Whether to utilize the controversial import-from-derivation feature to parse the config
   allowImportFromDerivation ? false
 }:
 
 let
-  commonMakeFlags = [
-    "O=../build"
-    "INSTALL_PATH=$(out)"
-    "INSTALLKERNEL=${installkernel}"
-  ];
-
   installkernel = writeTextFile { name = "installkernel"; executable=true; text = ''
     #!/bin/sh
     mkdir $4
     mv -v $2 $4
     mv -v $3 $4
   '';};
+
+  isModular = config.isYes "MODULES";
+
+  installsFirmware = (config.isEnabled "FW_LOADER") &&
+    (isModular || (config.isNo "FIRMWARE_IN_KERNEL"));
 in
 
-stdenv.mkDerivation ({
+stdenv.mkDerivation {
   name = "linux-${version}";
 
   enableParallelBuilding = true;
 
   passthru = {
-    inherit version modDirVersion features;
+    inherit version modDirVersion config;
   };
 
   inherit patches src;
@@ -82,31 +96,22 @@ stdenv.mkDerivation ({
     runHook preConfigure
     mkdir ../build
     make $makeFlags "''${makeFlagsArray[@]}" mrproper
-    ln -sv ${config} ../build/.config
+    ln -sv ${configfile} ../build/.config
     make $makeFlags "''${makeFlagsArray[@]}" oldconfig
     rm ../build/.config.old
     runHook postConfigure
   '';
 
-  buildNativeInputs = [ perl nettools kmod ];
-
-  makeFlags = commonMakeFlags;
+  buildNativeInputs = [ perl nettools ] ++ optional isModular kmod;
 
-  meta = {
-    description = "The Linux kernel";
-    license = "GPLv2";
-    homepage = http://www.kernel.org/;
-    maintainers = [
-      maintainers.shlevy
-    ];
-    platforms = lib.platforms.linux;
-  };
-} // optionalAttrs (features ? modular && features.modular) {
-  makeFlags = commonMakeFlags ++ [
-    "MODLIB=\"$(out)/lib/modules/${modDirVersion}\""
-  ];
+  makeFlags = [
+    "O=../build"
+    "INSTALL_PATH=$(out)"
+    "INSTALLKERNEL=${installkernel}"
+  ] ++ (optional isModular "MODLIB=\"$(out)/lib/modules/${modDirVersion}\"")
+  ++ optional installsFirmware "INSTALL_FW_PATH=\"$(out)/lib/firmware\"";
 
-  postInstall = ''
+  postInstall = if isModular then ''
     make modules_install $makeFlags "''${makeFlagsArray[@]}" \
       $installFlags "''${installFlagsArray[@]}"
     rm -f $out/lib/modules/${modDirVersion}/{build,source}
@@ -115,11 +120,24 @@ stdenv.mkDerivation ({
     mv build $out/lib/modules/${modDirVersion}/build
     unlink $out/lib/modules/${modDirVersion}/build/source
     ln -sv $out/lib/modules/${modDirVersion}/{,build/}source
+  '' else optionalString installsFirmware ''
+    make firmware_install $makeFlags "''${makeFlagsArray[@]}" \
+      $installFlags "''${installFlagsArray[@]}"
   '';
 
-  postFixup = ''
+  postFixup = optionalString isModular ''
     if [ -z "$dontStrip" ]; then
         find $out -name "*.ko" -print0 | xargs -0 strip -S
     fi
   '';
-})
+
+  meta = {
+    description = "The Linux kernel";
+    license = "GPLv2";
+    homepage = http://www.kernel.org/;
+    maintainers = [
+      maintainers.shlevy
+    ];
+    platforms = lib.platforms.linux;
+  };
+}