summary refs log tree commit diff
path: root/pkgs/top-level/static.nix
diff options
context:
space:
mode:
authorMatthew Bauer <mjbauer95@gmail.com>2018-12-04 21:17:22 -0600
committerJohn Ericson <John.Ericson@Obsidian.Systems>2018-12-13 14:04:34 -0500
commit3c36dccd7ca4bcc3a3899e794864780dc7a4ce8c (patch)
tree235b0341a48179e914779ad4233ea2031886d05a /pkgs/top-level/static.nix
parent3170d617ef7618a27cacf2eabac3ce3ea9d5a7c4 (diff)
downloadnixpkgs-3c36dccd7ca4bcc3a3899e794864780dc7a4ce8c.tar
nixpkgs-3c36dccd7ca4bcc3a3899e794864780dc7a4ce8c.tar.gz
nixpkgs-3c36dccd7ca4bcc3a3899e794864780dc7a4ce8c.tar.bz2
nixpkgs-3c36dccd7ca4bcc3a3899e794864780dc7a4ce8c.tar.lz
nixpkgs-3c36dccd7ca4bcc3a3899e794864780dc7a4ce8c.tar.xz
nixpkgs-3c36dccd7ca4bcc3a3899e794864780dc7a4ce8c.tar.zst
nixpkgs-3c36dccd7ca4bcc3a3899e794864780dc7a4ce8c.zip
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.nix150
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 00000000000..687e38dcc3a
--- /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;
+    };
+  };
+
+}