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 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
105 | 105 |
106 def ParseWhiteList(whitelist): | 106 def ParseWhiteList(whitelist): |
107 out = set() | 107 out = set() |
108 for line in whitelist.split('\n'): | 108 for line in whitelist.split('\n'): |
109 line = re.sub(r'#.*', '', line).strip() | 109 line = re.sub(r'#.*', '', line).strip() |
110 if line: | 110 if line: |
111 out.add(line) | 111 out.add(line) |
112 return out | 112 return out |
113 | 113 |
114 | 114 |
| 115 def FilterOutDepsedRepo(files, deps): |
| 116 return {f for f in files if not any(f.startswith(d) for d in deps)} |
| 117 |
| 118 |
| 119 def GetNonExistingFiles(lst): |
| 120 out = set() |
| 121 for f in lst: |
| 122 if not os.path.isfile(f): |
| 123 out.add(f) |
| 124 return out |
| 125 |
| 126 |
115 def main(): | 127 def main(): |
116 parser = argparse.ArgumentParser() | 128 parser = argparse.ArgumentParser() |
117 parser.add_argument('--out-dir', default='out/Release') | 129 parser.add_argument('--out-dir', default='out/Release') |
118 parser.add_argument('--json') | 130 parser.add_argument('--json') |
119 parser.add_argument('--whitelist') | 131 parser.add_argument('--whitelist') |
120 parser.add_argument('args', nargs=argparse.REMAINDER) | 132 parser.add_argument('args', nargs=argparse.REMAINDER) |
121 | 133 |
122 args, _extras = parser.parse_known_args() | 134 args, _extras = parser.parse_known_args() |
123 | 135 |
124 d_q = Queue() | 136 d_q = Queue() |
125 d_p = Process(target=GetHeadersFromNinja, args=(args.out_dir, d_q,)) | 137 d_p = Process(target=GetHeadersFromNinja, args=(args.out_dir, d_q,)) |
126 d_p.start() | 138 d_p.start() |
127 | 139 |
128 gn_q = Queue() | 140 gn_q = Queue() |
129 gn_p = Process(target=GetHeadersFromGN, args=(args.out_dir, gn_q,)) | 141 gn_p = Process(target=GetHeadersFromGN, args=(args.out_dir, gn_q,)) |
130 gn_p.start() | 142 gn_p.start() |
131 | 143 |
132 deps_q = Queue() | 144 deps_q = Queue() |
133 deps_p = Process(target=GetDepsPrefixes, args=(deps_q,)) | 145 deps_p = Process(target=GetDepsPrefixes, args=(deps_q,)) |
134 deps_p.start() | 146 deps_p.start() |
135 | 147 |
136 d = d_q.get() | 148 d = d_q.get() |
| 149 assert len(GetNonExistingFiles(d)) == 0, \ |
| 150 'Found non-existing files in ninja deps' |
137 gn = gn_q.get() | 151 gn = gn_q.get() |
138 missing = d - gn | 152 missing = d - gn |
| 153 nonexisting = GetNonExistingFiles(gn) |
139 | 154 |
140 deps = deps_q.get() | 155 deps = deps_q.get() |
141 missing = {m for m in missing if not any(m.startswith(d) for d in deps)} | 156 missing = FilterOutDepsedRepo(missing, deps) |
| 157 nonexisting = FilterOutDepsedRepo(nonexisting, deps) |
142 | 158 |
143 d_p.join() | 159 d_p.join() |
144 gn_p.join() | 160 gn_p.join() |
145 deps_p.join() | 161 deps_p.join() |
146 | 162 |
147 if args.whitelist: | 163 if args.whitelist: |
148 whitelist = ParseWhiteList(open(args.whitelist).read()) | 164 whitelist = ParseWhiteList(open(args.whitelist).read()) |
149 missing -= whitelist | 165 missing -= whitelist |
150 | 166 |
151 missing = sorted(missing) | 167 missing = sorted(missing) |
| 168 nonexisting = sorted(nonexisting) |
152 | 169 |
153 if args.json: | 170 if args.json: |
154 with open(args.json, 'w') as f: | 171 with open(args.json, 'w') as f: |
155 json.dump(missing, f) | 172 json.dump(missing, f) |
156 | 173 |
157 if len(missing) == 0: | 174 if len(missing) == 0 and len(nonexisting) == 0: |
158 return 0 | 175 return 0 |
159 | 176 |
160 print 'The following files should be included in gn files:' | 177 if len(missing) > 0: |
161 for i in missing: | 178 print '\nThe following files should be included in gn files:' |
162 print i | 179 for i in missing: |
| 180 print i |
| 181 |
| 182 if len(nonexisting) > 0: |
| 183 print '\nThe following non-existing files should be removed from gn files:' |
| 184 for i in nonexisting: |
| 185 print i |
| 186 |
163 return 1 | 187 return 1 |
164 | 188 |
165 | 189 |
166 if __name__ == '__main__': | 190 if __name__ == '__main__': |
167 sys.exit(main()) | 191 sys.exit(main()) |
OLD | NEW |