summary refs log blame commit diff
path: root/pkgs/os-specific/linux/kernel/manual-config.nix
blob: 83740b6285e7651c2e7a1d7aa0d845ded82bb7a1 (plain) (tree)
1
                                       




































































                                                                                        
                          

                                        









                                    
                                     
                                                                   



                          

                                                              

     
{ stdenv, runCommand, nettools, perl }:

{ 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)";

  buildNativeInputs = [ perl nettools ];

  installPhase = ''
    runHook preInstall
    mkdir $out
    mv -v System.map $out
    # !!! Assumes x86
    mv -v arch/x86/boot/bzImage $out
    mv -v vmlinux $out
    runHook postInstall
  '';
} // optionalAttrs features.modular {
  makeFlags = [ "MODLIB=\"$(out)/lib/modules/${modDirVersion}\"" ];

  INSTALL_MOD_STRIP = "1";

  postInstall = ''
    make modules_install $makeFlags "''${makeFlagsArray[@]}" \
      $installFlags "''${installFlagsArray[@]}"
  '';
})