diff options
author | Matthew Bauer <mjbauer95@gmail.com> | 2018-12-04 21:17:22 -0600 |
---|---|---|
committer | John Ericson <John.Ericson@Obsidian.Systems> | 2018-12-13 14:04:34 -0500 |
commit | 3c36dccd7ca4bcc3a3899e794864780dc7a4ce8c (patch) | |
tree | 235b0341a48179e914779ad4233ea2031886d05a /pkgs/top-level/static.nix | |
parent | 3170d617ef7618a27cacf2eabac3ce3ea9d5a7c4 (diff) |
top-level/stage.nix: add static overlay
Adds the static overlay that can be used to build Nixpkgs statically.
Can be used like:
nix build pkgsStatic.hello
Not all packages build, as some rely on dynamic linking.
(cherry picked from commit 6d90a8b8948185a3118faf183f29f4b8de294675)
Diffstat (limited to 'pkgs/top-level/static.nix')
-rw-r--r-- | pkgs/top-level/static.nix | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/pkgs/top-level/static.nix b/pkgs/top-level/static.nix new file mode 100644 index 000000000000..687e38dcc3aa --- /dev/null +++ b/pkgs/top-level/static.nix @@ -0,0 +1,150 @@ +# 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 + overrideInStdenv + makeStaticLibraries; + inherit (super.lib) foldl optional flip id optionalAttrs composeExtensions; + inherit (super) makeSetupHook; + + # Best effort static binaries. Will still be linked to libSystem, + # but more portable than Nix store binaries. + makeStaticDarwin = stdenv: stdenv // { + mkDerivation = args: stdenv.mkDerivation (args // { + NIX_CFLAGS_LINK = toString (args.NIX_CFLAGS_LINK or "") + + " -static-libgcc"; + nativeBuildInputs = (args.nativeBuildInputs or []) ++ [ (makeSetupHook { + substitutions = { + libsystem = "${stdenv.cc.libc}/lib/libSystem.B.dylib"; + }; + } ../stdenv/darwin/portable-libsystem.sh) ]; + }); + }; + + staticAdapters = [ makeStaticLibraries ] + + # Apple does not provide a static version of libSystem or crt0.o + # So we can’t build static binaries without extensive hacks. + ++ optional (!super.stdenv.hostPlatform.isDarwin) makeStaticBinaries + + ++ optional super.stdenv.hostPlatform.isDarwin makeStaticDarwin + + # Glibc doesn’t come with static runtimes by default. + # ++ optional (super.stdenv.hostPlatform.libc == "glibc") ((flip overrideInStdenv) [ self.stdenv.glibc.static ]) + ; + + # Force everything to link statically. + haskellStaticAdapter = self: super: { + mkDerivation = attrs: super.mkDerivation (attrs // { + enableSharedLibraries = false; + enableSharedExecutables = false; + enableStaticLibraries = true; + }); + }; + +in { + stdenv = foldl (flip id) super.stdenv staticAdapters; + + haskell = super.haskell // { + packageOverrides = composeExtensions + (super.haskell.packageOverrides or (_: _: {})) + haskellStaticAdapter; + }; + + ncurses = super.ncurses.override { + enableStatic = true; + }; + libxml2 = super.libxml2.override { + enableShared = false; + enableStatic = true; + }; + zlib = super.zlib.override { + static = true; + shared = false; + + # Don’t use new stdenv zlib because + # it doesn’t like the --disable-shared flag + stdenv = super.stdenv; + }; + xz = super.xz.override { + enableStatic = true; + }; + busybox = super.busybox.override { + enableStatic = true; + }; + v8 = super.v8.override { + static = true; + }; + libiberty = super.libiberty.override { + staticBuild = true; + }; + ipmitool = super.ipmitool.override { + static = true; + }; + neon = super.neon.override { + static = true; + shared = false; + }; + libjpeg = super.libjpeg.override { + static = true; + }; + gifsicle = super.gifsicle.override { + static = true; + }; + bzip2 = super.bzip2.override { + linkStatic = true; + }; + optipng = super.optipng.override { + static = true; + }; + openssl = super.openssl.override { + static = true; + + # Don’t use new stdenv for openssl because it doesn’t like the + # --disable-shared flag + stdenv = super.stdenv; + }; + boost = super.boost.override { + enableStatic = true; + enableShared = false; + }; + gmp = super.gmp.override { + withStatic = true; + }; + cdo = super.cdo.override { + enable_all_static = true; + }; + gsm = super.gsm.override { + staticSupport = true; + }; + parted = super.parted.override { + enableStatic = true; + }; + libiconvReal = super.libiconvReal.override { + enableShared = false; + enableStatic = true; + }; + perl = super.perl.override { + # Don’t use new stdenv zlib because + # it doesn’t like the --disable-shared flag + stdenv = super.stdenv; + }; + + darwin = super.darwin // { + libiconv = super.darwin.libiconv.override { + enableShared = false; + enableStatic = true; + }; + }; + +} |