OLD | NEW |
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 | 2 |
3 # Copyright 2014 The Chromium Authors. All rights reserved. | 3 # Copyright 2014 The Chromium Authors. All rights reserved. |
4 # Use of this source code is governed by a BSD-style license that can be | 4 # Use of this source code is governed by a BSD-style license that can be |
5 # found in the LICENSE file. | 5 # found in the LICENSE file. |
6 | 6 |
7 """Given the output of -t commands from a ninja build for a gyp and GN generated | 7 """Given the output of -t commands from a ninja build for a gyp and GN generated |
8 build, report on differences between the command lines.""" | 8 build, report on differences between the command lines.""" |
9 | 9 |
10 | 10 |
11 import sys | 11 import sys |
12 | 12 |
13 | 13 |
14 def FindAndRemoveArgWithValue(command_line, argname): | 14 def FindAndRemoveArgWithValue(command_line, argname): |
15 """Given a command line as a list, remove and return the value of an option | 15 """Given a command line as a list, remove and return the value of an option |
16 that takes a value as a separate entry. | 16 that takes a value as a separate entry. |
17 | 17 |
18 Modifies |command_line| in place. | 18 Modifies |command_line| in place. |
19 """ | 19 """ |
| 20 if argname not in command_line: |
| 21 return '' |
20 location = command_line.index(argname) | 22 location = command_line.index(argname) |
21 value = command_line[location + 1] | 23 value = command_line[location + 1] |
22 command_line[location:location + 2] = [] | 24 command_line[location:location + 2] = [] |
23 return value | 25 return value |
24 | 26 |
25 | 27 |
26 def MergeSpacedArgs(command_line, argname): | 28 def MergeSpacedArgs(command_line, argname): |
27 """Combine all arguments |argname| with their values, separated by a space.""" | 29 """Combine all arguments |argname| with their values, separated by a space.""" |
28 i = 0 | 30 i = 0 |
29 result = [] | 31 result = [] |
(...skipping 21 matching lines...) Expand all Loading... |
51 | 53 |
52 output_name = FindAndRemoveArgWithValue(command_line, '-o') | 54 output_name = FindAndRemoveArgWithValue(command_line, '-o') |
53 dep_name = FindAndRemoveArgWithValue(command_line, '-MF') | 55 dep_name = FindAndRemoveArgWithValue(command_line, '-MF') |
54 | 56 |
55 command_line = MergeSpacedArgs(command_line, '-Xclang') | 57 command_line = MergeSpacedArgs(command_line, '-Xclang') |
56 | 58 |
57 defines = [x for x in command_line if x.startswith('-D')] | 59 defines = [x for x in command_line if x.startswith('-D')] |
58 include_dirs = [x for x in command_line if x.startswith('-I')] | 60 include_dirs = [x for x in command_line if x.startswith('-I')] |
59 dash_f = [x for x in command_line if x.startswith('-f')] | 61 dash_f = [x for x in command_line if x.startswith('-f')] |
60 warnings = [x for x in command_line if x.startswith('-W')] | 62 warnings = [x for x in command_line if x.startswith('-W')] |
61 cc_file = [x for x in command_line if x.endswith('.cc') or x.endswith('.c')] | 63 cc_file = [x for x in command_line if x.endswith('.cc') or |
| 64 x.endswith('.c') or |
| 65 x.endswith('.cpp')] |
| 66 if len(cc_file) != 1: |
| 67 print 'Skipping %s' % command_line |
| 68 continue |
62 assert len(cc_file) == 1 | 69 assert len(cc_file) == 1 |
63 others = [x for x in command_line if x not in defines and \ | 70 others = [x for x in command_line if x not in defines and \ |
64 x not in include_dirs and \ | 71 x not in include_dirs and \ |
65 x not in dash_f and \ | 72 x not in dash_f and \ |
66 x not in warnings and \ | 73 x not in warnings and \ |
67 x not in cc_file] | 74 x not in cc_file] |
68 flags_by_output[cc_file[0]] = { | 75 flags_by_output[cc_file[0]] = { |
69 'output': output_name, | 76 'output': output_name, |
70 'depname': dep_name, | 77 'depname': dep_name, |
71 'defines': sorted(defines), | 78 'defines': sorted(defines), |
72 'include_dirs': sorted(include_dirs), # TODO(scottmg): This is wrong. | 79 'include_dirs': sorted(include_dirs), # TODO(scottmg): This is wrong. |
73 'dash_f': sorted(dash_f), | 80 'dash_f': sorted(dash_f), |
74 'warnings': sorted(warnings), | 81 'warnings': sorted(warnings), |
75 'other': sorted(others), | 82 'other': sorted(others), |
76 } | 83 } |
77 return flags_by_output | 84 return flags_by_output |
78 | 85 |
79 | 86 |
80 def CompareLists(gyp, gn, name, dont_care=None): | 87 def CompareLists(gyp, gn, name, dont_care=None): |
81 """Output any differences between to lists, ignoring anything in | 88 """Return a report of any differences between two lists, ignoring anything |
82 |dont_care|.""" | 89 in |dont_care|.""" |
83 if not dont_care: | 90 if not dont_care: |
84 dont_care = [] | 91 dont_care = [] |
| 92 output = '' |
85 if gyp[name] != gn[name]: | 93 if gyp[name] != gn[name]: |
86 print ' %s differ:' % name | 94 output += ' %s differ:\n' % name |
87 gyp_set = set(gyp[name]) - set(dont_care) | 95 gyp_set = set(gyp[name]) - set(dont_care) |
88 gn_set = set(gn[name]) - set(dont_care) | 96 gn_set = set(gn[name]) - set(dont_care) |
89 print ' In gyp, but not in GN:\n %s' % '\n '.join( | 97 output += ' In gyp, but not in GN:\n %s' % '\n '.join( |
90 sorted(gyp_set - gn_set)) | 98 sorted(gyp_set - gn_set)) + '\n' |
91 print ' In GN, but not in gyp:\n %s' % '\n '.join( | 99 output += ' In GN, but not in gyp:\n %s' % '\n '.join( |
92 sorted(gn_set - gyp_set)) | 100 sorted(gn_set - gyp_set)) + '\n\n' |
93 print | 101 return output |
94 return True | |
95 return False | |
96 | 102 |
97 | 103 |
98 def main(): | 104 def main(): |
99 if len(sys.argv) != 3: | 105 if len(sys.argv) != 3: |
100 print 'usage: %s gyp_commands.txt gn_commands.txt' % __file__ | 106 print 'usage: %s gyp_commands.txt gn_commands.txt' % __file__ |
101 return 1 | 107 return 1 |
102 with open(sys.argv[1], 'rb') as f: | 108 with open(sys.argv[1], 'rb') as f: |
103 gyp = f.readlines() | 109 gyp = f.readlines() |
104 with open(sys.argv[2], 'rb') as f: | 110 with open(sys.argv[2], 'rb') as f: |
105 gn = f.readlines() | 111 gn = f.readlines() |
106 all_gyp_flags = GetFlags(gyp) | 112 all_gyp_flags = GetFlags(gyp) |
107 all_gn_flags = GetFlags(gn) | 113 all_gn_flags = GetFlags(gn) |
108 gyp_files = set(all_gyp_flags.keys()) | 114 gyp_files = set(all_gyp_flags.keys()) |
109 gn_files = set(all_gn_flags.keys()) | 115 gn_files = set(all_gn_flags.keys()) |
110 differences = False | 116 different_source_list = gyp_files != gn_files |
111 if gyp_files != gn_files: | 117 if different_source_list: |
112 print 'Different set of sources files:' | 118 print 'Different set of sources files:' |
113 print ' In gyp, not in GN:\n %s' % '\n '.join( | 119 print ' In gyp, not in GN:\n %s' % '\n '.join( |
114 sorted(gyp_files - gn_files)) | 120 sorted(gyp_files - gn_files)) |
115 print ' In GN, not in gyp:\n %s' % '\n '.join( | 121 print ' In GN, not in gyp:\n %s' % '\n '.join( |
116 sorted(gn_files - gyp_files)) | 122 sorted(gn_files - gyp_files)) |
117 print '\nNote that flags will only be compared for files in both sets.\n' | 123 print '\nNote that flags will only be compared for files in both sets.\n' |
118 differences |= True | |
119 file_list = gyp_files & gn_files | 124 file_list = gyp_files & gn_files |
| 125 files_with_given_differences = {} |
120 for filename in sorted(file_list): | 126 for filename in sorted(file_list): |
121 gyp_flags = all_gyp_flags[filename] | 127 gyp_flags = all_gyp_flags[filename] |
122 gn_flags = all_gn_flags[filename] | 128 gn_flags = all_gn_flags[filename] |
123 print filename | 129 differences = CompareLists(gyp_flags, gn_flags, 'dash_f') |
124 differences |= CompareLists(gyp_flags, gn_flags, 'dash_f') | 130 differences += CompareLists(gyp_flags, gn_flags, 'defines', dont_care=[ |
125 differences |= CompareLists(gyp_flags, gn_flags, 'defines', dont_care=[ | |
126 '-DENABLE_PRE_SYNC_BACKUP', | 131 '-DENABLE_PRE_SYNC_BACKUP', |
127 '-DENABLE_WEBRTC=1', | 132 '-DENABLE_WEBRTC=1', |
128 '-DUSE_LIBJPEG_TURBO=1', | 133 '-DUSE_LIBJPEG_TURBO=1', |
129 '-DUSE_PANGO=1', | 134 '-DUSE_PANGO=1', |
130 '-DUSE_SYMBOLIZE', | 135 '-DUSE_SYMBOLIZE', |
131 ]) | 136 ]) |
132 differences |= CompareLists(gyp_flags, gn_flags, 'include_dirs') | 137 differences += CompareLists(gyp_flags, gn_flags, 'include_dirs') |
133 differences |= CompareLists(gyp_flags, gn_flags, 'warnings') | 138 differences += CompareLists(gyp_flags, gn_flags, 'warnings') |
134 differences |= CompareLists(gyp_flags, gn_flags, 'other') | 139 differences += CompareLists(gyp_flags, gn_flags, 'other') |
135 return 1 if differences else 0 | 140 if differences: |
| 141 files_with_given_differences.setdefault(differences, []).append(filename) |
| 142 |
| 143 for diff, files in files_with_given_differences.iteritems(): |
| 144 print '\n'.join(sorted(files)) |
| 145 print diff |
| 146 |
| 147 return 1 if files_with_given_differences or different_source_list else 0 |
136 | 148 |
137 | 149 |
138 if __name__ == '__main__': | 150 if __name__ == '__main__': |
139 sys.exit(main()) | 151 sys.exit(main()) |
OLD | NEW |