Skip to content

Commit

Permalink
Add first attempt at linux/kernel/manual-config.
Browse files Browse the repository at this point in the history
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)
  • Loading branch information
shlevy committed Jul 29, 2012
1 parent c3c68b6 commit bf7467c
Show file tree
Hide file tree
Showing 2 changed files with 86 additions and 0 deletions.
81 changes: 81 additions & 0 deletions 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[@]}"
'';
})
5 changes: 5 additions & 0 deletions pkgs/top-level/all-packages.nix
Expand Up @@ -5856,6 +5856,11 @@ let
linux = linuxPackages.kernel;
linuxPackages = linuxPackages_3_2;

# A function to build a manually-configured kernel
linuxManualConfig = import ../os-specific/linux/kernel/manual-config.nix {
inherit stdenv runCommand;
};

keyutils = callPackage ../os-specific/linux/keyutils { };

libselinux = callPackage ../os-specific/linux/libselinux { };
Expand Down

0 comments on commit bf7467c

Please sign in to comment.