Merge pull request #129806 from lovesegfault/kernel-extra-build-flags
linux: groundwork to enable LLVM/LTO builds
This commit is contained in:
commit
91ffffd904
3 changed files with 26 additions and 13 deletions
|
@ -19,6 +19,7 @@ my $autoModules = $ENV{'AUTO_MODULES'};
|
||||||
my $preferBuiltin = $ENV{'PREFER_BUILTIN'};
|
my $preferBuiltin = $ENV{'PREFER_BUILTIN'};
|
||||||
my $ignoreConfigErrors = $ENV{'ignoreConfigErrors'};
|
my $ignoreConfigErrors = $ENV{'ignoreConfigErrors'};
|
||||||
my $buildRoot = $ENV{'BUILD_ROOT'};
|
my $buildRoot = $ENV{'BUILD_ROOT'};
|
||||||
|
my $makeFlags = $ENV{'MAKE_FLAGS'};
|
||||||
$SIG{PIPE} = 'IGNORE';
|
$SIG{PIPE} = 'IGNORE';
|
||||||
|
|
||||||
# Read the answers.
|
# Read the answers.
|
||||||
|
@ -40,7 +41,7 @@ close ANSWERS;
|
||||||
sub runConfig {
|
sub runConfig {
|
||||||
|
|
||||||
# Run `make config'.
|
# Run `make config'.
|
||||||
my $pid = open2(\*IN, \*OUT, "make -C $ENV{SRC} O=$buildRoot config SHELL=bash ARCH=$ENV{ARCH} CC=$ENV{CC} HOSTCC=$ENV{HOSTCC} HOSTCXX=$ENV{HOSTCXX}");
|
my $pid = open2(\*IN, \*OUT, "make -C $ENV{SRC} O=$buildRoot config SHELL=bash ARCH=$ENV{ARCH} CC=$ENV{CC} HOSTCC=$ENV{HOSTCC} HOSTCXX=$ENV{HOSTCXX} $makeFlags");
|
||||||
|
|
||||||
# Parse the output, look for questions and then send an
|
# Parse the output, look for questions and then send an
|
||||||
# appropriate answer.
|
# appropriate answer.
|
||||||
|
|
|
@ -21,6 +21,9 @@
|
||||||
, # Legacy overrides to the intermediate kernel config, as string
|
, # Legacy overrides to the intermediate kernel config, as string
|
||||||
extraConfig ? ""
|
extraConfig ? ""
|
||||||
|
|
||||||
|
# Additional make flags passed to kbuild
|
||||||
|
, extraMakeFlags ? []
|
||||||
|
|
||||||
, # kernel intermediate config overrides, as a set
|
, # kernel intermediate config overrides, as a set
|
||||||
structuredExtraConfig ? {}
|
structuredExtraConfig ? {}
|
||||||
|
|
||||||
|
@ -97,7 +100,7 @@ let
|
||||||
in lib.concatStringsSep "\n" ([baseConfigStr] ++ configFromPatches);
|
in lib.concatStringsSep "\n" ([baseConfigStr] ++ configFromPatches);
|
||||||
|
|
||||||
configfile = stdenv.mkDerivation {
|
configfile = stdenv.mkDerivation {
|
||||||
inherit ignoreConfigErrors autoModules preferBuiltin kernelArch;
|
inherit ignoreConfigErrors autoModules preferBuiltin kernelArch extraMakeFlags;
|
||||||
pname = "linux-config";
|
pname = "linux-config";
|
||||||
inherit version;
|
inherit version;
|
||||||
|
|
||||||
|
@ -116,6 +119,9 @@ let
|
||||||
# e.g. "bzImage"
|
# e.g. "bzImage"
|
||||||
kernelTarget = stdenv.hostPlatform.linux-kernel.target;
|
kernelTarget = stdenv.hostPlatform.linux-kernel.target;
|
||||||
|
|
||||||
|
makeFlags = lib.optionals (stdenv.hostPlatform.linux-kernel ? makeFlags) stdenv.hostPlatform.linux-kernel.makeFlags
|
||||||
|
++ extraMakeFlags;
|
||||||
|
|
||||||
prePatch = kernel.prePatch + ''
|
prePatch = kernel.prePatch + ''
|
||||||
# Patch kconfig to print "###" after every question so that
|
# Patch kconfig to print "###" after every question so that
|
||||||
# generate-config.pl from the generic builder can answer them.
|
# generate-config.pl from the generic builder can answer them.
|
||||||
|
@ -134,16 +140,19 @@ let
|
||||||
export HOSTLD=$LD_FOR_BUILD
|
export HOSTLD=$LD_FOR_BUILD
|
||||||
|
|
||||||
# Get a basic config file for later refinement with $generateConfig.
|
# Get a basic config file for later refinement with $generateConfig.
|
||||||
make -C . O="$buildRoot" $kernelBaseConfig \
|
make $makeFlags \
|
||||||
|
-C . O="$buildRoot" $kernelBaseConfig \
|
||||||
ARCH=$kernelArch \
|
ARCH=$kernelArch \
|
||||||
HOSTCC=$HOSTCC HOSTCXX=$HOSTCXX HOSTAR=$HOSTAR HOSTLD=$HOSTLD \
|
HOSTCC=$HOSTCC HOSTCXX=$HOSTCXX HOSTAR=$HOSTAR HOSTLD=$HOSTLD \
|
||||||
CC=$CC OBJCOPY=$OBJCOPY OBJDUMP=$OBJDUMP READELF=$READELF
|
CC=$CC OBJCOPY=$OBJCOPY OBJDUMP=$OBJDUMP READELF=$READELF \
|
||||||
|
$makeFlags
|
||||||
|
|
||||||
# Create the config file.
|
# Create the config file.
|
||||||
echo "generating kernel configuration..."
|
echo "generating kernel configuration..."
|
||||||
ln -s "$kernelConfigPath" "$buildRoot/kernel-config"
|
ln -s "$kernelConfigPath" "$buildRoot/kernel-config"
|
||||||
DEBUG=1 ARCH=$kernelArch KERNEL_CONFIG="$buildRoot/kernel-config" AUTO_MODULES=$autoModules \
|
DEBUG=1 ARCH=$kernelArch KERNEL_CONFIG="$buildRoot/kernel-config" AUTO_MODULES=$autoModules \
|
||||||
PREFER_BUILTIN=$preferBuiltin BUILD_ROOT="$buildRoot" SRC=. perl -w $generateConfig
|
PREFER_BUILTIN=$preferBuiltin BUILD_ROOT="$buildRoot" SRC=. MAKE_FLAGS="$makeFlags" \
|
||||||
|
perl -w $generateConfig
|
||||||
'';
|
'';
|
||||||
|
|
||||||
installPhase = "mv $buildRoot/.config $out";
|
installPhase = "mv $buildRoot/.config $out";
|
||||||
|
@ -151,7 +160,6 @@ let
|
||||||
enableParallelBuilding = true;
|
enableParallelBuilding = true;
|
||||||
|
|
||||||
passthru = rec {
|
passthru = rec {
|
||||||
|
|
||||||
module = import ../../../../nixos/modules/system/boot/kernel_config.nix;
|
module = import ../../../../nixos/modules/system/boot/kernel_config.nix;
|
||||||
# used also in apache
|
# used also in apache
|
||||||
# { modules = [ { options = res.options; config = svc.config or svc; } ];
|
# { modules = [ { options = res.options; config = svc.config or svc; } ];
|
||||||
|
@ -172,14 +180,14 @@ let
|
||||||
}; # end of configfile derivation
|
}; # end of configfile derivation
|
||||||
|
|
||||||
kernel = (callPackage ./manual-config.nix {}) {
|
kernel = (callPackage ./manual-config.nix {}) {
|
||||||
inherit version modDirVersion src kernelPatches randstructSeed lib stdenv extraMeta configfile;
|
inherit version modDirVersion src kernelPatches randstructSeed lib stdenv extraMakeFlags extraMeta configfile;
|
||||||
|
|
||||||
config = { CONFIG_MODULES = "y"; CONFIG_FW_LOADER = "m"; };
|
config = { CONFIG_MODULES = "y"; CONFIG_FW_LOADER = "m"; };
|
||||||
};
|
};
|
||||||
|
|
||||||
passthru = {
|
passthru = {
|
||||||
features = kernelFeatures;
|
features = kernelFeatures;
|
||||||
inherit commonStructuredConfig isZen isHardened isLibre modDirVersion;
|
inherit commonStructuredConfig structuredExtraConfig extraMakeFlags isZen isHardened isLibre modDirVersion;
|
||||||
isXen = lib.warn "The isXen attribute is deprecated. All Nixpkgs kernels that support it now have Xen enabled." true;
|
isXen = lib.warn "The isXen attribute is deprecated. All Nixpkgs kernels that support it now have Xen enabled." true;
|
||||||
kernelOlder = lib.versionOlder version;
|
kernelOlder = lib.versionOlder version;
|
||||||
kernelAtLeast = lib.versionAtLeast version;
|
kernelAtLeast = lib.versionAtLeast version;
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
{ lib, buildPackages, runCommand, nettools, bc, bison, flex, perl, rsync, gmp, libmpc, mpfr, openssl
|
{ lib, buildPackages, runCommand, nettools, bc, bison, flex, perl, rsync, gmp, libmpc, mpfr, openssl
|
||||||
, libelf, cpio, elfutils, zstd, gawk
|
, libelf, cpio, elfutils, zstd, gawk, python3Minimal
|
||||||
, writeTextFile
|
, writeTextFile
|
||||||
}:
|
}:
|
||||||
|
|
||||||
|
@ -19,6 +19,8 @@ in {
|
||||||
stdenv,
|
stdenv,
|
||||||
# The kernel version
|
# The kernel version
|
||||||
version,
|
version,
|
||||||
|
# Additional kernel make flags
|
||||||
|
extraMakeFlags ? [],
|
||||||
# The version of the kernel module directory
|
# The version of the kernel module directory
|
||||||
modDirVersion ? version,
|
modDirVersion ? version,
|
||||||
# The kernel source (tarball, git checkout, etc.)
|
# The kernel source (tarball, git checkout, etc.)
|
||||||
|
@ -121,7 +123,7 @@ let
|
||||||
# See also https://kernelnewbies.org/BuildId
|
# See also https://kernelnewbies.org/BuildId
|
||||||
sed -i Makefile -e 's|--build-id=[^ ]*|--build-id=none|'
|
sed -i Makefile -e 's|--build-id=[^ ]*|--build-id=none|'
|
||||||
|
|
||||||
patchShebangs scripts/ld-version.sh
|
patchShebangs scripts
|
||||||
'';
|
'';
|
||||||
|
|
||||||
postPatch = ''
|
postPatch = ''
|
||||||
|
@ -173,7 +175,9 @@ let
|
||||||
"KBUILD_BUILD_VERSION=1-NixOS"
|
"KBUILD_BUILD_VERSION=1-NixOS"
|
||||||
kernelConf.target
|
kernelConf.target
|
||||||
"vmlinux" # for "perf" and things like that
|
"vmlinux" # for "perf" and things like that
|
||||||
] ++ optional isModular "modules";
|
]
|
||||||
|
++ optional isModular "modules"
|
||||||
|
++ extraMakeFlags;
|
||||||
|
|
||||||
installFlags = [
|
installFlags = [
|
||||||
"INSTALLKERNEL=${installkernel}"
|
"INSTALLKERNEL=${installkernel}"
|
||||||
|
@ -307,7 +311,7 @@ stdenv.mkDerivation ((drvAttrs config stdenv.hostPlatform.linux-kernel kernelPat
|
||||||
enableParallelBuilding = true;
|
enableParallelBuilding = true;
|
||||||
|
|
||||||
depsBuildBuild = [ buildPackages.stdenv.cc ];
|
depsBuildBuild = [ buildPackages.stdenv.cc ];
|
||||||
nativeBuildInputs = [ perl bc nettools openssl rsync gmp libmpc mpfr gawk zstd ]
|
nativeBuildInputs = [ perl bc nettools openssl rsync gmp libmpc mpfr gawk zstd python3Minimal ]
|
||||||
++ optional (stdenv.hostPlatform.linux-kernel.target == "uImage") buildPackages.ubootTools
|
++ optional (stdenv.hostPlatform.linux-kernel.target == "uImage") buildPackages.ubootTools
|
||||||
++ optional (lib.versionAtLeast version "4.14" && lib.versionOlder version "5.8") libelf
|
++ optional (lib.versionAtLeast version "4.14" && lib.versionOlder version "5.8") libelf
|
||||||
# Removed util-linuxMinimal since it should not be a dependency.
|
# Removed util-linuxMinimal since it should not be a dependency.
|
||||||
|
@ -325,7 +329,7 @@ stdenv.mkDerivation ((drvAttrs config stdenv.hostPlatform.linux-kernel kernelPat
|
||||||
"ARCH=${stdenv.hostPlatform.linuxArch}"
|
"ARCH=${stdenv.hostPlatform.linuxArch}"
|
||||||
] ++ lib.optional (stdenv.hostPlatform != stdenv.buildPlatform) [
|
] ++ lib.optional (stdenv.hostPlatform != stdenv.buildPlatform) [
|
||||||
"CROSS_COMPILE=${stdenv.cc.targetPrefix}"
|
"CROSS_COMPILE=${stdenv.cc.targetPrefix}"
|
||||||
];
|
] ++ extraMakeFlags;
|
||||||
|
|
||||||
karch = stdenv.hostPlatform.linuxArch;
|
karch = stdenv.hostPlatform.linuxArch;
|
||||||
})
|
})
|
||||||
|
|
Loading…
Reference in a new issue