diff --git a/build.nix.sh b/build.nix.sh
new file mode 100755
index 0000000000000000000000000000000000000000..4b03ea8418daee9b93c4ada64cab0d000ef18b75
--- /dev/null
+++ b/build.nix.sh
@@ -0,0 +1,35 @@
+#!/usr/bin/env nix-shell
+#! nix-shell -i bash shell.nix
+
+# This script sets up the build environment by invoking nix-shell shell.nix
+# and then runs the hadrian executable.
+
+function rl {
+    TARGET_FILE="$1"
+
+    cd "$(dirname "$TARGET_FILE")"
+    TARGET_FILE="$(basename "$TARGET_FILE")"
+
+    # Iterate down a (possible) chain of symlinks
+    while [ -L "$TARGET_FILE" ]
+    do
+        TARGET_FILE="$(readlink "$TARGET_FILE")"
+        cd "$(dirname "$TARGET_FILE")"
+        TARGET_FILE="$(basename "$TARGET_FILE")"
+    done
+
+    # Compute the canonicalized name by finding the physical path
+    # for the directory we're in and appending the target file.
+    PHYS_DIR="$(pwd -P)"
+    RESULT="$PHYS_DIR/$TARGET_FILE"
+    echo "$RESULT"
+}
+
+absoluteRoot="$(dirname "$(rl "$0")")"
+echo $absoluteRoot
+cd "$absoluteRoot"
+
+hadrian         \
+  --lint                         \
+  --directory="$absoluteRoot/.." \
+  "$@"
diff --git a/shell.nix b/shell.nix
new file mode 100644
index 0000000000000000000000000000000000000000..e9a5ecc88e4d7ce31b32818a0721fedcacf29146
--- /dev/null
+++ b/shell.nix
@@ -0,0 +1,61 @@
+# Invoking nix-shell sets up an environment where we can build ghc
+# by only invoking hadrian.
+
+
+{ nixpkgs ? import <nixpkgs> {} }:
+
+let
+  haskellPackages = nixpkgs.haskell.packages.ghc821;
+
+  removeBuild = path: type:
+    let baseName = baseNameOf (toString path);
+    in
+        ! (baseName == "_build"
+           || baseName == "dist"
+           || baseName == "dist-newstyle"
+           || baseName == ".stack-work"
+           || baseName == "config.log"
+           || baseName == "config.status"
+           || nixpkgs.lib.hasSuffix ".sh" baseName
+           || !(nixpkgs.lib.cleanSourceFilter path type)) ;
+
+  filterSrc = path: builtins.filterSource removeBuild path;
+
+
+  hadrianPackages = nixpkgs.haskell.packages.ghc821.override {
+    overrides = self: super: let
+        localPackage = name: path: self.callCabal2nix name (filterSrc path) {};
+      in {
+        hadrian = localPackage "hadrian" ./. ;
+        shake = self.callHackage "shake" "0.16" {};
+        Cabal = localPackage "Cabal" ./../libraries/Cabal/Cabal ;
+        filepath = localPackage "filepath" ./../libraries/filepath ;
+        text = localPackage "text" ./../libraries/text  ;
+        hpc = localPackage"hpc" ./../libraries/hpc ;
+        parsec = localPackage "parsec" ./../libraries/parsec ;
+        HUnit = nixpkgs.haskell.lib.dontCheck (self.callHackage "HUnit" "1.3.1.2" {});
+        process = localPackage "process" ./../libraries/process ;
+        directory = localPackage "directory" ./../libraries/directory ;
+      }; };
+
+in
+
+  nixpkgs.stdenv.mkDerivation {
+    name = "ghc-dev";
+    buildInputs = [
+                    hadrianPackages.hadrian
+                    nixpkgs.haskell.compiler.ghc821
+                    haskellPackages.alex
+                    haskellPackages.happy
+                    nixpkgs.python3
+                    nixpkgs.git
+                    nixpkgs.autoconf
+                    nixpkgs.automake
+                    nixpkgs.perl
+                    nixpkgs.gcc
+                    nixpkgs.python3Packages.sphinx
+                    nixpkgs.ncurses
+                    nixpkgs.m4
+                    nixpkgs.gmp
+                    nixpkgs.file ];
+  }