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