summary refs log tree commit diff
path: root/pkgs/os-specific
diff options
context:
space:
mode:
authorShea Levy <shea@shealevy.com>2012-07-29 13:24:05 -0400
committerShea Levy <shea@shealevy.com>2012-07-29 13:24:05 -0400
commitf0694a3151133543750f2418f9f83a297ee83147 (patch)
tree3b2fa4f789abb91cf5ba37e2cdbebf8af0ed7b2e /pkgs/os-specific
parent6585646d4195c9cfab1fdae2b473222159aa096b (diff)
downloadnixlib-f0694a3151133543750f2418f9f83a297ee83147.tar
nixlib-f0694a3151133543750f2418f9f83a297ee83147.tar.gz
nixlib-f0694a3151133543750f2418f9f83a297ee83147.tar.bz2
nixlib-f0694a3151133543750f2418f9f83a297ee83147.tar.lz
nixlib-f0694a3151133543750f2418f9f83a297ee83147.tar.xz
nixlib-f0694a3151133543750f2418f9f83a297ee83147.tar.zst
nixlib-f0694a3151133543750f2418f9f83a297ee83147.zip
linux/kernel/manual-config: Do all of the config file parsing in the imported-from derivation
Diffstat (limited to 'pkgs/os-specific')
-rw-r--r--pkgs/os-specific/linux/kernel/manual-config.nix80
1 files changed, 60 insertions, 20 deletions
diff --git a/pkgs/os-specific/linux/kernel/manual-config.nix b/pkgs/os-specific/linux/kernel/manual-config.nix
index 5d2a42646bf6..7cec47b86be9 100644
--- a/pkgs/os-specific/linux/kernel/manual-config.nix
+++ b/pkgs/os-specific/linux/kernel/manual-config.nix
@@ -1,4 +1,4 @@
-{ stdenv, runCommand, nettools, perl, kmod, writeTextFile }:
+{ stdenv, runCommand, nettools, perl, kmod, writeTextFile, coffeescript }:
 
 with stdenv.lib;
 
@@ -7,25 +7,65 @@ 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" ] && [ "#" != ''${line:0: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;
+      configParser = writeTextFile { name = "config-parser"; executable=true; text = ''
+        #!${coffeescript}/bin/coffee
+        fs = require "fs"
+        events = require "events"
+
+        lineEmitter = new events.EventEmitter()
+        buffer = new Buffer 0
+        input = fs.createReadStream process.argv[2]
+        input.on 'data', (data) ->
+          nextBuffer = new Buffer buffer.length + data.length
+          buffer.copy(nextBuffer)
+          data.copy(nextBuffer, buffer.length)
+          start = 0
+          offset = buffer.length
+          buffer = nextBuffer
+
+          for i in [1..data.length]
+              if data[i] == '\n'.charCodeAt 0
+                  end = i+offset+1
+                  line = buffer.slice start, end - 1
+                  start = end
+                  lineEmitter.emit "line", line.toString()
+
+          buffer = buffer.slice start
+        input.once 'end', ->
+          input.destroy()
+          if safeToWrite
+            output.end "}"
+            output.destroySoon()
+          else
+            output.once 'drain', ->
+              output.end "}"
+              output.destroySoon()
+
+        output = fs.createWriteStream process.env["out"]
+        output.setMaxListeners 0
+        safeToWrite = output.write "{\n"
+        unless safeToWrite
+          output.once 'drain', ->
+            safeToWrite = true
+
+        escapeNixString = (str) ->
+          str.replace("'''", "''''").replace("''${", "'''''${")
+        lineEmitter.on 'line', (line) ->
+          unless line.length is 0 or line.charAt(0) is '#'
+            split = line.split '='
+            name = split[0].substring "CONFIG_".length
+            value = escapeNixString split.slice(1).join ""
+            lineToWrite = "\"#{name}\" = '''#{value}''';\n"
+            if safeToWrite
+              safeToWrite = output.write lineToWrite
+            else
+              input.pause()
+              output.once 'drain', ->
+                safeToWrite = output.write lineToWrite
+                input.resume()
+      '';};
+
+      configAttrs = import "${runCommand "attrList.nix" {} "${configParser} ${config}"}";
 
       getValue = option:
         if hasAttr option configAttrs then getAttr option configAttrs else null;