summary refs log tree commit diff
path: root/pkgs/stdenv
diff options
context:
space:
mode:
authorEelco Dolstra <eelco.dolstra@logicblox.com>2009-02-10 15:48:30 +0000
committerEelco Dolstra <eelco.dolstra@logicblox.com>2009-02-10 15:48:30 +0000
commit0cf9849afd0db06dc70a938000b545099c06eb43 (patch)
tree4d0d5c4c45a4a33be9d70f6758f8c962f4cb001d /pkgs/stdenv
parentb2ccd56224a60e7ae4f5a6cb1b740ba3485fd3e0 (diff)
* More refactoring: move all the stdenv adapter functions (like
  useDietlibc) to a separate file.  all-packages.nix should really
  only contain package composition stuff.

svn path=/nixpkgs/trunk/; revision=14022
Diffstat (limited to 'pkgs/stdenv')
-rw-r--r--pkgs/stdenv/adapters.nix111
1 files changed, 111 insertions, 0 deletions
diff --git a/pkgs/stdenv/adapters.nix b/pkgs/stdenv/adapters.nix
new file mode 100644
index 0000000000000..ff4de11bc8b70
--- /dev/null
+++ b/pkgs/stdenv/adapters.nix
@@ -0,0 +1,111 @@
+/* This file contains various functions that take a stdenv and return
+   a new stdenv with different behaviour, e.g. using a different C
+   compiler. */
+
+{dietlibc, fetchurl, runCommand}:
+   
+   
+rec {
+
+
+  # Override the compiler in stdenv for specific packages.
+  overrideGCC = stdenv: gcc: stdenv //
+    { mkDerivation = args: stdenv.mkDerivation (args // { NIX_GCC = gcc; });
+    };
+
+    
+  # Add some arbitrary packages to buildInputs for specific packages.
+  # Used to override packages in stenv like Make.  Should not be used
+  # for other dependencies.
+  overrideInStdenv = stdenv: pkgs: stdenv //
+    { mkDerivation = args: stdenv.mkDerivation (args //
+        { buildInputs = (if args ? buildInputs then args.buildInputs else []) ++ pkgs; }
+      );
+    };
+
+
+  # Override the setup script of stdenv.  Useful for testing new
+  # versions of the setup script without causing a rebuild of
+  # everything.
+  #
+  # Example:
+  #   randomPkg = import ../bla { ...
+  #     stdenv = overrideSetup stdenv ../stdenv/generic/setup-latest.sh;
+  #   };
+  overrideSetup = stdenv: setup: stdenv.regenerate setup;
+
+
+  # Return a modified stdenv that uses dietlibc to create small
+  # statically linked binaries.
+  useDietLibC = stdenv: stdenv //
+    { mkDerivation = args: stdenv.mkDerivation (args // {
+        NIX_CFLAGS_LINK = "-static";
+
+        # libcompat.a contains some commonly used functions.
+        NIX_LDFLAGS = "-lcompat";
+
+        # These are added *after* the command-line flags, so we'll
+        # always optimise for size.
+        NIX_CFLAGS_COMPILE =
+          (if args ? NIX_CFLAGS_COMPILE then args.NIX_CFLAGS_COMPILE else "")
+          + " -Os -s -D_BSD_SOURCE=1";
+
+        configureFlags =
+          (if args ? configureFlags then args.configureFlags else "")
+          + " --disable-shared"; # brrr...
+
+        NIX_GCC = import ../build-support/gcc-wrapper {
+          inherit stdenv;
+          libc = dietlibc;
+          inherit (stdenv.gcc) gcc binutils name nativeTools nativePrefix;
+          nativeLibc = false;
+        };
+      });
+      isDietLibC = true;
+    } // {inherit fetchurl;};
+
+    
+  # Return a modified stdenv that uses klibc to create small
+  # statically linked binaries.
+  useKlibc = stdenv: klibc: stdenv //
+    { mkDerivation = args: stdenv.mkDerivation (args // {
+        NIX_CFLAGS_LINK = "-static";
+
+        # These are added *after* the command-line flags, so we'll
+        # always optimise for size.
+        NIX_CFLAGS_COMPILE =
+          (if args ? NIX_CFLAGS_COMPILE then args.NIX_CFLAGS_COMPILE else "")
+          + " -Os -s";
+
+        configureFlags =
+          (if args ? configureFlags then args.configureFlags else "")
+          + " --disable-shared"; # brrr...
+
+        NIX_GCC = runCommand "klibc-wrapper" {} ''
+          ensureDir $out/bin
+          ln -s ${klibc}/bin/klcc $out/bin/gcc
+          ln -s ${klibc}/bin/klcc $out/bin/cc
+          ensureDir $out/nix-support
+          echo 'PATH=$PATH:${stdenv.gcc.binutils}/bin' > $out/nix-support/setup-hook
+        '';
+      });
+      isKlibc = true;
+      isStatic = true;
+    } // {inherit fetchurl;};
+
+    
+  # Return a modified stdenv that tries to build statically linked
+  # binaries.
+  makeStaticBinaries = stdenv: stdenv //
+    { mkDerivation = args: stdenv.mkDerivation (args // {
+        NIX_CFLAGS_LINK = "-static";
+
+        configureFlags =
+          (if args ? configureFlags then args.configureFlags else "")
+          + " --disable-shared"; # brrr...
+      });
+      isStatic = true;
+    } // {inherit fetchurl;};
+
+      
+}
\ No newline at end of file