# 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")