forked from dan/liminix
by having two separate derivations for patching the kernel source tree and building it, we have to copy said source trees from one store location to another which takes non-neglible time on spinning rust (literally minutes on my machine). Replace with a single derivation that can do more things on one tree in-place
109 lines
3.3 KiB
Nix
109 lines
3.3 KiB
Nix
{ stdenv
|
|
, buildPackages
|
|
, runCommand
|
|
, writeText
|
|
, lib
|
|
|
|
, config
|
|
, checkedConfig ? {}
|
|
, src
|
|
, extraPatchPhase ? "true"
|
|
} :
|
|
let writeConfig = name : config: writeText name
|
|
(builtins.concatStringsSep
|
|
"\n"
|
|
(lib.mapAttrsToList
|
|
(name: value: (if value == "n" then "# CONFIG_${name} is not set" else "CONFIG_${name}=${value}"))
|
|
config
|
|
));
|
|
kconfigFile = writeConfig "kconfig" (config // checkedConfig);
|
|
# KLUDGE FIXME. some symbols we need to enable in some configurations don't
|
|
# have a prompt (!), so we can't turn them on just by adding FOO=y and make oldconfig
|
|
#
|
|
# (!) yes, that was my reaction too
|
|
kconfigLocal = writeText "Kconfig.local" ''
|
|
config LIMINIX
|
|
prompt "Local symbols"
|
|
bool
|
|
default y
|
|
select SOC_QCA955X
|
|
'';
|
|
checkedConfigFile = writeConfig "checked_kconfig" checkedConfig ;
|
|
inherit lib; in
|
|
stdenv.mkDerivation rec {
|
|
name = "kernel";
|
|
inherit src extraPatchPhase;
|
|
hardeningDisable = ["all"];
|
|
nativeBuildInputs = [buildPackages.stdenv.cc] ++
|
|
(with buildPackages.pkgs;
|
|
[rsync bc bison flex pkgconfig openssl ncurses.all perl]);
|
|
CC = "${stdenv.cc.bintools.targetPrefix}gcc";
|
|
HOSTCC = with buildPackages.pkgs;
|
|
"gcc -I${openssl}/include -I${ncurses}/include";
|
|
HOST_EXTRACFLAGS = with buildPackages.pkgs;
|
|
"-I${openssl.dev}/include -L${openssl.out}/lib -L${ncurses.out}/lib";
|
|
PKG_CONFIG_PATH = "./pkgconfig";
|
|
CROSS_COMPILE = stdenv.cc.bintools.targetPrefix;
|
|
ARCH = "mips"; # kernel uses "mips" here for both mips and mipsel
|
|
KBUILD_BUILD_HOST = "liminix.builder";
|
|
|
|
dontStrip = true;
|
|
dontPatchELF = true;
|
|
outputs = ["out" "headers"];
|
|
phases = [
|
|
"unpackPhase"
|
|
"butcherPkgconfig"
|
|
"extraPatchPhase"
|
|
"patchScripts"
|
|
"configurePhase"
|
|
"checkConfigurationPhase"
|
|
"buildPhase"
|
|
"installPhase"
|
|
];
|
|
|
|
# this is here to work around what I think is a bug in nixpkgs
|
|
# packaging of ncurses: it installs pkg-config data files which
|
|
# don't produce any -L options when queried with "pkg-config --lib
|
|
# ncurses". For a regular build you'll never even notice, this only
|
|
# becomes an issue if you do a nix-shell in this derivation and
|
|
# expect "make nconfig" to work.
|
|
butcherPkgconfig = ''
|
|
cp -r ${buildPackages.pkgs.ncurses.dev}/lib/pkgconfig .
|
|
chmod +w pkgconfig pkgconfig/*.pc
|
|
for i in pkgconfig/*.pc; do test -f $i && sed -i 's/^Libs:/Libs: -L''${libdir} /' $i;done
|
|
'';
|
|
|
|
patchScripts = ''
|
|
patchShebangs scripts/
|
|
'';
|
|
|
|
configurePhase = ''
|
|
export KBUILD_OUTPUT=`pwd`
|
|
cp ${kconfigFile} .config
|
|
cp ${kconfigFile} .config.orig
|
|
cp ${kconfigLocal} Kconfig.local
|
|
make V=1 olddefconfig
|
|
'';
|
|
|
|
checkConfigurationPhase = ''
|
|
echo Checking required config items:
|
|
if comm -2 -3 <(grep 'CONFIG' ${checkedConfigFile} |sort) <(grep 'CONFIG' .config|sort) |grep '.' ; then
|
|
echo -e "^^^ Some configuration lost :-(\nPerhaps you have mutually incompatible settings, or have disabled options on which these depend.\n"
|
|
exit 0
|
|
fi
|
|
echo "OK"
|
|
'';
|
|
|
|
buildPhase = ''
|
|
make vmlinux modules_prepare
|
|
'';
|
|
|
|
installPhase = ''
|
|
${CROSS_COMPILE}strip -d vmlinux
|
|
cp vmlinux $out
|
|
mkdir -p $headers
|
|
cp -a include .config $headers/
|
|
'';
|
|
|
|
}
|