Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
| 2 # Copyright 2017 The Chromium Authors. All rights reserved. | 2 # Copyright 2017 The Chromium Authors. All rights reserved. |
| 3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
| 4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
| 5 | 5 |
| 6 """Find header files missing in GN. | 6 """Find header files missing in GN. |
| 7 | 7 |
| 8 This script gets all the header files from ninja_deps, which is from the true | 8 This script gets all the header files from ninja_deps, which is from the true |
| 9 dependency generated by the compiler, and report if they don't exist in GN. | 9 dependency generated by the compiler, and report if they don't exist in GN. |
| 10 """ | 10 """ |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 100 | 100 |
| 101 def ParseWhiteList(whitelist): | 101 def ParseWhiteList(whitelist): |
| 102 out = set() | 102 out = set() |
| 103 for line in whitelist.split('\n'): | 103 for line in whitelist.split('\n'): |
| 104 line = re.sub(r'#.*', '', line).strip() | 104 line = re.sub(r'#.*', '', line).strip() |
| 105 if line: | 105 if line: |
| 106 out.add(line) | 106 out.add(line) |
| 107 return out | 107 return out |
| 108 | 108 |
| 109 | 109 |
| 110 def FilterOutDepsedRepo(files, deps): | |
|
Nico
2017/04/28 20:31:19
a) isn't this slow? i would've thought that deps h
wychen
2017/04/28 22:04:43
This is asymptotically slow, but only takes <0.1se
| |
| 111 return {f for f in files if not any(f.startswith(d) for d in deps)} | |
| 112 | |
| 113 | |
| 114 def GetNonExistingFiles(lst): | |
| 115 out = set() | |
| 116 for f in lst: | |
| 117 if not os.path.isfile(f): | |
| 118 out.add(f) | |
| 119 return out | |
| 120 | |
| 121 | |
| 110 def main(): | 122 def main(): |
| 111 parser = argparse.ArgumentParser() | 123 parser = argparse.ArgumentParser() |
| 112 parser.add_argument('--out-dir', default='out/Release') | 124 parser.add_argument('--out-dir', default='out/Release') |
| 113 parser.add_argument('--json') | 125 parser.add_argument('--json') |
| 114 parser.add_argument('--whitelist') | 126 parser.add_argument('--whitelist') |
| 115 parser.add_argument('args', nargs=argparse.REMAINDER) | 127 parser.add_argument('args', nargs=argparse.REMAINDER) |
| 116 | 128 |
| 117 args, _extras = parser.parse_known_args() | 129 args, _extras = parser.parse_known_args() |
| 118 | 130 |
| 119 d_q = Queue() | 131 d_q = Queue() |
| 120 d_p = Process(target=GetHeadersFromNinja, args=(args.out_dir, d_q,)) | 132 d_p = Process(target=GetHeadersFromNinja, args=(args.out_dir, d_q,)) |
| 121 d_p.start() | 133 d_p.start() |
| 122 | 134 |
| 123 gn_q = Queue() | 135 gn_q = Queue() |
| 124 gn_p = Process(target=GetHeadersFromGN, args=(args.out_dir, gn_q,)) | 136 gn_p = Process(target=GetHeadersFromGN, args=(args.out_dir, gn_q,)) |
| 125 gn_p.start() | 137 gn_p.start() |
| 126 | 138 |
| 127 deps_q = Queue() | 139 deps_q = Queue() |
| 128 deps_p = Process(target=GetDepsPrefixes, args=(deps_q,)) | 140 deps_p = Process(target=GetDepsPrefixes, args=(deps_q,)) |
| 129 deps_p.start() | 141 deps_p.start() |
| 130 | 142 |
| 131 d = d_q.get() | 143 d = d_q.get() |
| 144 assert len(GetNonExistingFiles(d)) == 0, \ | |
| 145 'Found non-existing files in ninja deps' | |
| 132 gn = gn_q.get() | 146 gn = gn_q.get() |
| 133 missing = d - gn | 147 missing = d - gn |
| 148 extra = GetNonExistingFiles(gn) | |
| 134 | 149 |
| 135 deps = deps_q.get() | 150 deps = deps_q.get() |
| 136 missing = {m for m in missing if not any(m.startswith(d) for d in deps)} | 151 missing = FilterOutDepsedRepo(missing, deps) |
| 152 extra = FilterOutDepsedRepo(extra, deps) | |
| 137 | 153 |
| 138 d_p.join() | 154 d_p.join() |
| 139 gn_p.join() | 155 gn_p.join() |
| 140 deps_p.join() | 156 deps_p.join() |
| 141 | 157 |
| 142 if args.whitelist: | 158 if args.whitelist: |
| 143 whitelist = ParseWhiteList(open(args.whitelist).read()) | 159 whitelist = ParseWhiteList(open(args.whitelist).read()) |
| 144 missing -= whitelist | 160 missing -= whitelist |
| 145 | 161 |
| 146 missing = sorted(missing) | 162 missing = sorted(missing) |
| 163 extra = sorted(extra) | |
| 147 | 164 |
| 148 if args.json: | 165 if args.json: |
| 149 with open(args.json, 'w') as f: | 166 with open(args.json, 'w') as f: |
| 150 json.dump(missing, f) | 167 json.dump(missing, f) |
| 151 | 168 |
| 152 if len(missing) == 0: | 169 if len(missing) == 0 and len(extra) == 0: |
| 153 return 0 | 170 return 0 |
| 154 | 171 |
| 155 print 'The following files should be included in gn files:' | 172 if len(missing) > 0: |
| 156 for i in missing: | 173 print '\nThe following files should be included in gn files:' |
| 157 print i | 174 for i in missing: |
| 175 print i | |
| 176 | |
| 177 if len(extra) > 0: | |
| 178 print '\nThe following files should be removed from gn files:' | |
| 179 for i in extra: | |
| 180 print i | |
| 181 | |
| 158 return 1 | 182 return 1 |
| 159 | 183 |
| 160 | 184 |
| 161 if __name__ == '__main__': | 185 if __name__ == '__main__': |
| 162 sys.exit(main()) | 186 sys.exit(main()) |
| OLD | NEW |