| # Copyright 2020 The Bazel Authors. All rights reserved. |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| |
| """Java repository implementation. |
| |
| Creates a local repository using jdk.BUILD file. |
| |
| When Java executable is not present it creates a BUILD file with target "jdk" |
| displaying an error message. |
| """ |
| |
| def _local_java_repository_impl(repository_ctx): |
| java_home = repository_ctx.attr.java_home |
| java_home_path = repository_ctx.path(java_home) |
| if not java_home_path.exists: |
| fail('The path indicated by the "java_home" attribute "%s" (absolute: "%s") ' + |
| "does not exist." % (java_home, str(java_home_path))) |
| |
| repository_ctx.file( |
| "WORKSPACE", |
| "# DO NOT EDIT: automatically generated WORKSPACE file for local_java_repository\n" + |
| "workspace(name = \"{name}\")\n".format(name = repository_ctx.name), |
| ) |
| |
| extension = ".exe" if repository_ctx.os.name.lower().find("windows") != -1 else "" |
| if java_home_path.get_child("bin").get_child("java" + extension).exists: |
| repository_ctx.file( |
| "BUILD.bazel", |
| repository_ctx.read(repository_ctx.path(repository_ctx.attr._build_file)), |
| False, |
| ) |
| |
| # Symlink all files |
| for file in repository_ctx.path(java_home).readdir(): |
| repository_ctx.symlink(file, file.basename) |
| |
| return |
| |
| # Java binary does not exist |
| # TODO(ilist): replace error message after toolchain implementation |
| repository_ctx.file( |
| "BUILD.bazel", |
| '''load("@bazel_tools//tools/jdk:fail_rule.bzl", "fail_rule") |
| |
| fail_rule( |
| name = "jdk", |
| header = "Auto-Configuration Error:", |
| message = ("Cannot find Java binary %s in %s; either correct your JAVA_HOME, " + |
| "PATH or specify embedded Java (e.g. " + |
| "--javabase=@bazel_tools//tools/jdk:remote_jdk11)") |
| )''' % ("bin/java" + extension, java_home), |
| False, |
| ) |
| |
| local_java_repository = repository_rule( |
| implementation = _local_java_repository_impl, |
| local = True, |
| configure = True, |
| attrs = { |
| "java_home": attr.string(), |
| "_build_file": attr.label(default = "@bazel_tools//tools/jdk:jdk.BUILD"), |
| }, |
| ) |