| """Utility functions for repository rules""" | |
| def _is_darwin(rctx): | |
| """Returns true if the host operating system is Darwin""" | |
| return rctx.os.name.lower().startswith("mac os") | |
| def _is_linux(rctx): | |
| """Returns true if the host operating system is Linux""" | |
| return rctx.os.name.lower().startswith("linux") | |
| def _is_freebsd(rctx): | |
| """Returns true if the host operating system is FreeBSD""" | |
| return rctx.os.name.lower().startswith("freebsd") | |
| def _is_windows(rctx): | |
| """Returns true if the host operating system is Windows""" | |
| return rctx.os.name.lower().find("windows") != -1 | |
| def _os(rctx): | |
| """Returns the name of the host operating system | |
| Args: | |
| rctx: rctx | |
| Returns: | |
| The string "windows", "linux", "freebsd" or "darwin" that describes the host os | |
| """ | |
| if _is_darwin(rctx): | |
| return "darwin" | |
| if _is_linux(rctx): | |
| return "linux" | |
| if _is_freebsd(rctx): | |
| return "freebsd" | |
| if _is_windows(rctx): | |
| return "windows" | |
| fail("unrecognized os") | |
| def _get_env_var(rctx, name, default): | |
| """Find an environment variable in system. Doesn't %-escape the value! | |
| Args: | |
| rctx: rctx | |
| name: environment variable name | |
| default: default value to return if env var is not set in system | |
| Returns: | |
| The environment variable value or the default if it is not set | |
| """ | |
| # On Windows, the HOME environment variable is named differently. | |
| # See https://en.wikipedia.org/wiki/Home_directory#Default_home_directory_per_operating_system | |
| if name == "HOME" and _is_windows(rctx): | |
| name = "USERPROFILE" | |
| if name in rctx.os.environ: | |
| return rctx.os.environ[name] | |
| return default | |
| def _platform(rctx): | |
| """Returns a normalized name of the host os and CPU architecture. | |
| Alias archictures names are normalized: | |
| x86_64 => amd64 | |
| aarch64 => arm64 | |
| The result can be used to generate repository names for host toolchain | |
| repositories for toolchains that use these normalized names. | |
| Common os & architecture pairs that are returned are, | |
| - darwin_amd64 | |
| - darwin_arm64 | |
| - linux_amd64 | |
| - linux_arm64 | |
| - linux_s390x | |
| - linux_ppc64le | |
| - windows_amd64 | |
| Args: | |
| rctx: rctx | |
| Returns: | |
| The normalized "<os>_<arch>" string of the host os and CPU architecture. | |
| """ | |
| os = _os(rctx) | |
| # NB: in bazel 5.1.1 rctx.os.arch was added which https://github.com/bazelbuild/bazel/commit/32d1606dac2fea730abe174c41870b7ee70ae041. | |
| # Once we drop support for anything older than Bazel 5.1.1 than we can simplify | |
| # this function. | |
| if os == "windows": | |
| proc_arch = (_get_env_var(rctx, "PROCESSOR_ARCHITECTURE", "") or | |
| _get_env_var(rctx, "PROCESSOR_ARCHITEW6432", "")) | |
| if proc_arch == "ARM64": | |
| arch = "arm64" | |
| else: | |
| arch = "amd64" | |
| else: | |
| arch = rctx.execute(["uname", "-m"]).stdout.strip() | |
| arch_map = { | |
| "x86_64": "amd64", | |
| "aarch64": "arm64", | |
| } | |
| if arch in arch_map.keys(): | |
| arch = arch_map[arch] | |
| return "%s_%s" % (os, arch) | |
| repo_utils = struct( | |
| is_darwin = _is_darwin, | |
| is_linux = _is_linux, | |
| is_windows = _is_windows, | |
| get_env_var = _get_env_var, | |
| os = _os, | |
| platform = _platform, | |
| ) |