| # Copyright (c) 2017 The WebRTC project authors. All Rights Reserved. |
| # |
| # Use of this source code is governed by a BSD-style license |
| # that can be found in the LICENSE file in the root of the source |
| # tree. An additional intellectual property rights grant can be found |
| # in the file PATENTS. All contributing project authors may |
| # be found in the AUTHORS file in the root of the source tree. |
| |
| import os |
| import re |
| import shutil |
| import subprocess |
| import sys |
| import tempfile |
| |
| |
| SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) |
| SRC_DIR = os.path.normpath(os.path.join(SCRIPT_DIR, os.pardir, os.pardir)) |
| sys.path.append(os.path.join(SRC_DIR, 'build')) |
| import find_depot_tools |
| |
| |
| # GN_ERROR_RE matches the summary of an error output by `gn check`. |
| # Matches "ERROR" and following lines until it sees an empty line or a line |
| # containing just underscores. |
| GN_ERROR_RE = re.compile(r'^ERROR .+(?:\n.*[^_\n].*$)+', re.MULTILINE) |
| |
| |
| def RunGnCheck(root_dir=None): |
| """Runs `gn gen --check` with default args to detect mismatches between |
| #includes and dependencies in the BUILD.gn files, as well as general build |
| errors. |
| |
| Returns a list of error summary strings. |
| """ |
| out_dir = tempfile.mkdtemp('gn') |
| try: |
| command = [ |
| sys.executable, |
| os.path.join(find_depot_tools.DEPOT_TOOLS_PATH, 'gn.py'), |
| 'gen', |
| '--check', |
| out_dir, |
| ] |
| subprocess.check_output(command, cwd=root_dir) |
| except subprocess.CalledProcessError as err: |
| return GN_ERROR_RE.findall(err.output) |
| else: |
| return [] |
| finally: |
| shutil.rmtree(out_dir, ignore_errors=True) |