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 |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
79 'depname': dep_name, | 79 'depname': dep_name, |
80 'defines': sorted(defines), | 80 'defines': sorted(defines), |
81 'include_dirs': sorted(include_dirs), # TODO(scottmg): This is wrong. | 81 'include_dirs': sorted(include_dirs), # TODO(scottmg): This is wrong. |
82 'dash_f': sorted(dash_f), | 82 'dash_f': sorted(dash_f), |
83 'warnings': sorted(warnings), | 83 'warnings': sorted(warnings), |
84 'other': sorted(others), | 84 'other': sorted(others), |
85 } | 85 } |
86 return flags_by_output | 86 return flags_by_output |
87 | 87 |
88 | 88 |
89 def CompareLists(gyp, gn, name, dont_care=None): | 89 def CompareLists(gyp, gn, name, dont_care_gyp=None, dont_care_gn=None): |
90 """Return a report of any differences between two lists, ignoring anything | 90 """Return a report of any differences between gyp and gn lists, ignoring |
91 in |dont_care|.""" | 91 anything in |dont_care_{gyp|gn}| respectively.""" |
92 if not dont_care: | 92 if not dont_care_gyp: |
93 dont_care = [] | 93 dont_care_gyp = [] |
| 94 if not dont_care_gn: |
| 95 dont_care_gn = [] |
94 output = '' | 96 output = '' |
95 if gyp[name] != gn[name]: | 97 if gyp[name] != gn[name]: |
96 output += ' %s differ:\n' % name | 98 output += ' %s differ:\n' % name |
97 gyp_set = set(gyp[name]) - set(dont_care) | 99 gyp_set = set(gyp[name]) |
98 gn_set = set(gn[name]) - set(dont_care) | 100 gn_set = set(gn[name]) |
99 output += ' In gyp, but not in GN:\n %s' % '\n '.join( | 101 missing_in_gyp = gyp_set - gn_set |
100 sorted(gyp_set - gn_set)) + '\n' | 102 missing_in_gn = gn_set - gyp_set |
101 output += ' In GN, but not in gyp:\n %s' % '\n '.join( | 103 missing_in_gyp -= set(dont_care_gyp) |
102 sorted(gn_set - gyp_set)) + '\n\n' | 104 missing_in_gn -= set(dont_care_gn) |
| 105 if missing_in_gyp: |
| 106 output += ' In gyp, but not in GN:\n %s' % '\n '.join( |
| 107 sorted(missing_in_gyp)) + '\n' |
| 108 if missing_in_gn: |
| 109 output += ' In GN, but not in gyp:\n %s' % '\n '.join( |
| 110 sorted(missing_in_gn)) + '\n\n' |
103 return output | 111 return output |
104 | 112 |
105 | 113 |
106 def Run(command_line): | 114 def Run(command_line): |
107 """Run |command_line| as a subprocess and return stdout. Raises on error.""" | 115 """Run |command_line| as a subprocess and return stdout. Raises on error.""" |
108 return subprocess.check_output(command_line, shell=True) | 116 return subprocess.check_output(command_line, shell=True) |
109 | 117 |
110 | 118 |
111 def main(): | 119 def main(): |
112 if len(sys.argv) != 2 and len(sys.argv) != 3: | 120 if len(sys.argv) != 2 and len(sys.argv) != 3: |
113 print 'usage: %s gyp_target gn_target' % __file__ | 121 print 'usage: %s gyp_target gn_target' % __file__ |
114 print ' or: %s target' % __file__ | 122 print ' or: %s target' % __file__ |
115 return 1 | 123 return 1 |
116 | 124 |
117 if len(sys.argv) == 2: | 125 if len(sys.argv) == 2: |
118 sys.argv.append(sys.argv[1]) | 126 sys.argv.append(sys.argv[1]) |
119 | 127 |
120 print >>sys.stderr, 'Regenerating...' | 128 print >>sys.stderr, 'Regenerating...' |
121 # Currently only Release, non-component. | 129 # Currently only Release, non-component. |
122 Run('gn gen out/gn_flags --args="is_debug=false is_component_build=false"') | 130 Run('gn gen out/gn_flags --args="is_debug=false is_component_build=false"') |
123 del os.environ['GYP_DEFINES'] | 131 os.environ.pop('GYP_DEFINES', None) |
124 Run('python build/gyp_chromium -Goutput_dir=out_gyp_flags -Gconfig=Release') | 132 Run('python build/gyp_chromium -Goutput_dir=out_gyp_flags -Gconfig=Release') |
125 gn = Run('ninja -C out/gn_flags -t commands %s' % sys.argv[2]) | 133 gn = Run('ninja -C out/gn_flags -t commands %s' % sys.argv[2]) |
126 gyp = Run('ninja -C out_gyp_flags/Release -t commands %s' % sys.argv[1]) | 134 gyp = Run('ninja -C out_gyp_flags/Release -t commands %s' % sys.argv[1]) |
127 all_gyp_flags = GetFlags(gyp.splitlines()) | 135 all_gyp_flags = GetFlags(gyp.splitlines()) |
128 all_gn_flags = GetFlags(gn.splitlines()) | 136 all_gn_flags = GetFlags(gn.splitlines()) |
129 gyp_files = set(all_gyp_flags.keys()) | 137 gyp_files = set(all_gyp_flags.keys()) |
130 gn_files = set(all_gn_flags.keys()) | 138 gn_files = set(all_gn_flags.keys()) |
131 different_source_list = gyp_files != gn_files | 139 different_source_list = gyp_files != gn_files |
132 if different_source_list: | 140 if different_source_list: |
133 print 'Different set of sources files:' | 141 print 'Different set of sources files:' |
134 print ' In gyp, not in GN:\n %s' % '\n '.join( | 142 print ' In gyp, not in GN:\n %s' % '\n '.join( |
135 sorted(gyp_files - gn_files)) | 143 sorted(gyp_files - gn_files)) |
136 print ' In GN, not in gyp:\n %s' % '\n '.join( | 144 print ' In GN, not in gyp:\n %s' % '\n '.join( |
137 sorted(gn_files - gyp_files)) | 145 sorted(gn_files - gyp_files)) |
138 print '\nNote that flags will only be compared for files in both sets.\n' | 146 print '\nNote that flags will only be compared for files in both sets.\n' |
139 file_list = gyp_files & gn_files | 147 file_list = gyp_files & gn_files |
140 files_with_given_differences = {} | 148 files_with_given_differences = {} |
141 for filename in sorted(file_list): | 149 for filename in sorted(file_list): |
142 gyp_flags = all_gyp_flags[filename] | 150 gyp_flags = all_gyp_flags[filename] |
143 gn_flags = all_gn_flags[filename] | 151 gn_flags = all_gn_flags[filename] |
144 differences = CompareLists(gyp_flags, gn_flags, 'dash_f') | 152 differences = CompareLists(gyp_flags, gn_flags, 'dash_f') |
145 differences += CompareLists(gyp_flags, gn_flags, 'defines', dont_care=[ | 153 differences += CompareLists(gyp_flags, gn_flags, 'defines') |
146 '-DENABLE_PRE_SYNC_BACKUP', | 154 differences += CompareLists(gyp_flags, gn_flags, 'include_dirs') |
147 '-DENABLE_WEBRTC=1', | 155 differences += CompareLists(gyp_flags, gn_flags, 'warnings', dont_care_gn=[ |
148 '-DUSE_LIBJPEG_TURBO=1', | 156 # More conservative warnings in GN we consider to be OK. |
149 '-DUSE_PANGO=1', | 157 '-Wendif-labels', |
150 '-DUSE_SYMBOLIZE', | 158 '-Wextra', |
| 159 '-Wsign-compare', |
151 ]) | 160 ]) |
152 differences += CompareLists(gyp_flags, gn_flags, 'include_dirs') | |
153 differences += CompareLists(gyp_flags, gn_flags, 'warnings') | |
154 differences += CompareLists(gyp_flags, gn_flags, 'other') | 161 differences += CompareLists(gyp_flags, gn_flags, 'other') |
155 if differences: | 162 if differences: |
156 files_with_given_differences.setdefault(differences, []).append(filename) | 163 files_with_given_differences.setdefault(differences, []).append(filename) |
157 | 164 |
158 for diff, files in files_with_given_differences.iteritems(): | 165 for diff, files in files_with_given_differences.iteritems(): |
159 print '\n'.join(sorted(files)) | 166 print '\n'.join(sorted(files)) |
160 print diff | 167 print diff |
161 | 168 |
162 return 1 if files_with_given_differences or different_source_list else 0 | 169 return 1 if files_with_given_differences or different_source_list else 0 |
163 | 170 |
164 | 171 |
165 if __name__ == '__main__': | 172 if __name__ == '__main__': |
166 sys.exit(main()) | 173 sys.exit(main()) |
OLD | NEW |