pkgs: stdenv: let inherit (pkgs.lib) optionalAttrs optionals toList; inherit (pkgs) addAttrsToDerivation overrideCC; inherit (pkgs.llvmPackages_latest) clangUseLLVM bintools; inherit (stdenv) buildPlatform hostPlatform; cflags = [ "-pipe" # Prefer pipes over temporary files between stages "-O2" # ] ++ optionals buildPlatform.useLLVM [ "-flto=thin" ]; ldflags = [ "-O2" # Enable tail merging of strings "--hash-style=gnu" # Produce only DT_GNU_HASH # ] ++ optionals buildPlatform.useLLVM [ "--icf=safe" # Fold identical code where safe "--lto-O2" "--pack-dyn-relocs=relr" ]; rustflags = [ "-C opt-level=2" # ] ++ optionals buildPlatform.useLLVM [ "-C lto=thin" "-C linker-flavor=ld.lld" "-C linker-plugin-lto" ] ++ optionals (hostPlatform.isx86_64 && hostPlatform ? gcc.arch) [ "-C target-cpu=${hostPlatform.gcc.arch}" ] ++ map (flag: "-C link-arg=${flag}") ldflags; in addAttrsToDerivation (base: { env = (base.env or { }) // optionalAttrs (!base ? NIX_CFLAGS_COMPILE) { NIX_CFLAGS_COMPILE = toString (toList base.env.NIX_CFLAGS_COMPILE or [ ] ++ cflags); } // optionalAttrs (base ? env.NIX_LDFLAGS) { NIX_LDFLAGS = toString (toList base.env.NIX_LDFLAGS or [ ] ++ ldflags); }; NIX_CFLAGS_LINK = toList base.NIX_CFLAGS_LINK or [ ] ++ map (flag: "-Wl,${flag}") ldflags; NIX_RUSTFLAGS = toList base.NIX_RUSTFLAGS or [ ] ++ rustflags; } // optionalAttrs (base ? env.NIX_CFLAGS) { NIX_CFLAGS_COMPILE = toList base.NIX_CFLAGS_COMPILE or [ ] ++ cflags; } // optionalAttrs (!base ? env.NIX_LDFLAGS) { NIX_LDFLAGS = toList base.NIX_LDFLAGS or [ ] ++ ldflags; }) (overrideCC stdenv (clangUseLLVM.override { inherit bintools; }))