about summary refs log tree commit diff
path: root/pkgs/development/tools
diff options
context:
space:
mode:
authorUri Baghin <uri@canva.com>2018-07-10 08:38:45 +1000
committerOrivej Desh (NixOS) <40807862+orivej-nixos@users.noreply.github.com>2018-07-09 22:38:45 +0000
commited98822350926bd757d2e8ed89faf1bf1cf51473 (patch)
tree85e697eddcd147e8ad6a172b1daa601432311814 /pkgs/development/tools
parent547ef77aa748b076f0a62854da59239ab0230db6 (diff)
downloadnixlib-ed98822350926bd757d2e8ed89faf1bf1cf51473.tar
nixlib-ed98822350926bd757d2e8ed89faf1bf1cf51473.tar.gz
nixlib-ed98822350926bd757d2e8ed89faf1bf1cf51473.tar.bz2
nixlib-ed98822350926bd757d2e8ed89faf1bf1cf51473.tar.lz
nixlib-ed98822350926bd757d2e8ed89faf1bf1cf51473.tar.xz
nixlib-ed98822350926bd757d2e8ed89faf1bf1cf51473.tar.zst
nixlib-ed98822350926bd757d2e8ed89faf1bf1cf51473.zip
bazel-deps: init at 2018-05-31 (#43018)
Diffstat (limited to 'pkgs/development/tools')
-rw-r--r--pkgs/development/tools/build-managers/bazel/bazel-deps/default.nix80
1 files changed, 80 insertions, 0 deletions
diff --git a/pkgs/development/tools/build-managers/bazel/bazel-deps/default.nix b/pkgs/development/tools/build-managers/bazel/bazel-deps/default.nix
new file mode 100644
index 000000000000..76e2ad1e7cac
--- /dev/null
+++ b/pkgs/development/tools/build-managers/bazel/bazel-deps/default.nix
@@ -0,0 +1,80 @@
+{ stdenv, buildBazelPackage, lib, fetchFromGitHub, git, jre, makeWrapper }:
+
+buildBazelPackage rec {
+  name = "bazel-deps-${version}";
+  version = "2018-05-31";
+
+  meta = with stdenv.lib; {
+    homepage = "https://github.com/johnynek/bazel-deps";
+    description = "Generate bazel dependencies for maven artifacts";
+    license = licenses.mit;
+    maintainers = [ maintainers.uri-canva ];
+    platforms = platforms.all;
+  };
+
+  src = fetchFromGitHub {
+    owner = "johnynek";
+    repo = "bazel-deps";
+    rev = "dd7d0086d3a61c1d5c3370a0300824d0c75946e4";
+    sha256 = "1h9ddgk6vn0bhnnkwwz4n1iqv2rcdj521dxhdwj5wwpndbciw855";
+  };
+
+  bazelTarget = "//src/scala/com/github/johnynek/bazel_deps:parseproject_deploy.jar";
+
+  buildInputs = [ git makeWrapper ];
+
+  fetchAttrs = {
+    preInstall = ''
+      # Remove all built in external workspaces, Bazel will recreate them when building
+      rm -rf $bazelOut/external/{bazel_tools,\@bazel_tools.marker,local_*,\@local_*}
+      # For each external workspace, remove all files that aren't referenced by Bazel
+      # Many of these files are non-hermetic (for example .git/refs/remotes/origin/HEAD)
+      files_to_delete=()
+      for workspace in $(find $bazelOut/external -maxdepth 2 -name "WORKSPACE" -print0 | xargs -0L1 dirname); do
+        workspaceOut="$NIX_BUILD_TOP/workspaces/$(basename workspace)/output"
+        workspaceUserRoot="$NIX_BUILD_TOP/workspaces/$(basename workspace)/tmp"
+        rm -rf $workspace/.git
+        if ! targets_and_files=$(cd "$workspace" && bazel --output_base="$workspaceOut" --output_user_root="$workspaceUserRoot" query '//...:*' 2> /dev/null | sort -u); then
+          continue
+        fi
+        if ! targets=$(cd "$workspace" && bazel --output_base="$workspaceOut" --output_user_root="$workspaceUserRoot" query '//...:all' 2> /dev/null | sort -u); then
+          continue
+        fi
+        mapfile -t referenced_files < <(comm -23 <(printf '%s' "$targets_and_files") <(printf '%s' "$targets") | sed -e 's,^//:,,g' | sed -e 's,^//,,g' | sed -e 's,:,/,g')
+        referenced_files+=( "WORKSPACE" )
+        for referenced_file in "''${referenced_files[@]}"; do
+          # Some of the referenced files are symlinks to non-referenced files.
+          # The symlink targets have deterministic contents, but non-deterministic
+          # paths. Copy them to the referenced path, which is deterministic.
+          if target=$(readlink "$workspace/$referenced_file"); then
+            rm "$workspace/$referenced_file"
+            cp -a "$target" "$workspace/$referenced_file"
+          fi
+        done
+        mapfile -t workspace_files_to_delete < <(find "$workspace" -type f -or -type l | sort -u | comm -23 - <(printf "$workspace/%s\n" "''${referenced_files[@]}" | sort -u))
+        for workspace_file_to_delete in "''${workspace_files_to_delete[@]}"; do
+          files_to_delete+=("$workspace_file_to_delete")
+        done
+        # We're running bazel in many different workspaces in a loop. Letting the
+        # daemon shut down on its own would leave several daemons alive at the
+        # same time, using up a lot of memory. Shut them down explicitly instead.
+        bazel --output_base="$workspaceOut" --output_user_root="$workspaceUserRoot" shutdown 2> /dev/null
+      done
+      for file_to_delete in "''${files_to_delete[@]}"; do
+        rm "$file_to_delete"
+      done
+      find . -type d -empty -delete
+    '';
+
+    sha256 = "0fh9jjwk3aq0kklhl9zyy8hj8gjm1y1fy4ygjinm0469w9jdgc3g";
+  };
+
+  buildAttrs = {
+    installPhase = ''
+      mkdir -p $out/bin/bazel-bin/src/scala/com/github/johnynek/bazel_deps
+      cp gen_maven_deps.sh $out/bin
+      wrapProgram "$out/bin/gen_maven_deps.sh" --set JAVA_HOME "${jre}" --prefix PATH : ${lib.makeBinPath [ jre ]}
+      cp bazel-bin/src/scala/com/github/johnynek/bazel_deps/parseproject_deploy.jar $out/bin/bazel-bin/src/scala/com/github/johnynek/bazel_deps
+    '';
+  };
+}