summaryrefslogtreecommitdiffstats
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)
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 000000000000..349a7e5aa333
--- /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
+ '';
+})