OLD | NEW |
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 15 matching lines...) Expand all Loading... |
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>; | 34 using TargetToFileList = std::unordered_map<const Target*, Target::FileList>; |
35 using TargetToTarget = std::unordered_map<const Target*, const Target*>; | 35 using TargetToTarget = std::unordered_map<const Target*, const Target*>; |
| 36 using TargetToPBXTarget = std::unordered_map<const Target*, PBXTarget*>; |
36 | 37 |
37 const char kEarlGreyFileNameIdentifier[] = "egtest.mm"; | 38 const char kEarlGreyFileNameIdentifier[] = "egtest.mm"; |
38 const char kXCTestFileNameIdentifier[] = "xctest.mm"; | 39 const char kXCTestFileNameIdentifier[] = "xctest.mm"; |
39 const char kXCTestModuleTargetNamePostfix[] = "_module"; | 40 const char kXCTestModuleTargetNamePostfix[] = "_module"; |
40 | 41 |
41 struct SafeEnvironmentVariableInfo { | 42 struct SafeEnvironmentVariableInfo { |
42 const char* name; | 43 const char* name; |
43 bool capture_at_generation; | 44 bool capture_at_generation; |
44 }; | 45 }; |
45 | 46 |
(...skipping 407 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
453 DCHECK_EQ(xctest_module_targets.size(), xctest_application_targets.size()); | 454 DCHECK_EQ(xctest_module_targets.size(), xctest_application_targets.size()); |
454 DCHECK_EQ(xctest_module_targets.size(), | 455 DCHECK_EQ(xctest_module_targets.size(), |
455 xctest_module_to_application_target.size()); | 456 xctest_module_to_application_target.size()); |
456 | 457 |
457 TargetToFileList xctest_files_per_application_target; | 458 TargetToFileList xctest_files_per_application_target; |
458 FindXCTestFilesForApplicationTargets(xctest_application_targets, | 459 FindXCTestFilesForApplicationTargets(xctest_application_targets, |
459 &xctest_files_per_application_target); | 460 &xctest_files_per_application_target); |
460 DCHECK_EQ(xctest_application_targets.size(), | 461 DCHECK_EQ(xctest_application_targets.size(), |
461 xctest_files_per_application_target.size()); | 462 xctest_files_per_application_target.size()); |
462 | 463 |
| 464 TargetToPBXTarget bundle_target_to_pbxtarget; |
| 465 |
463 std::string build_path; | 466 std::string build_path; |
464 std::unique_ptr<base::Environment> env(base::Environment::Create()); | 467 std::unique_ptr<base::Environment> env(base::Environment::Create()); |
465 | 468 |
466 main_project->AddAggregateTarget( | 469 main_project->AddAggregateTarget( |
467 "All", GetBuildScript(root_target, ninja_extra_args, env.get())); | 470 "All", GetBuildScript(root_target, ninja_extra_args, env.get())); |
468 | 471 |
469 for (const Target* target : targets) { | 472 for (const Target* target : targets) { |
470 switch (target->output_type()) { | 473 switch (target->output_type()) { |
471 case Target::EXECUTABLE: | 474 case Target::EXECUTABLE: |
472 if (target_os == XcodeWriter::WRITER_TARGET_OS_IOS) | 475 if (target_os == XcodeWriter::WRITER_TARGET_OS_IOS) |
(...skipping 25 matching lines...) Expand all Loading... |
498 | 501 |
499 PBXNativeTarget* native_target = main_project->AddNativeTarget( | 502 PBXNativeTarget* native_target = main_project->AddNativeTarget( |
500 target->label().name(), std::string(), | 503 target->label().name(), std::string(), |
501 RebasePath(target->bundle_data() | 504 RebasePath(target->bundle_data() |
502 .GetBundleRootDirOutput(target->settings()) | 505 .GetBundleRootDirOutput(target->settings()) |
503 .value(), | 506 .value(), |
504 build_settings->build_dir()), | 507 build_settings->build_dir()), |
505 target->bundle_data().product_type(), | 508 target->bundle_data().product_type(), |
506 GetBuildScript(target->label().name(), ninja_extra_args, env.get()), | 509 GetBuildScript(target->label().name(), ninja_extra_args, env.get()), |
507 extra_attributes); | 510 extra_attributes); |
| 511 bundle_target_to_pbxtarget.insert( |
| 512 std::make_pair(target, native_target)); |
508 | 513 |
509 if (!IsXCTestModuleTarget(target)) | 514 if (!IsXCTestModuleTarget(target)) |
510 continue; | 515 continue; |
511 | 516 |
512 // Add xctest files to the "Compiler Sources" of corresponding xctest | 517 // Add xctest files to the "Compiler Sources" of corresponding xctest |
513 // native targets. | 518 // native targets. |
514 const Target::FileList& xctest_file_list = | 519 const Target::FileList& xctest_file_list = |
515 xctest_files_per_application_target | 520 xctest_files_per_application_target |
516 [xctest_module_to_application_target[target]]; | 521 [xctest_module_to_application_target[target]]; |
517 | 522 |
(...skipping 10 matching lines...) Expand all Loading... |
528 } | 533 } |
529 | 534 |
530 break; | 535 break; |
531 } | 536 } |
532 | 537 |
533 default: | 538 default: |
534 break; | 539 break; |
535 } | 540 } |
536 } | 541 } |
537 | 542 |
| 543 // Add corresponding application target as dependency of xctest module target |
| 544 // so that application target is re-compiled when compiling xctest module |
| 545 // target. |
| 546 for (const Target* target : targets) { |
| 547 if (target->output_type() != Target::CREATE_BUNDLE) |
| 548 continue; |
| 549 if (!IsXCTestModuleTarget(target)) |
| 550 continue; |
| 551 |
| 552 const Target* application_target = |
| 553 FindXCTestApplicationTarget(target, targets); |
| 554 PBXTarget* application_pbxtarget = |
| 555 bundle_target_to_pbxtarget[application_target]; |
| 556 DCHECK(application_pbxtarget); |
| 557 PBXTarget* xctest_module_pbxtarget = bundle_target_to_pbxtarget[target]; |
| 558 DCHECK(xctest_module_pbxtarget); |
| 559 |
| 560 std::unique_ptr<PBXContainerItemProxy> container_item_proxy( |
| 561 new PBXContainerItemProxy(main_project.get(), application_pbxtarget)); |
| 562 std::unique_ptr<PBXTargetDependency> dependency(new PBXTargetDependency( |
| 563 application_pbxtarget, std::move(container_item_proxy))); |
| 564 |
| 565 xctest_module_pbxtarget->AddDependency(std::move(dependency)); |
| 566 } |
| 567 |
538 projects_.push_back(std::move(main_project)); | 568 projects_.push_back(std::move(main_project)); |
539 } | 569 } |
540 | 570 |
541 bool XcodeWriter::WriteFiles(const BuildSettings* build_settings, Err* err) { | 571 bool XcodeWriter::WriteFiles(const BuildSettings* build_settings, Err* err) { |
542 for (const auto& project : projects_) { | 572 for (const auto& project : projects_) { |
543 if (!WriteProjectFile(build_settings, project.get(), err)) | 573 if (!WriteProjectFile(build_settings, project.get(), err)) |
544 return false; | 574 return false; |
545 } | 575 } |
546 | 576 |
547 SourceFile xcworkspacedata_file = | 577 SourceFile xcworkspacedata_file = |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
606 for (auto* object : pair.second) { | 636 for (auto* object : pair.second) { |
607 object->Print(out, 2); | 637 object->Print(out, 2); |
608 } | 638 } |
609 out << "/* End " << ToString(pair.first) << " section */\n"; | 639 out << "/* End " << ToString(pair.first) << " section */\n"; |
610 } | 640 } |
611 | 641 |
612 out << "\t};\n" | 642 out << "\t};\n" |
613 << "\trootObject = " << project->Reference() << ";\n" | 643 << "\trootObject = " << project->Reference() << ";\n" |
614 << "}\n"; | 644 << "}\n"; |
615 } | 645 } |
OLD | NEW |