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 ]; + }