-
Notifications
You must be signed in to change notification settings - Fork 0
/
configure.bzl
98 lines (76 loc) · 2.82 KB
/
configure.bzl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
"""Generate .bzl files containing local configuration variables.
"""
def _is_clang(repository_ctx, cc):
return "clang" in repository_ctx.execute([cc, "-v"]).stderr
def _configure_local_variables_impl(repository_ctx):
"""Substitute %{compiler_name} with GCC or CLANG."""
# Define an empty BUILD file to allow an external project
repository_ctx.file("BUILD", "");
cc = repository_ctx.os.environ.get("CC", "CC")
compiler_name = "CLANG" if _is_clang(repository_ctx, cc) else "GCC"
repository_ctx.template(
"variables.bzl",
repository_ctx.attr.variable_template,
{"%{compiler_name}": compiler_name}
)
result = repository_ctx.execute(["pwd"])
exec_dir = result.stdout.splitlines()[0]
output_base = exec_dir.partition("external/")[0]
repository_ctx.file(
"bazel_info.bzl",
'BAZEL_OUTPUT_BASE = "%s"\n' % output_base
)
configure_local_variables = repository_rule(
implementation = _configure_local_variables_impl,
attrs = {
"variable_template": attr.label(
mandatory = True,
allow_single_file = True,
),
},
local = True,
configure = True,
environ = ["CC"],
)
"""Generates a compiler configuration .bzl file and a Bazel info .bzl file.
Generate the following .bzl files:
- `variables.bzl`: sets compiler-dependent variables. From template
`variable_template`.
- `bazel_info.bzl`: sets Bazel info dependent variables.
Args:
variable_template: The template file with variable `%{compiler_name}`.
"""
def _configure_clang_tidy_impl(repository_ctx):
os_name = repository_ctx.os.name.lower()
env_path = repository_ctx.os.environ.get("CLANG_TIDY_PATH")
if env_path:
tidy_bin_dir, tidy_bin_name = env_path.rsplit("/", 1)
else:
tidy_bin_name = "clang-tidy"
if os_name.startswith("mac"):
tidy_bin_dir = "/usr/local/opt/llvm/bin"
elif os_name.startswith("linux"):
tidy_bin_dir = "/usr/lib/llvm-10/bin"
else:
fail("Unsupported operating system: " + os_name)
tidy_bin_path = "%s/%s" % (tidy_bin_dir, tidy_bin_name)
repository_ctx.symlink(tidy_bin_path, tidy_bin_name)
repository_ctx.file("BUILD", """
sh_binary(
name = "clang-tidy-bin",
srcs = ["%s"],
visibility = ["//visibility:public"],
)
""" % tidy_bin_name)
configure_clang_tidy = repository_rule(
implementation = _configure_clang_tidy_impl,
local = True,
configure = True,
environ = ["CLANG_TIDY_PATH"],
)
"""Generates a repository for using an system install of `clang-tidy`.
Attempts to provide access to a system installation of `clang-tidy`. If the
`CLANG_TIDY_PATH` environment variable is defined, it will be used instead of
hard-coded system paths.
If specified, `CLANG_TIDY_PATH` must be an absolute path.
"""