2009-02-10 15:48:30 +00:00
|
|
|
|
/* This file contains various functions that take a stdenv and return
|
|
|
|
|
a new stdenv with different behaviour, e.g. using a different C
|
|
|
|
|
compiler. */
|
|
|
|
|
|
2021-08-17 01:16:29 +00:00
|
|
|
|
{ lib, pkgs, config }:
|
|
|
|
|
|
|
|
|
|
let
|
|
|
|
|
# N.B. Keep in sync with default arg for stdenv/generic.
|
2024-03-11 16:06:02 +00:00
|
|
|
|
defaultMkDerivationFromStdenv = stdenv: (import ./generic/make-derivation.nix { inherit lib config; } stdenv).mkDerivation;
|
2021-08-17 01:16:29 +00:00
|
|
|
|
|
|
|
|
|
# Low level function to help with overriding `mkDerivationFromStdenv`. One
|
|
|
|
|
# gives it the old stdenv arguments and a "continuation" function, and
|
|
|
|
|
# underneath the final stdenv argument it yields to the continuation to do
|
|
|
|
|
# whatever it wants with old `mkDerivation` (old `mkDerivationFromStdenv`
|
|
|
|
|
# applied to the *new, final* stdenv) provided for convenience.
|
|
|
|
|
withOldMkDerivation = stdenvSuperArgs: k: stdenvSelf: let
|
|
|
|
|
mkDerivationFromStdenv-super = stdenvSuperArgs.mkDerivationFromStdenv or defaultMkDerivationFromStdenv;
|
|
|
|
|
mkDerivationSuper = mkDerivationFromStdenv-super stdenvSelf;
|
|
|
|
|
in
|
|
|
|
|
k stdenvSelf mkDerivationSuper;
|
|
|
|
|
|
|
|
|
|
# Wrap the original `mkDerivation` providing extra args to it.
|
|
|
|
|
extendMkDerivationArgs = old: f: withOldMkDerivation old (_: mkDerivationSuper: args:
|
2022-06-05 11:51:57 +00:00
|
|
|
|
(mkDerivationSuper args).overrideAttrs f);
|
2021-08-17 01:16:29 +00:00
|
|
|
|
|
|
|
|
|
# Wrap the original `mkDerivation` transforming the result.
|
|
|
|
|
overrideMkDerivationResult = old: f: withOldMkDerivation old (_: mkDerivationSuper: args:
|
|
|
|
|
f (mkDerivationSuper args));
|
|
|
|
|
in
|
2012-10-31 12:41:54 +00:00
|
|
|
|
|
2009-02-10 15:48:30 +00:00
|
|
|
|
rec {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Override the compiler in stdenv for specific packages.
|
2024-06-18 16:38:21 +00:00
|
|
|
|
overrideCC = stdenv: cc: stdenv.override {
|
|
|
|
|
allowedRequisites = null;
|
|
|
|
|
cc = cc;
|
|
|
|
|
hasCC = cc != null;
|
|
|
|
|
};
|
2009-02-10 15:48:30 +00:00
|
|
|
|
|
2012-10-31 12:41:54 +00:00
|
|
|
|
|
2009-02-10 15:48:30 +00:00
|
|
|
|
# Add some arbitrary packages to buildInputs for specific packages.
|
2010-08-06 20:23:35 +00:00
|
|
|
|
# Used to override packages in stdenv like Make. Should not be used
|
2009-02-10 15:48:30 +00:00
|
|
|
|
# for other dependencies.
|
2014-02-04 16:18:38 +00:00
|
|
|
|
overrideInStdenv = stdenv: pkgs:
|
2020-04-28 14:51:39 +00:00
|
|
|
|
stdenv.override (prev: { allowedRequisites = null; extraBuildInputs = (prev.extraBuildInputs or []) ++ pkgs; });
|
2009-02-10 15:48:30 +00:00
|
|
|
|
|
|
|
|
|
|
2023-11-04 03:02:26 +00:00
|
|
|
|
# Override the libc++ dynamic library used in the stdenv to use the one from the platform’s
|
|
|
|
|
# default stdenv. This allows building packages and linking dependencies with different
|
|
|
|
|
# compiler versions while still using the same libc++ implementation for compatibility.
|
|
|
|
|
#
|
|
|
|
|
# Note that this adapter still uses the headers from the new stdenv’s libc++. This is necessary
|
|
|
|
|
# because older compilers may not be able to parse the headers from the default stdenv’s libc++.
|
|
|
|
|
overrideLibcxx = stdenv:
|
|
|
|
|
assert stdenv.cc.libcxx != null;
|
llvmPackages_{12,13,14,15,16,17,git}.{libcxx,libcxxabi}: merge libcxxabi into libcxx (#292043)
- merge libcxxabi into libcxx for LLVM 12, 13, 14, 15, 16, 17, and git.
- remove the link time workaround `-lc++ -lc++abi` from 58 packages as it is no longer required.
- fixes https://github.com/NixOS/nixpkgs/issues/166205
- provides alternative fixes for. https://github.com/NixOS/nixpkgs/issues/269548 https://github.com/NixOS/nix/issues/9640
- pkgsCross.x86_64-freebsd builds work again
This change can be represented in 3 stages
1. merge libcxxabi into libcxx -- files: pkgs/development/compilers/llvm/[12, git]/{libcxx, libcxxabi}
2. update stdenv to account for merge -- files: stdenv.{adapters, cc.wrapper, darwin}
3. remove all references to libcxxabi outside of llvm (about 58 packages modified)
### merging libcxxabi into libcxx
- take the union of the libcxxabi and libcxx cmake flags
- eliminate the libcxx-headers-only package - it was only needed to break libcxx <-> libcxxabi circular dependency
- libcxx.cxxabi is removed. external cxxabi (freebsd) will symlink headers / libs into libcxx.
- darwin will re-export the libcxxabi symbols into libcxx so linking `-lc++` is sufficient.
- linux/freebsd `libc++.so` is a linker script `LINK(libc++.so.1, -lc++abi)` making `-lc++` sufficient.
- libcxx/default.nix [12, 17] are identical except for patches and `LIBCXX_ADDITIONAL_LIBRARIES` (only used in 16+)
- git/libcxx/defaul.nix does not link with -nostdlib when useLLVM is true so flag is removed. this is not much different than before as libcxxabi used -nostdlib where libcxx did not, so libc was linked in anyway.
### stdenv changes
- darwin bootstrap, remove references to libcxxabi and cxxabi
- cc-wrapper: remove c++ link workaround when libcxx.cxxabi doesn't exist (still exists for LLVM pre 12)
- adapter: update overrideLibcxx to account for a pkgs.stdenv that only has libcxx
### 58 package updates
- remove `NIX_LDFLAGS = "-l${stdenv.cc.libcxx.cxxabi.libName}` as no longer needed
- swift, nodejs_v8 remove libcxxabi references in the clang override
https://github.com/NixOS/nixpkgs/pull/292043
2024-03-11 10:53:37 +00:00
|
|
|
|
assert pkgs.stdenv.cc.libcxx != null;
|
|
|
|
|
# only unified libcxx / libcxxabi stdenv's are supported
|
|
|
|
|
assert lib.versionAtLeast pkgs.stdenv.cc.libcxx.version "12";
|
|
|
|
|
assert lib.versionAtLeast stdenv.cc.libcxx.version "12";
|
2023-11-04 03:02:26 +00:00
|
|
|
|
let
|
|
|
|
|
llvmLibcxxVersion = lib.getVersion llvmLibcxx;
|
|
|
|
|
|
|
|
|
|
stdenvLibcxx = pkgs.stdenv.cc.libcxx;
|
|
|
|
|
llvmLibcxx = stdenv.cc.libcxx;
|
|
|
|
|
|
|
|
|
|
libcxx = pkgs.runCommand "${stdenvLibcxx.name}-${llvmLibcxxVersion}" {
|
|
|
|
|
outputs = [ "out" "dev" ];
|
|
|
|
|
isLLVM = true;
|
|
|
|
|
} ''
|
|
|
|
|
mkdir -p "$dev/nix-support"
|
|
|
|
|
ln -s '${stdenvLibcxx}' "$out"
|
|
|
|
|
echo '${stdenvLibcxx}' > "$dev/nix-support/propagated-build-inputs"
|
|
|
|
|
ln -s '${lib.getDev llvmLibcxx}/include' "$dev/include"
|
|
|
|
|
'';
|
|
|
|
|
in
|
|
|
|
|
overrideCC stdenv (stdenv.cc.override {
|
|
|
|
|
inherit libcxx;
|
2024-01-07 22:11:49 +00:00
|
|
|
|
extraPackages = [
|
|
|
|
|
pkgs.buildPackages.targetPackages."llvmPackages_${lib.versions.major llvmLibcxxVersion}".compiler-rt
|
|
|
|
|
];
|
2023-11-04 03:02:26 +00:00
|
|
|
|
});
|
|
|
|
|
|
2009-02-10 15:48:30 +00:00
|
|
|
|
# Override the setup script of stdenv. Useful for testing new
|
|
|
|
|
# versions of the setup script without causing a rebuild of
|
|
|
|
|
# everything.
|
|
|
|
|
#
|
|
|
|
|
# Example:
|
|
|
|
|
# randomPkg = import ../bla { ...
|
|
|
|
|
# stdenv = overrideSetup stdenv ../stdenv/generic/setup-latest.sh;
|
|
|
|
|
# };
|
2014-02-04 16:18:38 +00:00
|
|
|
|
overrideSetup = stdenv: setupScript: stdenv.override { inherit setupScript; };
|
2009-02-10 15:48:30 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Return a modified stdenv that tries to build statically linked
|
|
|
|
|
# binaries.
|
2021-08-17 01:16:29 +00:00
|
|
|
|
makeStaticBinaries = stdenv0:
|
|
|
|
|
stdenv0.override (old: {
|
|
|
|
|
mkDerivationFromStdenv = withOldMkDerivation old (stdenv: mkDerivationSuper: args:
|
|
|
|
|
if stdenv.hostPlatform.isDarwin
|
2018-12-05 03:12:17 +00:00
|
|
|
|
then throw "Cannot build fully static binaries on Darwin/macOS"
|
2024-08-03 11:10:26 +00:00
|
|
|
|
else (mkDerivationSuper args).overrideAttrs (args: if args ? env.NIX_CFLAGS_LINK then {
|
|
|
|
|
env = args.env // {
|
|
|
|
|
NIX_CFLAGS_LINK = toString args.env.NIX_CFLAGS_LINK + " -static";
|
|
|
|
|
};
|
|
|
|
|
} else {
|
2024-08-07 06:49:01 +00:00
|
|
|
|
NIX_CFLAGS_LINK = toString (args.NIX_CFLAGS_LINK or "") + " -static";
|
2023-09-03 17:27:49 +00:00
|
|
|
|
} // lib.optionalAttrs (!(args.dontAddStaticConfigureFlags or false)) {
|
|
|
|
|
configureFlags = (args.configureFlags or []) ++ [
|
|
|
|
|
"--disable-shared" # brrr...
|
|
|
|
|
];
|
|
|
|
|
cmakeFlags = (args.cmakeFlags or []) ++ ["-DCMAKE_SKIP_INSTALL_RPATH=On"];
|
2021-08-17 01:16:29 +00:00
|
|
|
|
}));
|
2023-07-19 19:56:18 +00:00
|
|
|
|
} // lib.optionalAttrs (stdenv0.hostPlatform.libc == "glibc") {
|
2021-08-17 01:16:29 +00:00
|
|
|
|
extraBuildInputs = (old.extraBuildInputs or []) ++ [
|
2022-05-23 18:28:14 +00:00
|
|
|
|
pkgs.glibc.static
|
2021-08-17 01:16:29 +00:00
|
|
|
|
];
|
|
|
|
|
});
|
2009-02-10 15:48:30 +00:00
|
|
|
|
|
2012-10-31 12:41:54 +00:00
|
|
|
|
|
2011-12-14 14:31:56 +00:00
|
|
|
|
# Return a modified stdenv that builds static libraries instead of
|
|
|
|
|
# shared libraries.
|
2021-08-17 01:16:29 +00:00
|
|
|
|
makeStaticLibraries = stdenv:
|
|
|
|
|
stdenv.override (old: {
|
|
|
|
|
mkDerivationFromStdenv = extendMkDerivationArgs old (args: {
|
2010-01-21 21:42:17 +00:00
|
|
|
|
dontDisableStatic = true;
|
2021-08-17 01:16:29 +00:00
|
|
|
|
} // lib.optionalAttrs (!(args.dontAddStaticConfigureFlags or false)) {
|
2018-08-03 16:36:51 +00:00
|
|
|
|
configureFlags = (args.configureFlags or []) ++ [
|
|
|
|
|
"--enable-static"
|
|
|
|
|
"--disable-shared"
|
|
|
|
|
];
|
2019-12-29 20:40:52 +00:00
|
|
|
|
cmakeFlags = (args.cmakeFlags or []) ++ [ "-DBUILD_SHARED_LIBS:BOOL=OFF" ];
|
2019-05-09 01:52:59 +00:00
|
|
|
|
mesonFlags = (args.mesonFlags or []) ++ [ "-Ddefault_library=static" ];
|
2010-01-21 21:42:17 +00:00
|
|
|
|
});
|
2021-08-17 01:16:29 +00:00
|
|
|
|
});
|
2010-01-21 21:42:17 +00:00
|
|
|
|
|
2021-08-19 17:56:53 +00:00
|
|
|
|
# Best effort static binaries. Will still be linked to libSystem,
|
|
|
|
|
# but more portable than Nix store binaries.
|
|
|
|
|
makeStaticDarwin = stdenv: stdenv.override (old: {
|
|
|
|
|
# extraBuildInputs are dropped in cross.nix, but darwin still needs them
|
|
|
|
|
extraBuildInputs = [ pkgs.buildPackages.darwin.CF ];
|
2023-06-07 00:03:05 +00:00
|
|
|
|
mkDerivationFromStdenv = withOldMkDerivation old (stdenv: mkDerivationSuper: args:
|
2024-03-21 12:51:50 +00:00
|
|
|
|
(mkDerivationSuper args).overrideAttrs (prevAttrs: {
|
|
|
|
|
NIX_CFLAGS_LINK = toString (prevAttrs.NIX_CFLAGS_LINK or "")
|
2021-08-19 17:56:53 +00:00
|
|
|
|
+ lib.optionalString (stdenv.cc.isGNU or false) " -static-libgcc";
|
2024-03-21 12:51:50 +00:00
|
|
|
|
nativeBuildInputs = (prevAttrs.nativeBuildInputs or [])
|
2023-07-04 01:20:17 +00:00
|
|
|
|
++ lib.optionals stdenv.hasCC [
|
2023-06-07 00:03:05 +00:00
|
|
|
|
(pkgs.buildPackages.makeSetupHook {
|
|
|
|
|
name = "darwin-portable-libSystem-hook";
|
|
|
|
|
substitutions = {
|
|
|
|
|
libsystem = "${stdenv.cc.libc}/lib/libSystem.B.dylib";
|
2023-07-09 00:57:24 +00:00
|
|
|
|
targetPrefix = stdenv.cc.bintools.targetPrefix;
|
2023-06-07 00:03:05 +00:00
|
|
|
|
};
|
|
|
|
|
} ./darwin/portable-libsystem.sh)
|
|
|
|
|
];
|
|
|
|
|
}));
|
2021-08-19 17:56:53 +00:00
|
|
|
|
});
|
|
|
|
|
|
2021-08-20 06:03:45 +00:00
|
|
|
|
# Puts all the other ones together
|
|
|
|
|
makeStatic = stdenv: lib.foldl (lib.flip lib.id) stdenv (
|
|
|
|
|
lib.optional stdenv.hostPlatform.isDarwin makeStaticDarwin
|
|
|
|
|
|
|
|
|
|
++ [ makeStaticLibraries propagateBuildInputs ]
|
|
|
|
|
|
|
|
|
|
# Apple does not provide a static version of libSystem or crt0.o
|
|
|
|
|
# So we can’t build static binaries without extensive hacks.
|
|
|
|
|
++ lib.optional (!stdenv.hostPlatform.isDarwin) makeStaticBinaries
|
|
|
|
|
);
|
|
|
|
|
|
2019-07-24 14:04:51 +00:00
|
|
|
|
|
|
|
|
|
/* Modify a stdenv so that all buildInputs are implicitly propagated to
|
|
|
|
|
consuming derivations
|
|
|
|
|
*/
|
2021-08-17 01:16:29 +00:00
|
|
|
|
propagateBuildInputs = stdenv:
|
|
|
|
|
stdenv.override (old: {
|
|
|
|
|
mkDerivationFromStdenv = extendMkDerivationArgs old (args: {
|
2019-07-24 14:04:51 +00:00
|
|
|
|
propagatedBuildInputs = (args.propagatedBuildInputs or []) ++ (args.buildInputs or []);
|
|
|
|
|
buildInputs = [];
|
|
|
|
|
});
|
2021-08-17 01:16:29 +00:00
|
|
|
|
});
|
2019-07-24 14:04:51 +00:00
|
|
|
|
|
|
|
|
|
|
2009-03-30 13:22:19 +00:00
|
|
|
|
/* Modify a stdenv so that the specified attributes are added to
|
|
|
|
|
every derivation returned by its mkDerivation function.
|
|
|
|
|
|
|
|
|
|
Example:
|
|
|
|
|
stdenvNoOptimise =
|
|
|
|
|
addAttrsToDerivation
|
2023-02-19 19:23:32 +00:00
|
|
|
|
{ env.NIX_CFLAGS_COMPILE = "-O0"; }
|
2009-03-30 13:22:19 +00:00
|
|
|
|
stdenv;
|
|
|
|
|
*/
|
2021-08-17 01:16:29 +00:00
|
|
|
|
addAttrsToDerivation = extraAttrs: stdenv: stdenv.override (old: {
|
|
|
|
|
mkDerivationFromStdenv = extendMkDerivationArgs old (_: extraAttrs);
|
|
|
|
|
});
|
2009-03-30 13:22:19 +00:00
|
|
|
|
|
|
|
|
|
|
2009-11-21 17:50:00 +00:00
|
|
|
|
/* Use the trace output to report all processed derivations with their
|
|
|
|
|
license name.
|
|
|
|
|
*/
|
2021-08-17 01:16:29 +00:00
|
|
|
|
traceDrvLicenses = stdenv:
|
|
|
|
|
stdenv.override (old: {
|
|
|
|
|
mkDerivationFromStdenv = overrideMkDerivationResult (pkg:
|
2009-11-21 17:50:00 +00:00
|
|
|
|
let
|
|
|
|
|
printDrvPath = val: let
|
|
|
|
|
drvPath = builtins.unsafeDiscardStringContext pkg.drvPath;
|
2012-12-28 18:35:35 +00:00
|
|
|
|
license = pkg.meta.license or null;
|
2009-11-21 17:50:00 +00:00
|
|
|
|
in
|
2012-12-28 18:35:35 +00:00
|
|
|
|
builtins.trace "@:drv:${toString drvPath}:${builtins.toString license}:@" val;
|
2009-11-21 17:50:00 +00:00
|
|
|
|
in pkg // {
|
|
|
|
|
outPath = printDrvPath pkg.outPath;
|
|
|
|
|
drvPath = printDrvPath pkg.drvPath;
|
2021-08-17 01:16:29 +00:00
|
|
|
|
});
|
|
|
|
|
});
|
2009-11-22 17:04:33 +00:00
|
|
|
|
|
2012-10-31 12:41:54 +00:00
|
|
|
|
|
|
|
|
|
/* Modify a stdenv so that it produces debug builds; that is,
|
|
|
|
|
binaries have debug info, and compiler optimisations are
|
|
|
|
|
disabled. */
|
2021-08-17 01:16:29 +00:00
|
|
|
|
keepDebugInfo = stdenv:
|
|
|
|
|
stdenv.override (old: {
|
|
|
|
|
mkDerivationFromStdenv = extendMkDerivationArgs old (args: {
|
2012-10-31 12:41:54 +00:00
|
|
|
|
dontStrip = true;
|
2023-04-12 18:27:34 +00:00
|
|
|
|
env = (args.env or {}) // { NIX_CFLAGS_COMPILE = toString (args.env.NIX_CFLAGS_COMPILE or "") + " -ggdb -Og"; };
|
2012-10-31 12:41:54 +00:00
|
|
|
|
});
|
2021-08-17 01:16:29 +00:00
|
|
|
|
});
|
2012-10-31 12:41:54 +00:00
|
|
|
|
|
2014-02-04 15:58:12 +00:00
|
|
|
|
|
2014-10-10 12:01:38 +00:00
|
|
|
|
/* Modify a stdenv so that it uses the Gold linker. */
|
2021-08-17 01:16:29 +00:00
|
|
|
|
useGoldLinker = stdenv:
|
|
|
|
|
stdenv.override (old: {
|
|
|
|
|
mkDerivationFromStdenv = extendMkDerivationArgs old (args: {
|
2015-05-04 12:00:12 +00:00
|
|
|
|
NIX_CFLAGS_LINK = toString (args.NIX_CFLAGS_LINK or "") + " -fuse-ld=gold";
|
2014-10-10 12:01:38 +00:00
|
|
|
|
});
|
2021-08-17 01:16:29 +00:00
|
|
|
|
});
|
2018-03-21 22:22:05 +00:00
|
|
|
|
|
2024-01-17 18:03:33 +00:00
|
|
|
|
/* Copy the libstdc++ from the model stdenv to the target stdenv.
|
|
|
|
|
*
|
|
|
|
|
* TODO(@connorbaker):
|
|
|
|
|
* This interface provides behavior which should be revisited prior to the
|
|
|
|
|
* release of 24.05. For a more detailed explanation and discussion, see
|
|
|
|
|
* https://github.com/NixOS/nixpkgs/issues/283517. */
|
2024-01-11 00:25:59 +00:00
|
|
|
|
useLibsFrom = modelStdenv: targetStdenv:
|
|
|
|
|
let
|
|
|
|
|
ccForLibs = modelStdenv.cc.cc;
|
2024-01-17 18:03:33 +00:00
|
|
|
|
/* NOTE(@connorbaker):
|
|
|
|
|
* This assumes targetStdenv.cc is a cc-wrapper. */
|
|
|
|
|
cc = targetStdenv.cc.override {
|
2024-01-11 00:25:59 +00:00
|
|
|
|
/* NOTE(originally by rrbutani):
|
|
|
|
|
* Normally the `useCcForLibs`/`gccForLibs` mechanism is used to get a
|
|
|
|
|
* clang based `cc` to use `libstdc++` (from gcc).
|
|
|
|
|
*
|
|
|
|
|
* Here we (ab)use it to use a `libstdc++` from a different `gcc` than our
|
|
|
|
|
* `cc`.
|
|
|
|
|
*
|
|
|
|
|
* Note that this does not inhibit our `cc`'s lib dir from being added to
|
|
|
|
|
* cflags/ldflags (see `cc_solib` in `cc-wrapper`) but this is okay: our
|
|
|
|
|
* `gccForLibs`'s paths should take precedence. */
|
|
|
|
|
useCcForLibs = true;
|
|
|
|
|
gccForLibs = ccForLibs;
|
|
|
|
|
};
|
|
|
|
|
in
|
|
|
|
|
overrideCC targetStdenv cc;
|
|
|
|
|
|
2023-02-17 03:18:19 +00:00
|
|
|
|
useMoldLinker = stdenv: let
|
|
|
|
|
bintools = stdenv.cc.bintools.override {
|
|
|
|
|
extraBuildCommands = ''
|
2023-10-13 00:35:26 +00:00
|
|
|
|
wrap ${stdenv.cc.bintools.targetPrefix}ld.mold ${../build-support/bintools-wrapper/ld-wrapper.sh} ${pkgs.mold}/bin/ld.mold
|
|
|
|
|
wrap ${stdenv.cc.bintools.targetPrefix}ld ${../build-support/bintools-wrapper/ld-wrapper.sh} ${pkgs.mold}/bin/ld.mold
|
2023-02-17 03:18:19 +00:00
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
in stdenv.override (old: {
|
2023-10-19 12:48:42 +00:00
|
|
|
|
allowedRequisites = null;
|
|
|
|
|
cc = stdenv.cc.override { inherit bintools; };
|
|
|
|
|
# gcc >12.1.0 supports '-fuse-ld=mold'
|
|
|
|
|
# the wrap ld above in bintools supports gcc <12.1.0 and shouldn't harm >12.1.0
|
2023-02-17 03:18:19 +00:00
|
|
|
|
# https://github.com/rui314/mold#how-to-use
|
|
|
|
|
} // lib.optionalAttrs (stdenv.cc.isClang || (stdenv.cc.isGNU && lib.versionAtLeast stdenv.cc.version "12")) {
|
|
|
|
|
mkDerivationFromStdenv = extendMkDerivationArgs old (args: {
|
|
|
|
|
NIX_CFLAGS_LINK = toString (args.NIX_CFLAGS_LINK or "") + " -fuse-ld=mold";
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
2018-03-21 22:22:05 +00:00
|
|
|
|
|
|
|
|
|
/* Modify a stdenv so that it builds binaries optimized specifically
|
|
|
|
|
for the machine they are built on.
|
|
|
|
|
|
|
|
|
|
WARNING: this breaks purity! */
|
2021-08-17 01:16:29 +00:00
|
|
|
|
impureUseNativeOptimizations = stdenv:
|
|
|
|
|
stdenv.override (old: {
|
|
|
|
|
mkDerivationFromStdenv = extendMkDerivationArgs old (args: {
|
2023-04-12 18:27:34 +00:00
|
|
|
|
env = (args.env or {}) // { NIX_CFLAGS_COMPILE = toString (args.env.NIX_CFLAGS_COMPILE or "") + " -march=native"; };
|
2023-04-11 18:25:52 +00:00
|
|
|
|
|
2018-03-21 22:22:05 +00:00
|
|
|
|
NIX_ENFORCE_NO_NATIVE = false;
|
|
|
|
|
|
|
|
|
|
preferLocalBuild = true;
|
|
|
|
|
allowSubstitutes = false;
|
|
|
|
|
});
|
2021-08-17 01:16:29 +00:00
|
|
|
|
});
|
2021-08-24 09:17:22 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Modify a stdenv so that it builds binaries with the specified list of
|
|
|
|
|
compilerFlags appended and passed to the compiler.
|
|
|
|
|
|
|
|
|
|
This example would recompile every derivation on the system with
|
|
|
|
|
-funroll-loops and -O3 passed to each gcc invocation.
|
|
|
|
|
|
|
|
|
|
Example:
|
|
|
|
|
nixpkgs.overlays = [
|
|
|
|
|
(self: super: {
|
|
|
|
|
stdenv = super.withCFlags [ "-funroll-loops" "-O3" ] super.stdenv;
|
|
|
|
|
})
|
|
|
|
|
];
|
|
|
|
|
*/
|
|
|
|
|
withCFlags = compilerFlags: stdenv:
|
|
|
|
|
stdenv.override (old: {
|
|
|
|
|
mkDerivationFromStdenv = extendMkDerivationArgs old (args: {
|
2023-04-12 18:27:34 +00:00
|
|
|
|
env = (args.env or {}) // { NIX_CFLAGS_COMPILE = toString (args.env.NIX_CFLAGS_COMPILE or "") + " ${toString compilerFlags}"; };
|
2021-08-24 09:17:22 +00:00
|
|
|
|
});
|
|
|
|
|
});
|
2023-10-26 05:04:35 +00:00
|
|
|
|
|
|
|
|
|
# Overriding the SDK changes the Darwin SDK used to build the package, which:
|
|
|
|
|
# * Ensures that the compiler and bintools have the correct Libsystem version; and
|
|
|
|
|
# * Replaces any SDK references with those in the SDK corresponding to the requested SDK version.
|
|
|
|
|
#
|
|
|
|
|
# `sdkVersion` can be any of the following:
|
|
|
|
|
# * A version string indicating the requested SDK version; or
|
|
|
|
|
# * An attrset consisting of either or both of the following fields: darwinSdkVersion and darwinMinVersion.
|
2024-02-03 18:18:59 +00:00
|
|
|
|
overrideSDK = import ./darwin/override-sdk.nix {
|
|
|
|
|
inherit lib extendMkDerivationArgs;
|
|
|
|
|
inherit (pkgs)
|
|
|
|
|
stdenvNoCC
|
|
|
|
|
pkgsBuildBuild
|
|
|
|
|
pkgsBuildHost
|
|
|
|
|
pkgsBuildTarget
|
|
|
|
|
pkgsHostHost
|
|
|
|
|
pkgsHostTarget
|
|
|
|
|
pkgsTargetTarget;
|
|
|
|
|
};
|
2023-10-04 21:34:13 +00:00
|
|
|
|
|
|
|
|
|
withDefaultHardeningFlags = defaultHardeningFlags: stdenv: let
|
|
|
|
|
bintools = let
|
|
|
|
|
bintools' = stdenv.cc.bintools;
|
|
|
|
|
in if bintools' ? override then (bintools'.override {
|
|
|
|
|
inherit defaultHardeningFlags;
|
|
|
|
|
}) else bintools';
|
|
|
|
|
in
|
|
|
|
|
stdenv.override (old: {
|
|
|
|
|
cc = if stdenv.cc == null then null else stdenv.cc.override {
|
|
|
|
|
inherit bintools;
|
|
|
|
|
};
|
|
|
|
|
allowedRequisites = lib.mapNullable (rs: rs ++ [ bintools ]) (stdenv.allowedRequisites or null);
|
|
|
|
|
});
|
2009-03-30 13:22:19 +00:00
|
|
|
|
}
|