nixpkgs/pkgs/top-level/static.nix

120 lines
4.5 KiB
Nix
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# Overlay that builds static packages.
# Not all packages will build but support is done on a
# best effort basic.
#
# Note on Darwin/macOS: Apple does not provide a static libc
# so any attempts at static binaries are going to be very
# unsupported.
#
# Basic things like pkgsStatic.hello should work out of the box. More
# complicated things will need to be fixed with overrides.
self: super: let
inherit (super.stdenvAdapters) makeStaticBinaries
makeStaticLibraries
propagateBuildInputs;
inherit (super.lib) foldl optional flip id composeExtensions optionalAttrs optionalString;
inherit (super) makeSetupHook;
# Best effort static binaries. Will still be linked to libSystem,
# but more portable than Nix store binaries.
makeStaticDarwin = stdenv_: let stdenv = stdenv_.override {
# extraBuildInputs are dropped in cross.nix, but darwin still needs them
extraBuildInputs = [ self.buildPackages.darwin.CF ];
}; in stdenv // {
mkDerivation = args: stdenv.mkDerivation (args // {
NIX_CFLAGS_LINK = toString (args.NIX_CFLAGS_LINK or "")
+ optionalString stdenv.cc.isGNU " -static-libgcc";
nativeBuildInputs = (args.nativeBuildInputs or []) ++ [ (makeSetupHook {
substitutions = {
libsystem = "${stdenv.cc.libc}/lib/libSystem.B.dylib";
};
} ../stdenv/darwin/portable-libsystem.sh) ];
});
};
staticAdapters =
# makeStaticDarwin must go first so that the extraBuildInputs
# override does not recreate mkDerivation, removing subsequent
# adapters.
optional super.stdenv.hostPlatform.isDarwin makeStaticDarwin
++ [ makeStaticLibraries propagateBuildInputs ]
# Apple does not provide a static version of libSystem or crt0.o
# So we cant build static binaries without extensive hacks.
++ optional (!super.stdenv.hostPlatform.isDarwin) makeStaticBinaries
# Glibc doesnt come with static runtimes by default.
# ++ optional (super.stdenv.hostPlatform.libc == "glibc") ((flip overrideInStdenv) [ self.stdenv.glibc.static ])
;
removeUnknownConfigureFlags = f: with self.lib;
remove "--disable-shared"
(remove "--enable-static" f);
ocamlFixPackage = b:
b.overrideAttrs (o: {
configurePlatforms = [ ];
configureFlags = removeUnknownConfigureFlags (o.configureFlags or [ ]);
buildInputs = o.buildInputs ++ o.nativeBuildInputs or [ ];
propagatedNativeBuildInputs = o.propagatedBuildInputs or [ ];
});
ocamlStaticAdapter = _: super:
self.lib.mapAttrs
(_: p: if p ? overrideAttrs then ocamlFixPackage p else p)
super
// {
lablgtk = null; # Currently xlibs cause infinite recursion
ocaml = ((super.ocaml.override { useX11 = false; }).overrideAttrs (o: {
configurePlatforms = [ ];
dontUpdateAutotoolsGnuConfigScripts = true;
})).overrideDerivation (o: {
preConfigure = ''
configureFlagsArray+=("-cc" "$CC" "-as" "$AS" "-partialld" "$LD -r")
'';
configureFlags = (removeUnknownConfigureFlags o.configureFlags) ++ [
"--no-shared-libs"
"-host ${o.stdenv.hostPlatform.config}"
"-target ${o.stdenv.targetPlatform.config}"
];
});
};
in {
stdenv = foldl (flip id) super.stdenv staticAdapters;
gcc49Stdenv = foldl (flip id) super.gcc49Stdenv staticAdapters;
gcc6Stdenv = foldl (flip id) super.gcc6Stdenv staticAdapters;
gcc7Stdenv = foldl (flip id) super.gcc7Stdenv staticAdapters;
gcc8Stdenv = foldl (flip id) super.gcc8Stdenv staticAdapters;
gcc9Stdenv = foldl (flip id) super.gcc9Stdenv staticAdapters;
clangStdenv = foldl (flip id) super.clangStdenv staticAdapters;
libcxxStdenv = foldl (flip id) super.libcxxStdenv staticAdapters;
zlib = super.zlib.override {
# Dont use new stdenv zlib because
# it doesnt like the --disable-shared flag
stdenv = super.stdenv;
};
openssl = super.openssl_1_1.overrideAttrs (o: {
# OpenSSL doesn't like the `--enable-static` / `--disable-shared` flags.
configureFlags = (removeUnknownConfigureFlags o.configureFlags);
});
boost = super.boost.override {
# Dont use new stdenv for boost because it doesnt like the
# --disable-shared flag
stdenv = super.stdenv;
};
perl = super.perl.override {
# Dont use new stdenv zlib because
# it doesnt like the --disable-shared flag
stdenv = super.stdenv;
};
ocaml-ng = self.lib.mapAttrs (_: set:
if set ? overrideScope' then set.overrideScope' ocamlStaticAdapter else set
) super.ocaml-ng;
}