mirror of
https://github.com/aviallon/nixos-lib.git
synced 2026-04-05 17:27:50 +00:00
208 lines
6 KiB
Nix
208 lines
6 KiB
Nix
{
|
|
config,
|
|
pkgs,
|
|
options,
|
|
lib,
|
|
myLib,
|
|
...
|
|
}:
|
|
with lib;
|
|
let
|
|
cfg = config.aviallon.optimizations;
|
|
desktopCfg = config.aviallon.desktop;
|
|
generalCfg = config.aviallon.general;
|
|
|
|
addAttrs = myLib.optimizations.addAttrs;
|
|
|
|
defaultOptimizeAttrs = {
|
|
level = "normal";
|
|
recursive = 0;
|
|
cpuCores = generalCfg.cpu.threads;
|
|
cpuArch = generalCfg.cpu.arch;
|
|
cpuTune = generalCfg.cpu.tune;
|
|
l1dCache = generalCfg.cpu.caches.l1d;
|
|
l1iCache = generalCfg.cpu.caches.l1i;
|
|
l1LineCache = generalCfg.cpu.caches.cacheLine;
|
|
lastLevelCache = generalCfg.cpu.caches.lastLevel;
|
|
extraCFlags = cfg.extraCompileFlags;
|
|
blacklist = cfg.blacklist;
|
|
ltoBlacklist = cfg.lto.blacklist;
|
|
overrideMap = cfg.overrideMap;
|
|
lto = cfg.lto.enable;
|
|
};
|
|
|
|
optimizePkg =
|
|
{
|
|
attributes ? { },
|
|
stdenv ? null,
|
|
...
|
|
}@attrs:
|
|
pkg:
|
|
myLib.optimizations.optimizePkg pkg (
|
|
defaultOptimizeAttrs // cfg.defaultSettings // { inherit stdenv attributes; } // attrs
|
|
);
|
|
in
|
|
{
|
|
options.aviallon.optimizations = {
|
|
enable = mkOption {
|
|
default = true;
|
|
example = false;
|
|
description = "Enable aviallon's optimizations";
|
|
type = types.bool;
|
|
};
|
|
lto = {
|
|
enable = mkOption {
|
|
description = "Wether to enable LTO for some packages";
|
|
type = types.bool;
|
|
default = true;
|
|
};
|
|
blacklist = mkOption {
|
|
description = "Packages to blacklist from LTO";
|
|
type = types.listOf types.str;
|
|
default = [
|
|
"x265"
|
|
"cpio"
|
|
"cups"
|
|
"gtk+3"
|
|
"which"
|
|
"openssh"
|
|
];
|
|
};
|
|
};
|
|
extraCompileFlags = mkOption {
|
|
default = [ ];
|
|
example = [
|
|
"-O2"
|
|
"-mavx"
|
|
];
|
|
description = "Add specific compile flags";
|
|
type = types.listOf types.str;
|
|
};
|
|
defaultSettings = mkOption {
|
|
default = {
|
|
recursive = 0;
|
|
level = "slower";
|
|
};
|
|
example = {
|
|
level = "unsafe";
|
|
recursive = 0;
|
|
};
|
|
description = "Specify default options passed to optimizePkg";
|
|
};
|
|
optimizePkg = mkOption {
|
|
default = if cfg.enable then optimizePkg else ({ ... }: pkg: pkg);
|
|
example = "pkg: pkg.override { stdenv = pkgs.fastStdenv; }";
|
|
description = "Function used for optimizing packages";
|
|
type = with types; functionTo (functionTo package);
|
|
};
|
|
trace = mkEnableOption "trace attributes in overriden derivations";
|
|
runtimeOverrides.enable = mkEnableOption "runtime overrides for performance sensitive libraries (glibc, ...)";
|
|
blacklist = mkOption {
|
|
default = [
|
|
# Broken
|
|
"alsa-lib"
|
|
"glib"
|
|
"lcms2"
|
|
"gconf"
|
|
"gnome-vfs"
|
|
|
|
# Very slow
|
|
"llvm"
|
|
"clang"
|
|
"clang-wrapper"
|
|
"valgrind"
|
|
"rustc"
|
|
"tensorflow"
|
|
"qtwebengine"
|
|
|
|
# Fixable with work, but slow for now
|
|
"rapidjson"
|
|
];
|
|
example = [ "bash" ];
|
|
description = "Blacklist specific packages from optimizations";
|
|
type = types.listOf types.str;
|
|
};
|
|
overrideMap = mkOption {
|
|
type = with types; attrsOf package;
|
|
default = {
|
|
};
|
|
example = literalExpression ''
|
|
{
|
|
ninja = pkgs.ninja-samurai;
|
|
cmake = pkgs.my-cmake-override;
|
|
}
|
|
'';
|
|
description = "Allow overriding packages found in `nativeBuildInputs` with custom packages.";
|
|
};
|
|
};
|
|
|
|
config = mkIf cfg.enable {
|
|
|
|
aviallon.optimizations.blacklist = mkDefault (
|
|
options.aviallon.optimizations.blacklist.default
|
|
++ (traceValSeq (forEach config.system.replaceRuntimeDependencies (x: lib.getName x.oldDependency)))
|
|
);
|
|
system.replaceDependencies.replacements =
|
|
mkIf (!lib.inPureEvalMode && cfg.runtimeOverrides.enable)
|
|
[
|
|
# glibc usually represents 20% of the userland CPU time. It is therefore very much worth optimizing.
|
|
/*
|
|
{
|
|
original = pkgs.glibc;
|
|
replacement = let
|
|
optimizedFlags = [ "-fipa-pta" ];
|
|
#optimizedFlags = myLib.optimizations.guessOptimizationsFlags pkgs.glibc (defaultOptimizeAttrs // { level = "slower"; recursive = 0; });
|
|
in pkgs.glibc.overrideAttrs (attrs: myLib.debug.traceValWithPrefix "optimizations (glibc)" {
|
|
passthru = pkgs.glibc.passthru;
|
|
env = (attrs.env or {}) // {
|
|
NIX_CFLAGS_COMPILE = (attrs.env.NIX_CFLAGS_COMPILE or "") + (toString optimizedFlags.CFLAGS);
|
|
};
|
|
});
|
|
}
|
|
*/
|
|
# zlib is in second place, given how often it is used
|
|
#{
|
|
# original = pkgs.zlib;
|
|
# replacement = optimizePkg { level = "slower"; } pkgs.zlib;
|
|
#}
|
|
];
|
|
|
|
nixpkgs.overlays = mkAfter [
|
|
(self: super: {
|
|
veryFastStdenv = super.overrideCC super.gccStdenv (
|
|
super.buildPackages.gcc_latest.overrideAttrs (
|
|
old:
|
|
let
|
|
optimizedAttrs = { } // {
|
|
configureFlags = [
|
|
"--with-cpu-64=${generalCfg.cpu.arch}"
|
|
"--with-arch-64=${generalCfg.cpu.arch}"
|
|
"--with-tune-64=${generalCfg.cpu.tune}"
|
|
"--with-build-config=bootstrap-lto-lean"
|
|
];
|
|
};
|
|
ccWithProfiling = old.cc.overrideAttrs (_: {
|
|
buildFlags = [ "profiledbootstrap" ];
|
|
});
|
|
in
|
|
{
|
|
cc = addAttrs ccWithProfiling optimizedAttrs;
|
|
}
|
|
)
|
|
);
|
|
})
|
|
|
|
(self: super: {
|
|
#jetbrains = super.jetbrains // {
|
|
# jdk = pipe super.jetbrains.jdk [
|
|
# (optimizePkg { level = "normal"; lto = false; })
|
|
# (pkg: pkg.overrideAttrs (old: {
|
|
# passthru = pkg.passthru or {};
|
|
# #configureFlags = (old.configureFlags or []) ++ [ "--with-extra-cflags" "--with-extra-cxxflags" "--with-extra-ldflags" ];
|
|
# }))
|
|
# ];
|
|
#};
|
|
})
|
|
];
|
|
};
|
|
}
|