| # Copyright 2018 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. | 
 | """Configure the shell toolchain on the local machine.""" | 
 |  | 
 | def _is_windows(repository_ctx): | 
 |     """Returns true if the host OS is Windows.""" | 
 |     return repository_ctx.os.name.startswith("windows") | 
 |  | 
 | def _sh_config_impl(repository_ctx): | 
 |     """sh_config rule implementation. | 
 |  | 
 |     Detects the path of the shell interpreter on the local machine and | 
 |     stores it in a sh_toolchain rule. | 
 |  | 
 |     Args: | 
 |       repository_ctx: the repository rule context object | 
 |     """ | 
 |     sh_path = repository_ctx.os.environ.get("BAZEL_SH") | 
 |     if not sh_path: | 
 |         if _is_windows(repository_ctx): | 
 |             sh_path = repository_ctx.which("bash.exe") | 
 |             if sh_path: | 
 |                 # When the Windows Subsystem for Linux is installed there's a | 
 |                 # bash.exe under %WINDIR%\system32\bash.exe that launches Ubuntu | 
 |                 # Bash which cannot run native Windows programs so it's not what | 
 |                 # we want. | 
 |                 windir = repository_ctx.os.environ.get("WINDIR") | 
 |                 if windir and sh_path.startswith(windir): | 
 |                     sh_path = None | 
 |         else: | 
 |             sh_path = repository_ctx.which("bash") | 
 |             if not sh_path: | 
 |                 sh_path = repository_ctx.which("sh") | 
 |  | 
 |     if not sh_path: | 
 |         sh_path = "" | 
 |  | 
 |     if sh_path and _is_windows(repository_ctx): | 
 |         sh_path = sh_path.replace("\\", "/") | 
 |  | 
 |     repository_ctx.file("BUILD", """ | 
 | load("@bazel_tools//tools/sh:sh_toolchain.bzl", "sh_toolchain") | 
 |  | 
 | sh_toolchain( | 
 |     name = "local_sh", | 
 |     path = "{sh_path}", | 
 |     visibility = ["//visibility:public"], | 
 | ) | 
 |  | 
 | toolchain( | 
 |     name = "local_sh_toolchain", | 
 |     toolchain = ":local_sh", | 
 |     toolchain_type = "@bazel_tools//tools/sh:toolchain_type", | 
 | ) | 
 | """.format(sh_path = sh_path)) | 
 |  | 
 | sh_config = repository_rule( | 
 |     environ = [ | 
 |         "WINDIR", | 
 |         "PATH", | 
 |     ], | 
 |     local = True, | 
 |     implementation = _sh_config_impl, | 
 | ) | 
 |  | 
 | def sh_configure(): | 
 |     """Detect the local shell interpreter and register its toolchain.""" | 
 |     sh_config(name = "local_config_sh") | 
 |     native.register_toolchains("@local_config_sh//:local_sh_toolchain") |