| # 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. |
| """Module to exec cc toolchain targets and extract contents for all configs.""" |
| |
| from __future__ import print_function |
| |
| import atexit |
| import os |
| import shlex |
| import shutil |
| import subprocess |
| import tarfile |
| |
| from util import get_autoconfig_target_name |
| from util import get_git_root |
| |
| GIT_ROOT = get_git_root() |
| CONFIG_REPO = "./local_config_cc" |
| CONFIG_FILES = ["CROSSTOOL", "BUILD", "cc_wrapper.sh", "dummy_toolchain.bzl"] |
| TMP_DIR = os.path.join(GIT_ROOT, "release", "tmp") |
| |
| |
| def _cleanup(): |
| """Cleanup generated files.""" |
| if os.path.exists(TMP_DIR): |
| shutil.rmtree(TMP_DIR) |
| |
| |
| def execute_and_extract_configs(container_configs_list, bazel_version): |
| """Executes the docker_toolchain_autoconfig targets and extract configs. |
| |
| If configs already exist in this repo, the script will delete them and |
| generate new ones. |
| |
| It generate cc configs which currently includes: CROSSTOOL, BUILD, |
| cc_wrapper.sh and dummy_toolchain.bzl. Examples can be found in |
| configs/ubuntu16_04_clang/1.0/bazel_0.15.0/default/. |
| |
| There is one such set of cc configs per container per Bazel version per config |
| type. |
| |
| Args: |
| container_configs_list: list of ContainerConfigs, the list of |
| ContainerConfigs to generate configs for. |
| bazel_version: string, the version of Bazel used to generate the configs. |
| """ |
| |
| atexit.register(_cleanup) |
| |
| # Create temporary directory to store generated tarballs of configs. |
| if os.path.exists(TMP_DIR): |
| shutil.rmtree(TMP_DIR) |
| os.makedirs(TMP_DIR) |
| |
| for container_configs in container_configs_list: |
| for config in container_configs.configs: |
| |
| # Get target basename from config definitions. |
| target = get_autoconfig_target_name( |
| config_type=config.config_type, |
| distro=container_configs.distro, |
| config_version=container_configs.version, |
| bazel_version=bazel_version) |
| |
| # Remove old config dir if exists. |
| if os.path.exists(config.get_config_dir()): |
| print("\nOld version of toolchain configs for {target} already exists. " |
| "Deleting and generating again.".format(target=target)) |
| shutil.rmtree(config.get_config_dir()) |
| |
| # Generate config directory. |
| os.makedirs(config.get_config_dir()) |
| |
| command = ("bazel build //{PACKAGE}:{TARGET}").format( |
| PACKAGE=container_configs.package, TARGET=target) |
| print("\nExecuting command: %s\n" % command) |
| subprocess.check_call(shlex.split(command)) |
| |
| command = ( |
| "cp " |
| "{GIT_ROOT}/bazel-out/k8-fastbuild/bin/{PACKAGE}/{TARGET}_outputs.tar" |
| " {OUTPUT_DIR}/").format( |
| GIT_ROOT=GIT_ROOT, |
| OUTPUT_DIR=TMP_DIR, |
| PACKAGE=container_configs.package, |
| TARGET=target) |
| print("\nExecuting command: %s\n" % command) |
| subprocess.check_call(shlex.split(command)) |
| |
| # Extract toolchain configs. |
| tar_path = os.path.join(TMP_DIR, "%s_outputs.tar" % target) |
| tar = tarfile.open(tar_path) |
| |
| for config_file in CONFIG_FILES: |
| # Extract toolchain config without the CONFIG_REPO name. |
| member = tar.getmember(os.path.join(CONFIG_REPO, config_file)) |
| member.name = os.path.basename(member.name) |
| tar.extract(member, config.get_config_dir()) |