Skip to content

Commit

Permalink
linux-headers: Improve derivation, removing cross arg
Browse files Browse the repository at this point in the history
 - Perl is used at build time, so must be in `nativeBuildInputs`. It's
   not used at run time so it should not be in `buildInputs`, too.

 - Don't treat headers like a compiler---use the build and host
   platforms not host and target. Perhaps that would make sense if every
   library's headers could be a separate derivation, but since that is
   not feasible, best to keep the implementation and interface in the
   same stage.

   To do this, we used `stdenvNoCC` to get rid of the normal toolchain,
   and added a dependency for the toolchain targeting the build platform
   --- `buildPackages.stdenv.cc` --- thus everything is effectively slid
   a stage black.
  • Loading branch information
Ericson2314 committed Aug 24, 2017
1 parent 9884a3b commit 791ce59
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 29 deletions.
44 changes: 19 additions & 25 deletions pkgs/os-specific/linux/kernel-headers/4.4.nix
Original file line number Diff line number Diff line change
@@ -1,43 +1,37 @@
{ stdenv, fetchurl, perl, cross ? null }:
{ stdenvNoCC, lib, buildPackages
, buildPlatform, hostPlatform
, fetchurl, perl
}:

assert cross == null -> stdenv.isLinux;
assert hostPlatform.isLinux;

let

version = "4.4.10";

kernelHeadersBaseConfig =
if cross == null
then stdenv.platform.kernelHeadersBaseConfig
else cross.platform.kernelHeadersBaseConfig;

inherit (hostPlatform.platform) kernelHeadersBaseConfig;
in

stdenv.mkDerivation {
stdenvNoCC.mkDerivation {
name = "linux-headers-${version}";

src = fetchurl {
url = "mirror://kernel/linux/kernel/v4.x/linux-${version}.tar.xz";
sha256 = "1kpjvvd9q9wwr3314q5ymvxii4dv2d27295bzly225wlc552xhja";
};

targetConfig = if cross != null then cross.config else null;
targetConfig = if hostPlatform != buildPlatform then hostPlatform.config else null;

platform =
if cross != null then cross.platform.kernelArch else
if stdenv.system == "i686-linux" then "i386" else
if stdenv.system == "x86_64-linux" then "x86_64" else
if stdenv.system == "powerpc-linux" then "powerpc" else
if stdenv.isArm then "arm" else
if stdenv.platform ? kernelArch then stdenv.platform.kernelArch else
abort "don't know what the kernel include directory is called for this platform";
platform = hostPlatform.platform.kernelArch or (
if hostPlatform.system == "i686-linux" then "i386" else
if hostPlatform.system == "x86_64-linux" then "x86_64" else
if hostPlatform.system == "powerpc-linux" then "powerpc" else
if hostPlatform.isArm then "arm" else
abort "don't know what the kernel include directory is called for this platform");

buildInputs = [perl];
# It may look odd that we use `stdenvNoCC`, and yet explicit depend on a cc.
# We do this so we have a build->build, not build->host, C compiler.
nativeBuildInputs = [ buildPackages.stdenv.cc perl ];

extraIncludeDirs =
if cross != null then
(if cross.arch == "powerpc" then ["ppc"] else [])
else if stdenv.system == "powerpc-linux" then ["ppc"] else [];
extraIncludeDirs = lib.optional hostPlatform.isPowerPC ["ppc"];

buildPhase = ''
if test -n "$targetConfig"; then
Expand All @@ -63,7 +57,7 @@ stdenv.mkDerivation {
fi
'';

meta = with stdenv.lib; {
meta = with lib; {
description = "Header files and scripts for Linux kernel";
license = licenses.gpl2;
platforms = platforms.linux;
Expand Down
5 changes: 1 addition & 4 deletions pkgs/top-level/all-packages.nix
Original file line number Diff line number Diff line change
Expand Up @@ -12021,9 +12021,7 @@ with pkgs;

lkl = callPackage ../applications/virtualization/lkl { };

linuxHeaders_4_4 = callPackage ../os-specific/linux/kernel-headers/4.4.nix {
cross = if targetPlatform != hostPlatform then targetPlatform else null;
};
linuxHeaders_4_4 = callPackage ../os-specific/linux/kernel-headers/4.4.nix { };
linuxHeaders = linuxHeaders_4_4;

kernelPatches = callPackage ../os-specific/linux/kernel/patches.nix { };
Expand Down Expand Up @@ -12666,7 +12664,6 @@ with pkgs;
uclibc = callPackage ../os-specific/linux/uclibc { };

uclibcCross = lowPrio (callPackage ../os-specific/linux/uclibc {
inherit (buildPackages) linuxHeaders;
gccCross = gccCrossStageStatic;
cross = assert targetPlatform != buildPlatform; targetPlatform;
});
Expand Down

0 comments on commit 791ce59

Please sign in to comment.