diff options
author | Nikolay Amiantov <ab@fmap.me> | 2017-11-10 20:06:26 +0300 |
---|---|---|
committer | Nikolay Amiantov <ab@fmap.me> | 2018-02-20 20:39:49 +0300 |
commit | 430e0f4a802fa8792accca58f03e011120b94c4e (patch) | |
tree | 811b9957415f76a9974ca39cf1593e2c2794bfd3 /pkgs/build-support/build-bazel-package | |
parent | a1526e52b153d85fa6291b1d94d64434ee438708 (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.nix | 78 |
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 + ''; +}) |