| # Copyright 2016 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. | |
| """Data structures of toolchain configs.""" | |
| import os | |
| class ContainerConfigs(object): | |
| """Group of configs that are generated using the same container. | |
| Attributes: | |
| distro: string, base distro of container used to generate configs. | |
| version: string, version of the configs. | |
| image: string, the container registry entry of the image used to generated | |
| the configs, e.g. gcr.io/cloud-marketplace/google/clang-ubuntu. | |
| package: string, the Bazel package in which we will generate the target to | |
| build configs. | |
| platform_target: string, the platform target name of the corresponding RBE | |
| container these configs will be used together with, e.g. rbe_ubuntu1604. | |
| This is required to set value for flags: --extra_execution_platforms, | |
| --host_platform and --platforms. | |
| (Platform: https://docs.bazel.build/versions/master/platforms.html) | |
| constraints: string, additional toolchain constraints needed for the cpp | |
| toolchain definition. These must be valid targets in this repo or | |
| @bazel_tools. | |
| (Toolchain: https://docs.bazel.build/versions/master/toolchains.html) | |
| configs: list of Config object, a list of configs for each supported types | |
| generated using the container specified in the current ContainerConfig. | |
| """ | |
| # Currently supported distros. | |
| _SUPPORTED_DISTROS = ["debian8", "ubuntu16_04"] | |
| # Map from the container distro to additional pre-defined cpp toolchain | |
| # definition constraints. | |
| _DISTRO_CONSTRAINTS_MAP = { | |
| "debian8": ["//constraints:jessie"], | |
| "ubuntu16_04": ["//constraints:xenial"] | |
| } | |
| def __init__(self, distro, version, image, package, config_types, | |
| platform_target, git_root, bazel_version): | |
| """Inits ContainerConfigs. | |
| Args: | |
| distro: string, base distro of container used to generate configs. | |
| version: string, version of the configs. | |
| image: string, the container registry entry of the image used to generated | |
| the configs, e.g. gcr.io/cloud-marketplace/google/clang-ubuntu. | |
| package: string, the Bazel package in which we will generate the target to | |
| build configs. | |
| config_types: types of config to generated with this container, e.g. | |
| default, msan. | |
| platform_target: string, the platform target name of the corresponding RBE | |
| container these configs will be used together with e.g. rbe_ubuntu1604. | |
| This is required to set value for flags: --extra_execution_platforms, | |
| --host_platform and --platforms. | |
| (Platform: https://docs.bazel.build/versions/master/platforms.html) | |
| git_root: the absolute path of the root directory of the current | |
| repository. | |
| bazel_version: the version of Bazel used to generated the configs. | |
| Returns: | |
| A ContainerConfigs object. | |
| Raises: | |
| ValueError: An error occurred when input distro is not supported. | |
| """ | |
| # Validate distro is supported. | |
| if distro not in ContainerConfigs._SUPPORTED_DISTROS: | |
| raise ValueError( | |
| "Input distro: %s is not supported. Supported distros are %s" % | |
| (distro, " ".join(ContainerConfigs._SUPPORTED_DISTROS))) | |
| self._git_root = git_root | |
| self._bazel_version = bazel_version | |
| self.distro = distro | |
| self.version = version | |
| self.image = image | |
| self.package = package | |
| self.platform_target = platform_target | |
| self.constraints = ContainerConfigs._DISTRO_CONSTRAINTS_MAP[distro] | |
| self.config_types = config_types | |
| self.configs = [ | |
| Config(root=self._get_config_base_dir(), config_type=config_type) | |
| for config_type in config_types | |
| ] | |
| def get_target_build_path(self): | |
| """Returns the absolute path of the target BUILD file.""" | |
| return os.path.join(self._git_root, self.package, "BUILD") | |
| def get_latest_aliases_build_path(self): | |
| """Returns the absolute path of BUILD file with latest target aliases.""" | |
| return os.path.join(self._git_root, self.package, "latest", "BUILD") | |
| def get_toolchain_bazelrc_path(self): | |
| """Returns the absolute path of the toolchain.bazelrc file.""" | |
| return os.path.join(self._git_root, self.package, self.version, | |
| "toolchain.bazelrc") | |
| def get_platform_build_path(self): | |
| """Returns the absolute path of BUILD file with platform definition.""" | |
| return os.path.join(self._git_root, self.package, self.version, "BUILD") | |
| def get_java_runtime_build_path(self): | |
| """Returns the absolute path of BUILD file with java runtime.""" | |
| return self.get_platform_build_path() | |
| def get_cpp_build_path(self): | |
| """Returns the absolute path of BUILD file with cpp toolchain definition.""" | |
| return os.path.join(self._get_config_base_dir(), "cpp", "BUILD") | |
| def _get_config_base_dir(self): | |
| """Returns the absolute path of bazel_{version} directory. | |
| This returns the absolute path of bazel_{version} directory where configs | |
| are stored in the bazel-toolchains repo. | |
| For example: /.../configs/ubuntu16_04_clang/1.0/bazel_0.15.0/ | |
| """ | |
| return os.path.join(self._git_root, self.package, self.version, | |
| "bazel_%s" % self._bazel_version) | |
| class Config(object): | |
| """Configs of a single type that are generated using a container. | |
| Attributes: | |
| config_type: string, type of the configs, e.g. default, msan. | |
| constraints: string, additional toolchain constraints needed for the cpp | |
| toolchain definition. These must be valid targets in this repo or | |
| @bazel_tools. | |
| (Toolchain: https://docs.bazel.build/versions/master/toolchains.html) | |
| """ | |
| # Currently supported config types. | |
| _SUPPORTED_CONFIG_TYPES = ["default", "msan"] | |
| # Map from the config type to additional pre-defined cpp toolchain | |
| # definition constraints. | |
| _TYPE_CONSTRAINTS_MAP = { | |
| "default": [], | |
| "msan": ["//constraints/sanitizers:support_msan"] | |
| } | |
| def __init__(self, root, config_type): | |
| """Inits Config. | |
| Args: | |
| root: string, absolute path to the bazel_{version} directory, e.g. | |
| /.../configs/ubuntu16_04_clang/1.0/bazel_0.15.0/. | |
| config_type: string, type of the configs. | |
| Returns: | |
| A Config object. | |
| Raises: | |
| ValueError: An error occurred when input config type is not supported. | |
| """ | |
| # Validate config_type is supported. | |
| if config_type not in Config._SUPPORTED_CONFIG_TYPES: | |
| raise ValueError( | |
| "Input config type: %s is not supported. Supported types are %s" % | |
| (config_type, " ".join(Config._SUPPORTED_CONFIG_TYPES))) | |
| self._root = root | |
| self.config_type = config_type | |
| self.constraints = Config._TYPE_CONSTRAINTS_MAP[config_type] | |
| def get_config_dir(self): | |
| """Returns the absolute path of the cc toolchain configs directory.""" | |
| return os.path.join(self._root, self.config_type) | |
| def get_metadata_path(self): | |
| """Returns the absolute path of the METADATA file.""" | |
| return os.path.join(self.get_config_dir(), "METADATA") |