blob: 28831ba669d3a4f799921e8280b2b559decf87bc [file] [log] [blame]
# 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:
# repository_ctx.which returns a path object, convert that to
# string so we can call string.startswith on it.
sh_path = str(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")
def _sh_configure_extension_impl(module_ctx):
sh_config(name = "local_config_sh")
return module_ctx.extension_metadata(reproducible = True)
sh_configure_extension = module_extension(implementation = _sh_configure_extension_impl)