summary refs log tree commit diff
path: root/pkgs/build-support/build-bazel-package
diff options
context:
space:
mode:
authorNikolay Amiantov <ab@fmap.me>2017-11-10 20:06:26 +0300
committerNikolay Amiantov <ab@fmap.me>2018-02-20 20:39:49 +0300
commit430e0f4a802fa8792accca58f03e011120b94c4e (patch)
tree811b9957415f76a9974ca39cf1593e2c2794bfd3 /pkgs/build-support/build-bazel-package
parenta1526e52b153d85fa6291b1d94d64434ee438708 (diff)
downloadnixpkgs-430e0f4a802fa8792accca58f03e011120b94c4e.tar
nixpkgs-430e0f4a802fa8792accca58f03e011120b94c4e.tar.gz
nixpkgs-430e0f4a802fa8792accca58f03e011120b94c4e.tar.bz2
nixpkgs-430e0f4a802fa8792accca58f03e011120b94c4e.tar.lz
nixpkgs-430e0f4a802fa8792accca58f03e011120b94c4e.tar.xz
nixpkgs-430e0f4a802fa8792accca58f03e011120b94c4e.tar.zst
nixpkgs-430e0f4a802fa8792accca58f03e011120b94c4e.zip
buildBazelPackage: init
A separate function for building Bazel-bazed packages. Internally it splits the
build into two phases, fetching and building.

Users are expected to provide `fetchArgs.sha256` -- checksum of fetched
dependencies. Local dependencies should be removed in `fetchArgs.preInstall`.
Overall `fetchArgs` and `buildArgs` can be used to add specific steps to fetch
and build.
Diffstat (limited to 'pkgs/build-support/build-bazel-package')
-rw-r--r--pkgs/build-support/build-bazel-package/default.nix78
1 files changed, 78 insertions, 0 deletions
diff --git a/pkgs/build-support/build-bazel-package/default.nix b/pkgs/build-support/build-bazel-package/default.nix
new file mode 100644
index 00000000000..349a7e5aa33
--- /dev/null
+++ b/pkgs/build-support/build-bazel-package/default.nix
@@ -0,0 +1,78 @@
+{ stdenv, bazel }:
+
+args@{ name, bazelFlags ? [], bazelTarget, buildAttrs, fetchAttrs, ... }:
+
+let
+  fArgs = removeAttrs args [ "buildAttrs" "fetchAttrs" ];
+  fBuildAttrs = fArgs // buildAttrs;
+  fFetchAttrs = fArgs // removeAttrs fetchAttrs [ "sha256" ];
+
+in stdenv.mkDerivation (fBuildAttrs // {
+  inherit name bazelFlags bazelTarget;
+
+  deps = stdenv.mkDerivation (fFetchAttrs // {
+    name = "${name}-deps";
+    inherit bazelFlags bazelTarget;
+
+    nativeBuildInputs = fFetchAttrs.nativeBuildInputs or [] ++ [ bazel ];
+
+    preHook = fFetchAttrs.preHook or "" + ''
+      export bazelOut="$NIX_BUILD_TOP/output"
+      export HOME="$NIX_BUILD_TOP"
+    '';
+
+    buildPhase = fFetchAttrs.buildPhase or ''
+      runHook preBuild
+
+      bazel --output_base="$bazelOut" fetch $bazelFlags $bazelTarget
+
+      runHook postBuild
+    '';
+
+    installPhase = fFetchAttrs.installPhase or ''
+      runHook preInstall
+
+      # Patching markers to make them deterministic
+      for i in $bazelOut/external/\@*.marker; do
+        sed -i 's, -\?[0-9][0-9]*$, 1,' "$i"
+      done
+      # Patching symlinks to remove build directory reference
+      find $bazelOut/external -type l | while read symlink; do
+        ln -sf $(readlink "$symlink" | sed "s,$NIX_BUILD_TOP,NIX_BUILD_TOP,") "$symlink"
+      done
+
+      cp -r $bazelOut/external $out
+
+      runHook postInstall
+    '';
+
+    dontFixup = true;
+    outputHashMode = "recursive";
+    outputHashAlgo = "sha256";
+    outputHash = fetchAttrs.sha256;
+  });
+
+  nativeBuildInputs = fBuildAttrs.nativeBuildInputs or [] ++ [ (bazel.override { enableNixHacks = true; }) ];
+
+  preHook = fBuildAttrs.preHook or "" + ''
+    export bazelOut="$NIX_BUILD_TOP/output"
+    export HOME="$NIX_BUILD_TOP"
+  '';
+
+  preConfigure = ''
+    mkdir -p $bazelOut/external
+    cp -r $deps/* $bazelOut/external
+    chmod -R +w $bazelOut
+    find $bazelOut -type l | while read symlink; do
+      ln -sf $(readlink "$symlink" | sed "s,NIX_BUILD_TOP,$NIX_BUILD_TOP,") "$symlink"
+    done
+  '' + fBuildAttrs.preConfigure or "";
+
+  buildPhase = fBuildAttrs.buildPhase or ''
+    runHook preBuild
+
+    bazel --output_base="$bazelOut" build -j $NIX_BUILD_CORES $bazelFlags $bazelTarget
+
+    runHook postBuild
+  '';
+})