| #!/usr/bin/env python |
| # Copyright 2018 The Chromium Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| """Download clang coverage tools (llvm-cov + llvm-profdata)""" |
| |
| import os |
| import sys |
| import urllib2 |
| |
| sys.path.append( |
| os.path.join( |
| os.path.dirname(__file__), os.path.pardir, os.path.pardir, |
| 'third_party')) |
| import coverage_utils |
| |
| sys.path.append( |
| os.path.join( |
| os.path.dirname(__file__), os.path.pardir, os.path.pardir, 'tools', |
| 'clang', 'scripts')) |
| import update as clang_update |
| |
| |
| # TODO(crbug.com/759794): remove this function once tools get included to |
| # Clang bundle: |
| # https://chromium-review.googlesource.com/c/chromium/src/+/688221 |
| def DownloadCoverageToolsIfNeeded(): |
| """Temporary solution to download llvm-profdata and llvm-cov tools.""" |
| |
| def _GetRevisionFromStampFile(stamp_file_path): |
| """Returns revision by reading the build stamp file. |
| |
| Args: |
| stamp_file_path: A path the build stamp file created by |
| tools/clang/scripts/update.py. |
| Returns: |
| A string represeting the revision of the tool, such as 361212-67510fac-2. |
| """ |
| if not os.path.exists(stamp_file_path): |
| return '' |
| |
| with open(stamp_file_path) as stamp_file: |
| stamp_file_line = stamp_file.readline() |
| if ',' in stamp_file_line: |
| package_version = stamp_file_line.rstrip().split(',')[0] |
| else: |
| package_version = stamp_file_line.rstrip() |
| |
| return package_version |
| |
| cov_path = os.path.join(clang_update.LLVM_BUILD_DIR, 'llvm-cov') |
| profdata_path = os.path.join(clang_update.LLVM_BUILD_DIR, 'llvm-profdata') |
| |
| host_platform = coverage_utils.GetHostPlatform() |
| clang_revision = _GetRevisionFromStampFile(clang_update.STAMP_FILE) |
| coverage_revision_stamp_file = os.path.join( |
| os.path.dirname(clang_update.STAMP_FILE), 'cr_coverage_revision') |
| coverage_revision = _GetRevisionFromStampFile(coverage_revision_stamp_file) |
| |
| has_coverage_tools = ( |
| os.path.exists(cov_path) and os.path.exists(profdata_path)) |
| |
| if (has_coverage_tools and clang_revision == coverage_revision): |
| # LLVM coverage tools are up to date, bail out. |
| return |
| |
| package_version = clang_revision |
| coverage_tools_file = 'llvm-code-coverage-%s.tgz' % package_version |
| |
| # The code below follows the code from tools/clang/scripts/update.py. |
| if host_platform == 'mac': |
| coverage_tools_url = clang_update.CDS_URL + '/Mac/' + coverage_tools_file |
| elif host_platform == 'linux': |
| coverage_tools_url = ( |
| clang_update.CDS_URL + '/Linux_x64/' + coverage_tools_file) |
| else: |
| assert host_platform == 'win' |
| coverage_tools_url = (clang_update.CDS_URL + '/Win/' + coverage_tools_file) |
| |
| try: |
| clang_update.DownloadAndUnpack(coverage_tools_url, |
| clang_update.LLVM_BUILD_DIR) |
| with open(coverage_revision_stamp_file, 'w') as file_handle: |
| file_handle.write('%s,%s' % (package_version, host_platform)) |
| file_handle.write('\n') |
| except urllib2.URLError: |
| raise Exception( |
| 'Failed to download coverage tools: %s.' % coverage_tools_url) |
| |
| |
| if __name__ == '__main__': |
| DownloadCoverageToolsIfNeeded() |
| sys.exit(0) |