-
Notifications
You must be signed in to change notification settings - Fork 4.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
bash: Add a toolchain for local Bash.
Bazel automatically detects the local Bash and creates a custom toolchain rule for it. Later, rules that use Bash will require this toolchain and retrieve Bash's path from it instead of relying on hardcoded paths or the `--shell_executable` flag. See #4319 Change-Id: Idd8242a20d202b1f5a56cddac95b625c6c08ede9 Closes #4980. Change-Id: Ic2406a4da260b284e15852070d58472ca18340af PiperOrigin-RevId: 193022708
- Loading branch information
1 parent
ecbab79
commit 81ed3ad
Showing
9 changed files
with
162 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
2 changes: 2 additions & 0 deletions
2
src/main/java/com/google/devtools/build/lib/bazel/rules/sh/sh_configure.WORKSPACE
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
load("@bazel_tools//tools/sh:sh_configure.bzl", "sh_configure") | ||
sh_configure() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
package(default_visibility = ["//visibility:private"]) | ||
|
||
filegroup( | ||
name = "srcs", | ||
srcs = glob( | ||
["**"], | ||
exclude = [ | ||
"*~", | ||
".*", | ||
], | ||
), | ||
visibility = ["//tools:__pkg__"], | ||
) | ||
|
||
filegroup( | ||
name = "embedded_tools", | ||
srcs = [ | ||
"BUILD.tools", | ||
"sh_configure.bzl", | ||
"sh_toolchain.bzl", | ||
], | ||
visibility = ["//tools:__pkg__"], | ||
) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
exports_files(["sh_toolchain.bzl", "sh_configure.bzl"]) | ||
|
||
toolchain_type( | ||
name = "toolchain_type", | ||
visibility = ["//visibility:public"], | ||
) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,94 @@ | ||
# 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("\\", "/") | ||
|
||
os_label = None | ||
if _is_windows(repository_ctx): | ||
os_label = "@bazel_tools//platforms:windows" | ||
elif repository_ctx.os.name.startswith("linux"): | ||
os_label = "@bazel_tools//platforms:linux" | ||
elif repository_ctx.os.name.startswith("mac"): | ||
os_label = "@bazel_tools//platforms:osx" | ||
else: | ||
fail("Unknown OS") | ||
|
||
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", | ||
exec_compatible_with = [ | ||
"@bazel_tools//platforms:x86_64", | ||
"{os_label}", | ||
], | ||
toolchain = ":local_sh", | ||
toolchain_type = "@bazel_tools//tools/sh:toolchain_type", | ||
) | ||
""".format(sh_path = sh_path, os_label = os_label)) | ||
|
||
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") |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
# 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. | ||
"""Define a toolchain rule for the shell.""" | ||
|
||
def _sh_toolchain_impl(ctx): | ||
"""sh_toolchain rule implementation.""" | ||
return [platform_common.ToolchainInfo(path = ctx.attr.path)] | ||
|
||
sh_toolchain = rule( | ||
attrs = { | ||
# Absolute path to the shell interpreter. | ||
"path": attr.string(), | ||
}, | ||
implementation = _sh_toolchain_impl, | ||
) |