 a52f9a18bf
			
		
	
	
		a52f9a18bf
		
	
	
	
	
		
			
			We don't force `enableStaticLibraries` for Windows or WASM because it will just fail an assertion.
		
			
				
	
	
		
			120 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			120 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
| # 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 can’t build static binaries without extensive hacks.
 | ||
|     ++ optional (!super.stdenv.hostPlatform.isDarwin) makeStaticBinaries
 | ||
| 
 | ||
|     # Glibc doesn’t 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 {
 | ||
|     # Don’t use new stdenv zlib because
 | ||
|     # it doesn’t 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 {
 | ||
|     # Don’t use new stdenv for boost because it doesn’t like the
 | ||
|     # --disable-shared flag
 | ||
|     stdenv = super.stdenv;
 | ||
|   };
 | ||
|   perl = super.perl.override {
 | ||
|     # Don’t use new stdenv zlib because
 | ||
|     # it doesn’t 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;
 | ||
| }
 |