Chromium Code Reviews| Index: build/landmines.py |
| diff --git a/build/landmines.py b/build/landmines.py |
| index 220b8a7989f45cd7a037473be6db65b70d2551b4..2a6839987faab0afcccb7f68c97f18493f928851 100755 |
| --- a/build/landmines.py |
| +++ b/build/landmines.py |
| @@ -4,10 +4,8 @@ |
| # found in the LICENSE file. |
| """ |
| -This script runs every build as a hook. If it detects that the build should |
| -be clobbered, it will touch the file <build_dir>/.landmine_triggered. The |
| -various build scripts will then check for the presence of this file and clobber |
| -accordingly. The script will also emit the reasons for the clobber to stdout. |
| +This script runs every build as the first hook. If it detects that the build |
|
iannucci
2014/08/12 18:34:08
(See DEPS)
scottmg
2014/08/12 18:50:44
Done.
|
| +should be clobbered, it will remove the build directory. |
| A landmine is tripped when a builder checks out a different revision, and the |
| diff between the new landmines and the old ones is non-null. At this point, the |
| @@ -16,9 +14,11 @@ build is clobbered. |
| import difflib |
| import errno |
| +import gyp_environment |
| import logging |
| import optparse |
| import os |
| +import shutil |
| import sys |
| import subprocess |
| import time |
| @@ -29,7 +29,7 @@ import landmine_utils |
| SRC_DIR = os.path.dirname(os.path.dirname(os.path.realpath(__file__))) |
| -def get_target_build_dir(build_tool, target, is_iphone=False): |
| +def get_build_dir(build_tool, is_iphone=False): |
| """ |
| Returns output directory absolute path dependent on build and targets. |
| Examples: |
| @@ -41,23 +41,20 @@ def get_target_build_dir(build_tool, target, is_iphone=False): |
| """ |
| ret = None |
| if build_tool == 'xcode': |
| - ret = os.path.join(SRC_DIR, 'xcodebuild', |
| - target + ('-iphoneos' if is_iphone else '')) |
| + ret = os.path.join(SRC_DIR, 'xcodebuild') |
| elif build_tool in ['make', 'ninja', 'ninja-ios']: # TODO: Remove ninja-ios. |
| - ret = os.path.join(SRC_DIR, 'out', target) |
| + ret = os.path.join(SRC_DIR, 'out') |
| elif build_tool in ['msvs', 'vs', 'ib']: |
| - ret = os.path.join(SRC_DIR, 'build', target) |
| + ret = os.path.join(SRC_DIR, 'build') |
| else: |
| raise NotImplementedError('Unexpected GYP_GENERATORS (%s)' % build_tool) |
| return os.path.abspath(ret) |
| -def set_up_landmines(target, new_landmines): |
| +def clobber_if_necessary(new_landmines): |
| """Does the work of setting, planting, and triggering landmines.""" |
| - out_dir = get_target_build_dir(landmine_utils.builder(), target, |
| - landmine_utils.platform() == 'ios') |
| - |
| - landmines_path = os.path.join(out_dir, '.landmines') |
| + out_dir = get_build_dir(landmine_utils.builder()) |
| + landmines_path = os.path.normpath(os.path.join(out_dir, '..', '.landmines')) |
| try: |
| os.makedirs(out_dir) |
| except OSError as e: |
| @@ -65,7 +62,6 @@ def set_up_landmines(target, new_landmines): |
| pass |
| if os.path.exists(landmines_path): |
| - triggered = os.path.join(out_dir, '.landmines_triggered') |
| with open(landmines_path, 'r') as f: |
| old_landmines = f.readlines() |
| if old_landmines != new_landmines: |
| @@ -73,12 +69,13 @@ def set_up_landmines(target, new_landmines): |
| diff = difflib.unified_diff(old_landmines, new_landmines, |
| fromfile='old_landmines', tofile='new_landmines', |
| fromfiledate=old_date, tofiledate=time.ctime(), n=0) |
| + sys.stdout.write('Clobbering due to:\n') |
| + sys.stdout.writelines(diff) |
| + |
| + # Clobber. |
| + shutil.rmtree(out_dir) |
| - with open(triggered, 'w') as f: |
| - f.writelines(diff) |
| - elif os.path.exists(triggered): |
| - # Remove false triggered landmines. |
| - os.remove(triggered) |
| + # Save current set of landmines for next time. |
| with open(landmines_path, 'w') as f: |
| f.writelines(new_landmines) |
| @@ -119,14 +116,14 @@ def main(): |
| if landmine_utils.builder() in ('dump_dependency_json', 'eclipse'): |
| return 0 |
| - for target in ('Debug', 'Release', 'Debug_x64', 'Release_x64'): |
| - landmines = [] |
| - for s in landmine_scripts: |
| - proc = subprocess.Popen([sys.executable, s, '-t', target], |
| - stdout=subprocess.PIPE) |
| - output, _ = proc.communicate() |
| - landmines.extend([('%s\n' % l.strip()) for l in output.splitlines()]) |
| - set_up_landmines(target, landmines) |
| + gyp_environment.SetEnvironment() |
| + |
| + landmines = [] |
| + for s in landmine_scripts: |
| + proc = subprocess.Popen([sys.executable, s], stdout=subprocess.PIPE) |
| + output, _ = proc.communicate() |
| + landmines.extend([('%s\n' % l.strip()) for l in output.splitlines()]) |
| + clobber_if_necessary(landmines) |
| return 0 |