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 os |
| 12 import subprocess |
11 import sys | 13 import sys |
12 | 14 |
13 | 15 |
14 def FindAndRemoveArgWithValue(command_line, argname): | 16 def FindAndRemoveArgWithValue(command_line, argname): |
15 """Given a command line as a list, remove and return the value of an option | 17 """Given a command line as a list, remove and return the value of an option |
16 that takes a value as a separate entry. | 18 that takes a value as a separate entry. |
17 | 19 |
18 Modifies |command_line| in place. | 20 Modifies |command_line| in place. |
19 """ | 21 """ |
20 if argname not in command_line: | 22 if argname not in command_line: |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
94 output += ' %s differ:\n' % name | 96 output += ' %s differ:\n' % name |
95 gyp_set = set(gyp[name]) - set(dont_care) | 97 gyp_set = set(gyp[name]) - set(dont_care) |
96 gn_set = set(gn[name]) - set(dont_care) | 98 gn_set = set(gn[name]) - set(dont_care) |
97 output += ' In gyp, but not in GN:\n %s' % '\n '.join( | 99 output += ' In gyp, but not in GN:\n %s' % '\n '.join( |
98 sorted(gyp_set - gn_set)) + '\n' | 100 sorted(gyp_set - gn_set)) + '\n' |
99 output += ' In GN, but not in gyp:\n %s' % '\n '.join( | 101 output += ' In GN, but not in gyp:\n %s' % '\n '.join( |
100 sorted(gn_set - gyp_set)) + '\n\n' | 102 sorted(gn_set - gyp_set)) + '\n\n' |
101 return output | 103 return output |
102 | 104 |
103 | 105 |
| 106 def Run(command_line): |
| 107 """Run |command_line| as a subprocess and return stdout. Raises on error.""" |
| 108 return subprocess.check_output(command_line, shell=True) |
| 109 |
| 110 |
104 def main(): | 111 def main(): |
105 if len(sys.argv) != 3: | 112 if len(sys.argv) != 2 and len(sys.argv) != 3: |
106 print 'usage: %s gyp_commands.txt gn_commands.txt' % __file__ | 113 print 'usage: %s gyp_target gn_target' % __file__ |
| 114 print ' or: %s target' % __file__ |
107 return 1 | 115 return 1 |
108 with open(sys.argv[1], 'rb') as f: | 116 |
109 gyp = f.readlines() | 117 if len(sys.argv) == 2: |
110 with open(sys.argv[2], 'rb') as f: | 118 sys.argv.append(sys.argv[1]) |
111 gn = f.readlines() | 119 |
112 all_gyp_flags = GetFlags(gyp) | 120 print >>sys.stderr, 'Regenerating...' |
113 all_gn_flags = GetFlags(gn) | 121 # Currently only Release, non-component. |
| 122 Run('gn gen out/gn_flags --args="is_debug=false is_component_build=false"') |
| 123 del os.environ['GYP_DEFINES'] |
| 124 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]) |
| 126 gyp = Run('ninja -C out_gyp_flags/Release -t commands %s' % sys.argv[1]) |
| 127 all_gyp_flags = GetFlags(gyp.splitlines()) |
| 128 all_gn_flags = GetFlags(gn.splitlines()) |
114 gyp_files = set(all_gyp_flags.keys()) | 129 gyp_files = set(all_gyp_flags.keys()) |
115 gn_files = set(all_gn_flags.keys()) | 130 gn_files = set(all_gn_flags.keys()) |
116 different_source_list = gyp_files != gn_files | 131 different_source_list = gyp_files != gn_files |
117 if different_source_list: | 132 if different_source_list: |
118 print 'Different set of sources files:' | 133 print 'Different set of sources files:' |
119 print ' In gyp, not in GN:\n %s' % '\n '.join( | 134 print ' In gyp, not in GN:\n %s' % '\n '.join( |
120 sorted(gyp_files - gn_files)) | 135 sorted(gyp_files - gn_files)) |
121 print ' In GN, not in gyp:\n %s' % '\n '.join( | 136 print ' In GN, not in gyp:\n %s' % '\n '.join( |
122 sorted(gn_files - gyp_files)) | 137 sorted(gn_files - gyp_files)) |
123 print '\nNote that flags will only be compared for files in both sets.\n' | 138 print '\nNote that flags will only be compared for files in both sets.\n' |
(...skipping 18 matching lines...) Expand all Loading... |
142 | 157 |
143 for diff, files in files_with_given_differences.iteritems(): | 158 for diff, files in files_with_given_differences.iteritems(): |
144 print '\n'.join(sorted(files)) | 159 print '\n'.join(sorted(files)) |
145 print diff | 160 print diff |
146 | 161 |
147 return 1 if files_with_given_differences or different_source_list else 0 | 162 return 1 if files_with_given_differences or different_source_list else 0 |
148 | 163 |
149 | 164 |
150 if __name__ == '__main__': | 165 if __name__ == '__main__': |
151 sys.exit(main()) | 166 sys.exit(main()) |
OLD | NEW |