11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#!/usr/bin/env python 21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci# Copyright 2014 The Chromium Authors. All rights reserved. 41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci# Use of this source code is governed by a BSD-style license that can be 51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci# found in the LICENSE file. 61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci"""Given the output of -t commands from a ninja build for a gyp and GN generated 81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibuild, report on differences between the command lines.""" 91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciimport os 121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciimport shlex 131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciimport subprocess 141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciimport sys 151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci# Must be in src/. 181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccios.chdir(os.path.join(os.path.dirname(__file__), '..', '..', '..')) 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccig_total_differences = 0 221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccidef FindAndRemoveArgWithValue(command_line, argname): 251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci """Given a command line as a list, remove and return the value of an option 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci that takes a value as a separate entry. 271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Modifies |command_line| in place. 291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci """ 301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if argname not in command_line: 311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return '' 321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci location = command_line.index(argname) 331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci value = command_line[location + 1] 341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci command_line[location:location + 2] = [] 351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return value 361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccidef MergeSpacedArgs(command_line, argname): 391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci """Combine all arguments |argname| with their values, separated by a space.""" 401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci i = 0 411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci result = [] 421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci while i < len(command_line): 431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci arg = command_line[i] 441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if arg == argname: 451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci result.append(arg + ' ' + command_line[i + 1]) 461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci i += 1 471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else: 481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci result.append(arg) 491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci i += 1 501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return result 511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccidef NormalizeSymbolArguments(command_line): 541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci """Normalize -g arguments. 551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci If there's no -g args, it's equivalent to -g0. -g2 is equivalent to -g. 571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Modifies |command_line| in place. 581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci """ 591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci # Strip -g0 if there's no symbols. 601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci have_some_symbols = False 611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for x in command_line: 621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if x.startswith('-g') and x != '-g0': 631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci have_some_symbols = True 641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if not have_some_symbols and '-g0' in command_line: 651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci command_line.remove('-g0') 661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci # Rename -g2 to -g. 681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if '-g2' in command_line: 691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci command_line[index('-g2')] = '-g' 701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccidef GetFlags(lines): 731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci """Turn a list of command lines into a semi-structured dict.""" 741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci flags_by_output = {} 751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for line in lines: 761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci # TODO(scottmg): Hacky way of getting only cc for now. 771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if 'clang' not in line: 781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci continue 791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci command_line = shlex.split(line.strip())[1:] 811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci output_name = FindAndRemoveArgWithValue(command_line, '-o') 831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dep_name = FindAndRemoveArgWithValue(command_line, '-MF') 841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci NormalizeSymbolArguments(command_line) 861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci command_line = MergeSpacedArgs(command_line, '-Xclang') 881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci defines = [x for x in command_line if x.startswith('-D')] 901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci include_dirs = [x for x in command_line if x.startswith('-I')] 911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dash_f = [x for x in command_line if x.startswith('-f')] 921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci warnings = [x for x in command_line if x.startswith('-W')] 931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci cc_file = [x for x in command_line if x.endswith('.cc') or 941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci x.endswith('.c') or 951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci x.endswith('.cpp')] 961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if len(cc_file) != 1: 971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci print 'Skipping %s' % command_line 981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci continue 991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci assert len(cc_file) == 1 1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci others = [x for x in command_line if x not in defines and \ 1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci x not in include_dirs and \ 1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci x not in dash_f and \ 1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci x not in warnings and \ 1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci x not in cc_file] 1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci # Filter for libFindBadConstructs.so having a relative path in one and 1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci # absolute path in the other. 1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci others_filtered = [] 1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for x in others: 1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if x.startswith('-Xclang ') and x.endswith('libFindBadConstructs.so'): 1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci others_filtered.append( 1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci '-Xclang ' + 1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci os.path.join(os.getcwd(), 1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci os.path.normpath( 1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci os.path.join('out/gn_flags', x.split(' ', 1)[1])))) 1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci elif x.startswith('-B'): 1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci others_filtered.append( 1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci '-B' + 1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci os.path.join(os.getcwd(), 1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci os.path.normpath(os.path.join('out/gn_flags', x[2:])))) 1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else: 1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci others_filtered.append(x) 1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci others = others_filtered 1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci flags_by_output[cc_file[0]] = { 1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 'output': output_name, 1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 'depname': dep_name, 1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 'defines': sorted(defines), 1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 'include_dirs': sorted(include_dirs), # TODO(scottmg): This is wrong. 1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 'dash_f': sorted(dash_f), 1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 'warnings': sorted(warnings), 1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 'other': sorted(others), 1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return flags_by_output 1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccidef CompareLists(gyp, gn, name, dont_care_gyp=None, dont_care_gn=None): 1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci """Return a report of any differences between gyp and gn lists, ignoring 1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci anything in |dont_care_{gyp|gn}| respectively.""" 1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci global g_total_differences 1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if not dont_care_gyp: 1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dont_care_gyp = [] 1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if not dont_care_gn: 1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dont_care_gn = [] 1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci output = '' 1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if gyp[name] != gn[name]: 1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci gyp_set = set(gyp[name]) 1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci gn_set = set(gn[name]) 1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci missing_in_gyp = gyp_set - gn_set 1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci missing_in_gn = gn_set - gyp_set 1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci missing_in_gyp -= set(dont_care_gyp) 1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci missing_in_gn -= set(dont_care_gn) 1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if missing_in_gyp or missing_in_gn: 1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci output += ' %s differ:\n' % name 1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if missing_in_gyp: 1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci output += ' In gyp, but not in GN:\n %s' % '\n '.join( 1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci sorted(missing_in_gyp)) + '\n' 1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci g_total_differences += len(missing_in_gyp) 1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if missing_in_gn: 1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci output += ' In GN, but not in gyp:\n %s' % '\n '.join( 1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci sorted(missing_in_gn)) + '\n\n' 1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci g_total_differences += len(missing_in_gn) 1631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return output 1641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccidef Run(command_line): 1671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci """Run |command_line| as a subprocess and return stdout. Raises on error.""" 1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return subprocess.check_output(command_line, shell=True) 1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccidef main(): 1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if len(sys.argv) != 2 and len(sys.argv) != 3: 1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci print 'usage: %s gyp_target gn_target' % __file__ 1741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci print ' or: %s target' % __file__ 1751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return 1 1761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if len(sys.argv) == 2: 1781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci sys.argv.append(sys.argv[1]) 1791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci print >>sys.stderr, 'Regenerating...' 1811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci # Currently only Release, non-component. 1821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Run('gn gen out/gn_flags --args="is_debug=false is_component_build=false"') 1831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci os.environ.pop('GYP_DEFINES', None) 1841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Run('python build/gyp_chromium -Goutput_dir=out_gyp_flags -Gconfig=Release') 1851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci gn = Run('ninja -C out/gn_flags -t commands %s' % sys.argv[2]) 1861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci gyp = Run('ninja -C out_gyp_flags/Release -t commands %s' % sys.argv[1]) 1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci all_gyp_flags = GetFlags(gyp.splitlines()) 1881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci all_gn_flags = GetFlags(gn.splitlines()) 1891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci gyp_files = set(all_gyp_flags.keys()) 1901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci gn_files = set(all_gn_flags.keys()) 1911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci different_source_list = gyp_files != gn_files 1921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if different_source_list: 1931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci print 'Different set of sources files:' 1941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci print ' In gyp, not in GN:\n %s' % '\n '.join( 1951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci sorted(gyp_files - gn_files)) 1961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci print ' In GN, not in gyp:\n %s' % '\n '.join( 1971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci sorted(gn_files - gyp_files)) 1981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci print '\nNote that flags will only be compared for files in both sets.\n' 1991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci file_list = gyp_files & gn_files 2001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci files_with_given_differences = {} 2011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for filename in sorted(file_list): 2021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci gyp_flags = all_gyp_flags[filename] 2031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci gn_flags = all_gn_flags[filename] 2041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci differences = CompareLists(gyp_flags, gn_flags, 'dash_f') 2051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci differences += CompareLists(gyp_flags, gn_flags, 'defines') 2061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci differences += CompareLists(gyp_flags, gn_flags, 'include_dirs') 2071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci differences += CompareLists(gyp_flags, gn_flags, 'warnings', dont_care_gn=[ 2081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci # More conservative warnings in GN we consider to be OK. 2091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci '-Wendif-labels', 2101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci '-Wextra', 2111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci '-Wsign-compare', 2121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ]) 2131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci differences += CompareLists(gyp_flags, gn_flags, 'other') 2141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if differences: 2151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci files_with_given_differences.setdefault(differences, []).append(filename) 2161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for diff, files in files_with_given_differences.iteritems(): 2181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci print '\n'.join(sorted(files)) 2191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci print diff 2201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci print 'Total differences:', g_total_differences 2221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci # TODO(scottmg): Return failure on difference once we're closer to identical. 2231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return 0 2241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciif __name__ == '__main__': 2271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci sys.exit(main()) 228