summaryrefslogtreecommitdiffstats
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)
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 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;
+ };
+ };
+
+}