Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(9)

Side by Side Diff: tools/gn/xcode_writer.cc

Issue 2574643002: Add functionality to find xctest files under application target. (Closed)
Patch Set: Addressed feedback Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « tools/gn/xcode_writer.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "tools/gn/xcode_writer.h" 5 #include "tools/gn/xcode_writer.h"
6 6
7 #include <iomanip> 7 #include <iomanip>
8 #include <map> 8 #include <map>
9 #include <memory> 9 #include <memory>
10 #include <sstream> 10 #include <sstream>
(...skipping 13 matching lines...) Expand all
24 #include "tools/gn/filesystem_utils.h" 24 #include "tools/gn/filesystem_utils.h"
25 #include "tools/gn/settings.h" 25 #include "tools/gn/settings.h"
26 #include "tools/gn/source_file.h" 26 #include "tools/gn/source_file.h"
27 #include "tools/gn/target.h" 27 #include "tools/gn/target.h"
28 #include "tools/gn/value.h" 28 #include "tools/gn/value.h"
29 #include "tools/gn/variables.h" 29 #include "tools/gn/variables.h"
30 #include "tools/gn/xcode_object.h" 30 #include "tools/gn/xcode_object.h"
31 31
32 namespace { 32 namespace {
33 33
34 using TargetToFileList = std::unordered_map<const Target*, Target::FileList>;
35
36 const char kEarlGreyFileNameIdentifier[] = "egtest.mm";
37
justincohen 2016/12/15 00:30:24 Is there a better, less sticky way of finding Xcte
34 struct SafeEnvironmentVariableInfo { 38 struct SafeEnvironmentVariableInfo {
35 const char* name; 39 const char* name;
36 bool capture_at_generation; 40 bool capture_at_generation;
37 }; 41 };
38 42
39 SafeEnvironmentVariableInfo kSafeEnvironmentVariables[] = { 43 SafeEnvironmentVariableInfo kSafeEnvironmentVariables[] = {
40 {"HOME", true}, {"LANG", true}, {"PATH", true}, 44 {"HOME", true}, {"LANG", true}, {"PATH", true},
41 {"USER", true}, {"TMPDIR", false}, 45 {"USER", true}, {"TMPDIR", false},
42 }; 46 };
43 47
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
79 83
80 script << "ninja -C ."; 84 script << "ninja -C .";
81 if (!ninja_extra_args.empty()) 85 if (!ninja_extra_args.empty())
82 script << " " << ninja_extra_args; 86 script << " " << ninja_extra_args;
83 if (!target_name.empty()) 87 if (!target_name.empty())
84 script << " " << target_name; 88 script << " " << target_name;
85 script << "\nexit 1\n"; 89 script << "\nexit 1\n";
86 return script.str(); 90 return script.str();
87 } 91 }
88 92
93 // Finds the list of earl grey files recursively under |target|.
94 void GetEarlGreyFiles(const Target* target,
95 TargetToFileList* eg_files_per_target) {
96 // Early return if already visited and processed.
97 if (eg_files_per_target->find(target) != eg_files_per_target->end())
98 return;
99
100 Target::FileList eg_files;
101 for (const SourceFile& file : target->sources()) {
102 if (base::EndsWith(file.GetName(), kEarlGreyFileNameIdentifier,
103 base::CompareCase::SENSITIVE)) {
104 eg_files.push_back(file);
105 }
106 }
107
108 // Call recursively on public and private deps.
109 for (const auto& target : target->public_deps()) {
110 GetEarlGreyFiles(target.ptr, eg_files_per_target);
111 const Target::FileList& deps_eg_files = (*eg_files_per_target)[target.ptr];
112 eg_files.insert(eg_files.end(), deps_eg_files.begin(), deps_eg_files.end());
113 }
114
115 for (const auto& target : target->private_deps()) {
116 GetEarlGreyFiles(target.ptr, eg_files_per_target);
117 const Target::FileList& deps_eg_files = (*eg_files_per_target)[target.ptr];
118 eg_files.insert(eg_files.end(), deps_eg_files.begin(), deps_eg_files.end());
119 }
120
121 // Sort eg_files to remove duplicates.
122 std::sort(eg_files.begin(), eg_files.end());
123 eg_files.erase(std::unique(eg_files.begin(), eg_files.end()), eg_files.end());
124
125 eg_files_per_target->insert(std::make_pair(target, eg_files));
126 }
127
128 // Finds the list of earl grey files recursively under each of the application
129 // target.
130 void GetEarlGreyFilesForAll(
131 const std::vector<const Target*>& application_targets,
132 std::vector<Target::FileList>* file_lists) {
133 TargetToFileList eg_files_per_target;
134
135 for (const Target* target : application_targets) {
136 GetEarlGreyFiles(target, &eg_files_per_target);
137 file_lists->push_back(eg_files_per_target[target]);
138 }
139 }
140
141 bool IsApplicationTarget(const Target* target) {
142 return target->output_type() == Target::CREATE_BUNDLE &&
143 target->bundle_data().product_type() ==
144 "com.apple.product-type.application";
145 }
146
89 class CollectPBXObjectsPerClassHelper : public PBXObjectVisitor { 147 class CollectPBXObjectsPerClassHelper : public PBXObjectVisitor {
90 public: 148 public:
91 CollectPBXObjectsPerClassHelper() {} 149 CollectPBXObjectsPerClassHelper() {}
92 150
93 void Visit(PBXObject* object) override { 151 void Visit(PBXObject* object) override {
94 DCHECK(object); 152 DCHECK(object);
95 objects_per_class_[object->Class()].push_back(object); 153 objects_per_class_[object->Class()].push_back(object);
96 } 154 }
97 155
98 const std::map<PBXObjectClass, std::vector<const PBXObject*>>& 156 const std::map<PBXObjectClass, std::vector<const PBXObject*>>&
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after
259 // Sort the list of targets per-label to get a consistent ordering of them 317 // Sort the list of targets per-label to get a consistent ordering of them
260 // in the generated Xcode project (and thus stability of the file generated). 318 // in the generated Xcode project (and thus stability of the file generated).
261 std::sort(targets->begin(), targets->end(), 319 std::sort(targets->begin(), targets->end(),
262 [](const Target* a, const Target* b) { 320 [](const Target* a, const Target* b) {
263 return a->label().name() < b->label().name(); 321 return a->label().name() < b->label().name();
264 }); 322 });
265 323
266 return true; 324 return true;
267 } 325 }
268 326
327 // static
328 void XcodeWriter::FilterApplicationTargets(
329 const std::vector<const Target*>& targets,
330 std::vector<const Target*>* application_targets) {
331 // Filter out all targets of type CREATE_BUNDLE and whose bundle_data has
332 // product_type: "com.apple.product-type.application".
333 for (const Target* target : targets) {
334 if (!IsApplicationTarget(target))
335 continue;
336
337 application_targets->push_back(target);
338 }
339 }
340
269 void XcodeWriter::CreateProductsProject( 341 void XcodeWriter::CreateProductsProject(
270 const std::vector<const Target*>& targets, 342 const std::vector<const Target*>& targets,
271 const PBXAttributes& attributes, 343 const PBXAttributes& attributes,
272 const std::string& source_path, 344 const std::string& source_path,
273 const std::string& config_name, 345 const std::string& config_name,
274 const std::string& root_target, 346 const std::string& root_target,
275 const std::string& ninja_extra_args, 347 const std::string& ninja_extra_args,
276 const BuildSettings* build_settings, 348 const BuildSettings* build_settings,
277 TargetOsType target_os) { 349 TargetOsType target_os) {
278 std::unique_ptr<PBXProject> main_project( 350 std::unique_ptr<PBXProject> main_project(
279 new PBXProject("products", config_name, source_path, attributes)); 351 new PBXProject("products", config_name, source_path, attributes));
280 352
353 // Filter application targets and find list of earl grey test files
354 // recursively under them.
355 std::vector<const Target*> xctest_targets;
356 std::vector<const Target*> application_targets;
357 std::vector<Target::FileList> earl_grey_file_lists;
358 XcodeWriter::FilterApplicationTargets(targets, &application_targets);
359 GetEarlGreyFilesForAll(application_targets, &earl_grey_file_lists);
360
281 std::string build_path; 361 std::string build_path;
282 std::unique_ptr<base::Environment> env(base::Environment::Create()); 362 std::unique_ptr<base::Environment> env(base::Environment::Create());
283 363
284 main_project->AddAggregateTarget( 364 main_project->AddAggregateTarget(
285 "All", GetBuildScript(root_target, ninja_extra_args, env.get())); 365 "All", GetBuildScript(root_target, ninja_extra_args, env.get()));
286 366
287 for (const Target* target : targets) { 367 for (const Target* target : targets) {
288 switch (target->output_type()) { 368 switch (target->output_type()) {
289 case Target::EXECUTABLE: 369 case Target::EXECUTABLE:
290 if (target_os == XcodeWriter::WRITER_TARGET_OS_IOS) 370 if (target_os == XcodeWriter::WRITER_TARGET_OS_IOS)
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
427 for (auto* object : pair.second) { 507 for (auto* object : pair.second) {
428 object->Print(out, 2); 508 object->Print(out, 2);
429 } 509 }
430 out << "/* End " << ToString(pair.first) << " section */\n"; 510 out << "/* End " << ToString(pair.first) << " section */\n";
431 } 511 }
432 512
433 out << "\t};\n" 513 out << "\t};\n"
434 << "\trootObject = " << project->Reference() << ";\n" 514 << "\trootObject = " << project->Reference() << ";\n"
435 << "}\n"; 515 << "}\n";
436 } 516 }
OLDNEW
« no previous file with comments | « tools/gn/xcode_writer.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698