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

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

Issue 2940873002: Implement tracking of BUILD.gn files used to define target, toolchain or (Closed)
Patch Set: Fix compilation after rebase. Created 3 years, 5 months 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/target_generator.cc ('k') | tools/gn/test_with_scope.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 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/target.h" 5 #include "tools/gn/target.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "testing/gtest/include/gtest/gtest.h" 9 #include "testing/gtest/include/gtest/gtest.h"
10 #include "tools/gn/build_settings.h" 10 #include "tools/gn/build_settings.h"
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
84 Err err; 84 Err err;
85 85
86 // Set up a dependency chain of a -> b -> c 86 // Set up a dependency chain of a -> b -> c
87 TestTarget a(setup, "//foo:a", Target::EXECUTABLE); 87 TestTarget a(setup, "//foo:a", Target::EXECUTABLE);
88 TestTarget b(setup, "//foo:b", Target::STATIC_LIBRARY); 88 TestTarget b(setup, "//foo:b", Target::STATIC_LIBRARY);
89 TestTarget c(setup, "//foo:c", Target::STATIC_LIBRARY); 89 TestTarget c(setup, "//foo:c", Target::STATIC_LIBRARY);
90 a.private_deps().push_back(LabelTargetPair(&b)); 90 a.private_deps().push_back(LabelTargetPair(&b));
91 b.private_deps().push_back(LabelTargetPair(&c)); 91 b.private_deps().push_back(LabelTargetPair(&c));
92 92
93 // Normal non-inherited config. 93 // Normal non-inherited config.
94 Config config(setup.settings(), Label(SourceDir("//foo/"), "config")); 94 Config config(setup.settings(), Label(SourceDir("//foo/"), "config"), {});
95 ASSERT_TRUE(config.OnResolved(&err)); 95 ASSERT_TRUE(config.OnResolved(&err));
96 c.configs().push_back(LabelConfigPair(&config)); 96 c.configs().push_back(LabelConfigPair(&config));
97 97
98 // All dependent config. 98 // All dependent config.
99 Config all(setup.settings(), Label(SourceDir("//foo/"), "all")); 99 Config all(setup.settings(), Label(SourceDir("//foo/"), "all"), {});
100 ASSERT_TRUE(all.OnResolved(&err)); 100 ASSERT_TRUE(all.OnResolved(&err));
101 c.all_dependent_configs().push_back(LabelConfigPair(&all)); 101 c.all_dependent_configs().push_back(LabelConfigPair(&all));
102 102
103 // Direct dependent config. 103 // Direct dependent config.
104 Config direct(setup.settings(), Label(SourceDir("//foo/"), "direct")); 104 Config direct(setup.settings(), Label(SourceDir("//foo/"), "direct"), {});
105 ASSERT_TRUE(direct.OnResolved(&err)); 105 ASSERT_TRUE(direct.OnResolved(&err));
106 c.public_configs().push_back(LabelConfigPair(&direct)); 106 c.public_configs().push_back(LabelConfigPair(&direct));
107 107
108 ASSERT_TRUE(c.OnResolved(&err)); 108 ASSERT_TRUE(c.OnResolved(&err));
109 ASSERT_TRUE(b.OnResolved(&err)); 109 ASSERT_TRUE(b.OnResolved(&err));
110 ASSERT_TRUE(a.OnResolved(&err)); 110 ASSERT_TRUE(a.OnResolved(&err));
111 111
112 // B should have gotten both dependent configs from C. 112 // B should have gotten both dependent configs from C.
113 ASSERT_EQ(2u, b.configs().size()); 113 ASSERT_EQ(2u, b.configs().size());
114 EXPECT_EQ(&all, b.configs()[0].ptr); 114 EXPECT_EQ(&all, b.configs()[0].ptr);
(...skipping 22 matching lines...) Expand all
137 EXPECT_EQ(&all, a_fwd.all_dependent_configs()[0].ptr); 137 EXPECT_EQ(&all, a_fwd.all_dependent_configs()[0].ptr);
138 } 138 }
139 139
140 // Tests that dependent configs don't propagate between toolchains. 140 // Tests that dependent configs don't propagate between toolchains.
141 TEST(Target, NoDependentConfigsBetweenToolchains) { 141 TEST(Target, NoDependentConfigsBetweenToolchains) {
142 TestWithScope setup; 142 TestWithScope setup;
143 Err err; 143 Err err;
144 144
145 // Create another toolchain. 145 // Create another toolchain.
146 Toolchain other_toolchain(setup.settings(), 146 Toolchain other_toolchain(setup.settings(),
147 Label(SourceDir("//other/"), "toolchain")); 147 Label(SourceDir("//other/"), "toolchain"), {});
148 TestWithScope::SetupToolchain(&other_toolchain); 148 TestWithScope::SetupToolchain(&other_toolchain);
149 149
150 // Set up a dependency chain of |a| -> |b| -> |c| where |a| has a different 150 // Set up a dependency chain of |a| -> |b| -> |c| where |a| has a different
151 // toolchain. 151 // toolchain.
152 Target a(setup.settings(), 152 Target a(setup.settings(),
153 Label(SourceDir("//foo/"), "a", other_toolchain.label().dir(), 153 Label(SourceDir("//foo/"), "a", other_toolchain.label().dir(),
154 other_toolchain.label().name())); 154 other_toolchain.label().name()),
155 {});
155 a.set_output_type(Target::EXECUTABLE); 156 a.set_output_type(Target::EXECUTABLE);
156 EXPECT_TRUE(a.SetToolchain(&other_toolchain, &err)); 157 EXPECT_TRUE(a.SetToolchain(&other_toolchain, &err));
157 TestTarget b(setup, "//foo:b", Target::EXECUTABLE); 158 TestTarget b(setup, "//foo:b", Target::EXECUTABLE);
158 TestTarget c(setup, "//foo:c", Target::SOURCE_SET); 159 TestTarget c(setup, "//foo:c", Target::SOURCE_SET);
159 a.private_deps().push_back(LabelTargetPair(&b)); 160 a.private_deps().push_back(LabelTargetPair(&b));
160 b.private_deps().push_back(LabelTargetPair(&c)); 161 b.private_deps().push_back(LabelTargetPair(&c));
161 162
162 // All dependent config. 163 // All dependent config.
163 Config all_dependent(setup.settings(), Label(SourceDir("//foo/"), "all")); 164 Config all_dependent(setup.settings(), Label(SourceDir("//foo/"), "all"), {});
164 ASSERT_TRUE(all_dependent.OnResolved(&err)); 165 ASSERT_TRUE(all_dependent.OnResolved(&err));
165 c.all_dependent_configs().push_back(LabelConfigPair(&all_dependent)); 166 c.all_dependent_configs().push_back(LabelConfigPair(&all_dependent));
166 167
167 // Public config. 168 // Public config.
168 Config public_config(setup.settings(), Label(SourceDir("//foo/"), "public")); 169 Config public_config(setup.settings(), Label(SourceDir("//foo/"), "public"),
170 {});
169 ASSERT_TRUE(public_config.OnResolved(&err)); 171 ASSERT_TRUE(public_config.OnResolved(&err));
170 c.public_configs().push_back(LabelConfigPair(&public_config)); 172 c.public_configs().push_back(LabelConfigPair(&public_config));
171 173
172 // Another public config. 174 // Another public config.
173 Config public_config2(setup.settings(), 175 Config public_config2(setup.settings(), Label(SourceDir("//foo/"), "public2"),
174 Label(SourceDir("//foo/"), "public2")); 176 {});
175 ASSERT_TRUE(public_config2.OnResolved(&err)); 177 ASSERT_TRUE(public_config2.OnResolved(&err));
176 b.public_configs().push_back(LabelConfigPair(&public_config2)); 178 b.public_configs().push_back(LabelConfigPair(&public_config2));
177 179
178 ASSERT_TRUE(c.OnResolved(&err)); 180 ASSERT_TRUE(c.OnResolved(&err));
179 ASSERT_TRUE(b.OnResolved(&err)); 181 ASSERT_TRUE(b.OnResolved(&err));
180 ASSERT_TRUE(a.OnResolved(&err)); 182 ASSERT_TRUE(a.OnResolved(&err));
181 183
182 // B should have gotten the configs from C. 184 // B should have gotten the configs from C.
183 ASSERT_EQ(3u, b.configs().size()); 185 ASSERT_EQ(3u, b.configs().size());
184 EXPECT_EQ(&public_config2, b.configs()[0].ptr); 186 EXPECT_EQ(&public_config2, b.configs()[0].ptr);
(...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after
476 product.set_testonly(false); 478 product.set_testonly(false);
477 product.private_deps().push_back(LabelTargetPair(&testlib)); 479 product.private_deps().push_back(LabelTargetPair(&testlib));
478 ASSERT_FALSE(product.OnResolved(&err)); 480 ASSERT_FALSE(product.OnResolved(&err));
479 } 481 }
480 482
481 TEST(Target, PublicConfigs) { 483 TEST(Target, PublicConfigs) {
482 TestWithScope setup; 484 TestWithScope setup;
483 Err err; 485 Err err;
484 486
485 Label pub_config_label(SourceDir("//a/"), "pubconfig"); 487 Label pub_config_label(SourceDir("//a/"), "pubconfig");
486 Config pub_config(setup.settings(), pub_config_label); 488 Config pub_config(setup.settings(), pub_config_label, {});
487 LibFile lib_name("testlib"); 489 LibFile lib_name("testlib");
488 pub_config.own_values().libs().push_back(lib_name); 490 pub_config.own_values().libs().push_back(lib_name);
489 ASSERT_TRUE(pub_config.OnResolved(&err)); 491 ASSERT_TRUE(pub_config.OnResolved(&err));
490 492
491 // This is the destination target that has a public config. 493 // This is the destination target that has a public config.
492 TestTarget dest(setup, "//a:a", Target::SOURCE_SET); 494 TestTarget dest(setup, "//a:a", Target::SOURCE_SET);
493 dest.public_configs().push_back(LabelConfigPair(&pub_config)); 495 dest.public_configs().push_back(LabelConfigPair(&pub_config));
494 ASSERT_TRUE(dest.OnResolved(&err)); 496 ASSERT_TRUE(dest.OnResolved(&err));
495 497
496 // This target has a public dependency on dest. 498 // This target has a public dependency on dest.
(...skipping 21 matching lines...) Expand all
518 } 520 }
519 521
520 // Tests that configs are ordered properly between local and pulled ones. 522 // Tests that configs are ordered properly between local and pulled ones.
521 TEST(Target, ConfigOrdering) { 523 TEST(Target, ConfigOrdering) {
522 TestWithScope setup; 524 TestWithScope setup;
523 Err err; 525 Err err;
524 526
525 // Make Dep1. It has all_dependent_configs and public_configs. 527 // Make Dep1. It has all_dependent_configs and public_configs.
526 TestTarget dep1(setup, "//:dep1", Target::SOURCE_SET); 528 TestTarget dep1(setup, "//:dep1", Target::SOURCE_SET);
527 Label dep1_all_config_label(SourceDir("//"), "dep1_all_config"); 529 Label dep1_all_config_label(SourceDir("//"), "dep1_all_config");
528 Config dep1_all_config(setup.settings(), dep1_all_config_label); 530 Config dep1_all_config(setup.settings(), dep1_all_config_label, {});
529 ASSERT_TRUE(dep1_all_config.OnResolved(&err)); 531 ASSERT_TRUE(dep1_all_config.OnResolved(&err));
530 dep1.all_dependent_configs().push_back(LabelConfigPair(&dep1_all_config)); 532 dep1.all_dependent_configs().push_back(LabelConfigPair(&dep1_all_config));
531 533
532 Label dep1_public_config_label(SourceDir("//"), "dep1_public_config"); 534 Label dep1_public_config_label(SourceDir("//"), "dep1_public_config");
533 Config dep1_public_config(setup.settings(), dep1_public_config_label); 535 Config dep1_public_config(setup.settings(), dep1_public_config_label, {});
534 ASSERT_TRUE(dep1_public_config.OnResolved(&err)); 536 ASSERT_TRUE(dep1_public_config.OnResolved(&err));
535 dep1.public_configs().push_back(LabelConfigPair(&dep1_public_config)); 537 dep1.public_configs().push_back(LabelConfigPair(&dep1_public_config));
536 ASSERT_TRUE(dep1.OnResolved(&err)); 538 ASSERT_TRUE(dep1.OnResolved(&err));
537 539
538 // Make Dep2 with the same structure. 540 // Make Dep2 with the same structure.
539 TestTarget dep2(setup, "//:dep2", Target::SOURCE_SET); 541 TestTarget dep2(setup, "//:dep2", Target::SOURCE_SET);
540 Label dep2_all_config_label(SourceDir("//"), "dep2_all_config"); 542 Label dep2_all_config_label(SourceDir("//"), "dep2_all_config");
541 Config dep2_all_config(setup.settings(), dep2_all_config_label); 543 Config dep2_all_config(setup.settings(), dep2_all_config_label, {});
542 ASSERT_TRUE(dep2_all_config.OnResolved(&err)); 544 ASSERT_TRUE(dep2_all_config.OnResolved(&err));
543 dep2.all_dependent_configs().push_back(LabelConfigPair(&dep2_all_config)); 545 dep2.all_dependent_configs().push_back(LabelConfigPair(&dep2_all_config));
544 546
545 Label dep2_public_config_label(SourceDir("//"), "dep2_public_config"); 547 Label dep2_public_config_label(SourceDir("//"), "dep2_public_config");
546 Config dep2_public_config(setup.settings(), dep2_public_config_label); 548 Config dep2_public_config(setup.settings(), dep2_public_config_label, {});
547 ASSERT_TRUE(dep2_public_config.OnResolved(&err)); 549 ASSERT_TRUE(dep2_public_config.OnResolved(&err));
548 dep2.public_configs().push_back(LabelConfigPair(&dep2_public_config)); 550 dep2.public_configs().push_back(LabelConfigPair(&dep2_public_config));
549 ASSERT_TRUE(dep2.OnResolved(&err)); 551 ASSERT_TRUE(dep2.OnResolved(&err));
550 552
551 // This target depends on both previous targets. 553 // This target depends on both previous targets.
552 TestTarget target(setup, "//:foo", Target::SOURCE_SET); 554 TestTarget target(setup, "//:foo", Target::SOURCE_SET);
553 target.private_deps().push_back(LabelTargetPair(&dep1)); 555 target.private_deps().push_back(LabelTargetPair(&dep1));
554 target.private_deps().push_back(LabelTargetPair(&dep2)); 556 target.private_deps().push_back(LabelTargetPair(&dep2));
555 557
556 // It also has a private and public config. 558 // It also has a private and public config.
557 Label public_config_label(SourceDir("//"), "public"); 559 Label public_config_label(SourceDir("//"), "public");
558 Config public_config(setup.settings(), public_config_label); 560 Config public_config(setup.settings(), public_config_label, {});
559 ASSERT_TRUE(public_config.OnResolved(&err)); 561 ASSERT_TRUE(public_config.OnResolved(&err));
560 target.public_configs().push_back(LabelConfigPair(&public_config)); 562 target.public_configs().push_back(LabelConfigPair(&public_config));
561 563
562 Label private_config_label(SourceDir("//"), "private"); 564 Label private_config_label(SourceDir("//"), "private");
563 Config private_config(setup.settings(), private_config_label); 565 Config private_config(setup.settings(), private_config_label, {});
564 ASSERT_TRUE(private_config.OnResolved(&err)); 566 ASSERT_TRUE(private_config.OnResolved(&err));
565 target.configs().push_back(LabelConfigPair(&private_config)); 567 target.configs().push_back(LabelConfigPair(&private_config));
566 568
567 // Resolve to get the computed list of configs applying. 569 // Resolve to get the computed list of configs applying.
568 ASSERT_TRUE(target.OnResolved(&err)); 570 ASSERT_TRUE(target.OnResolved(&err));
569 const auto& computed = target.configs(); 571 const auto& computed = target.configs();
570 572
571 // Order should be: 573 // Order should be:
572 // 1. local private 574 // 1. local private
573 // 2. local public 575 // 2. local public
574 // 3. inherited all dependent 576 // 3. inherited all dependent
575 // 4. inherited public 577 // 4. inherited public
576 ASSERT_EQ(6u, computed.size()); 578 ASSERT_EQ(6u, computed.size());
577 EXPECT_EQ(private_config_label, computed[0].label); 579 EXPECT_EQ(private_config_label, computed[0].label);
578 EXPECT_EQ(public_config_label, computed[1].label); 580 EXPECT_EQ(public_config_label, computed[1].label);
579 EXPECT_EQ(dep1_all_config_label, computed[2].label); 581 EXPECT_EQ(dep1_all_config_label, computed[2].label);
580 EXPECT_EQ(dep2_all_config_label, computed[3].label); 582 EXPECT_EQ(dep2_all_config_label, computed[3].label);
581 EXPECT_EQ(dep1_public_config_label, computed[4].label); 583 EXPECT_EQ(dep1_public_config_label, computed[4].label);
582 EXPECT_EQ(dep2_public_config_label, computed[5].label); 584 EXPECT_EQ(dep2_public_config_label, computed[5].label);
583 } 585 }
584 586
585 // Tests that different link/depend outputs work for solink tools. 587 // Tests that different link/depend outputs work for solink tools.
586 TEST(Target, LinkAndDepOutputs) { 588 TEST(Target, LinkAndDepOutputs) {
587 TestWithScope setup; 589 TestWithScope setup;
588 Err err; 590 Err err;
589 591
590 Toolchain toolchain(setup.settings(), Label(SourceDir("//tc/"), "tc")); 592 Toolchain toolchain(setup.settings(), Label(SourceDir("//tc/"), "tc"), {});
591 593
592 std::unique_ptr<Tool> solink_tool(new Tool()); 594 std::unique_ptr<Tool> solink_tool(new Tool());
593 solink_tool->set_output_prefix("lib"); 595 solink_tool->set_output_prefix("lib");
594 solink_tool->set_default_output_extension(".so"); 596 solink_tool->set_default_output_extension(".so");
595 597
596 const char kLinkPattern[] = 598 const char kLinkPattern[] =
597 "{{root_out_dir}}/{{target_output_name}}{{output_extension}}"; 599 "{{root_out_dir}}/{{target_output_name}}{{output_extension}}";
598 SubstitutionPattern link_output = SubstitutionPattern::MakeForTest( 600 SubstitutionPattern link_output = SubstitutionPattern::MakeForTest(
599 kLinkPattern); 601 kLinkPattern);
600 solink_tool->set_link_output(link_output); 602 solink_tool->set_link_output(link_output);
601 603
602 const char kDependPattern[] = 604 const char kDependPattern[] =
603 "{{root_out_dir}}/{{target_output_name}}{{output_extension}}.TOC"; 605 "{{root_out_dir}}/{{target_output_name}}{{output_extension}}.TOC";
604 SubstitutionPattern depend_output = SubstitutionPattern::MakeForTest( 606 SubstitutionPattern depend_output = SubstitutionPattern::MakeForTest(
605 kDependPattern); 607 kDependPattern);
606 solink_tool->set_depend_output(depend_output); 608 solink_tool->set_depend_output(depend_output);
607 609
608 solink_tool->set_outputs(SubstitutionList::MakeForTest( 610 solink_tool->set_outputs(SubstitutionList::MakeForTest(
609 kLinkPattern, kDependPattern)); 611 kLinkPattern, kDependPattern));
610 612
611 toolchain.SetTool(Toolchain::TYPE_SOLINK, std::move(solink_tool)); 613 toolchain.SetTool(Toolchain::TYPE_SOLINK, std::move(solink_tool));
612 614
613 Target target(setup.settings(), Label(SourceDir("//a/"), "a")); 615 Target target(setup.settings(), Label(SourceDir("//a/"), "a"), {});
614 target.set_output_type(Target::SHARED_LIBRARY); 616 target.set_output_type(Target::SHARED_LIBRARY);
615 target.SetToolchain(&toolchain); 617 target.SetToolchain(&toolchain);
616 ASSERT_TRUE(target.OnResolved(&err)); 618 ASSERT_TRUE(target.OnResolved(&err));
617 619
618 EXPECT_EQ("./liba.so", target.link_output_file().value()); 620 EXPECT_EQ("./liba.so", target.link_output_file().value());
619 EXPECT_EQ("./liba.so.TOC", target.dependency_output_file().value()); 621 EXPECT_EQ("./liba.so.TOC", target.dependency_output_file().value());
620 622
621 ASSERT_EQ(1u, target.runtime_outputs().size()); 623 ASSERT_EQ(1u, target.runtime_outputs().size());
622 EXPECT_EQ("./liba.so", target.runtime_outputs()[0].value()); 624 EXPECT_EQ("./liba.so", target.runtime_outputs()[0].value());
623 } 625 }
624 626
625 // Tests that runtime_outputs works without an explicit link_output for 627 // Tests that runtime_outputs works without an explicit link_output for
626 // solink tools. 628 // solink tools.
627 TEST(Target, RuntimeOuputs) { 629 TEST(Target, RuntimeOuputs) {
628 TestWithScope setup; 630 TestWithScope setup;
629 Err err; 631 Err err;
630 632
631 Toolchain toolchain(setup.settings(), Label(SourceDir("//tc/"), "tc")); 633 Toolchain toolchain(setup.settings(), Label(SourceDir("//tc/"), "tc"), {});
632 634
633 std::unique_ptr<Tool> solink_tool(new Tool()); 635 std::unique_ptr<Tool> solink_tool(new Tool());
634 solink_tool->set_output_prefix(""); 636 solink_tool->set_output_prefix("");
635 solink_tool->set_default_output_extension(".dll"); 637 solink_tool->set_default_output_extension(".dll");
636 638
637 // Say the linker makes a DLL< an import library, and a symbol file we want 639 // Say the linker makes a DLL< an import library, and a symbol file we want
638 // to treat as a runtime output. 640 // to treat as a runtime output.
639 const char kLibPattern[] = 641 const char kLibPattern[] =
640 "{{root_out_dir}}/{{target_output_name}}{{output_extension}}.lib"; 642 "{{root_out_dir}}/{{target_output_name}}{{output_extension}}.lib";
641 const char kDllPattern[] = 643 const char kDllPattern[] =
642 "{{root_out_dir}}/{{target_output_name}}{{output_extension}}"; 644 "{{root_out_dir}}/{{target_output_name}}{{output_extension}}";
643 const char kPdbPattern[] = 645 const char kPdbPattern[] =
644 "{{root_out_dir}}/{{target_output_name}}.pdb"; 646 "{{root_out_dir}}/{{target_output_name}}.pdb";
645 SubstitutionPattern pdb_pattern = 647 SubstitutionPattern pdb_pattern =
646 SubstitutionPattern::MakeForTest(kPdbPattern); 648 SubstitutionPattern::MakeForTest(kPdbPattern);
647 649
648 solink_tool->set_outputs( 650 solink_tool->set_outputs(
649 SubstitutionList::MakeForTest(kLibPattern, kDllPattern, kPdbPattern)); 651 SubstitutionList::MakeForTest(kLibPattern, kDllPattern, kPdbPattern));
650 652
651 // Say we only want the DLL and symbol file treaded as runtime outputs. 653 // Say we only want the DLL and symbol file treaded as runtime outputs.
652 solink_tool->set_runtime_outputs(SubstitutionList::MakeForTest( 654 solink_tool->set_runtime_outputs(SubstitutionList::MakeForTest(
653 kDllPattern, kPdbPattern)); 655 kDllPattern, kPdbPattern));
654 656
655 toolchain.SetTool(Toolchain::TYPE_SOLINK, std::move(solink_tool)); 657 toolchain.SetTool(Toolchain::TYPE_SOLINK, std::move(solink_tool));
656 658
657 Target target(setup.settings(), Label(SourceDir("//a/"), "a")); 659 Target target(setup.settings(), Label(SourceDir("//a/"), "a"), {});
658 target.set_output_type(Target::SHARED_LIBRARY); 660 target.set_output_type(Target::SHARED_LIBRARY);
659 target.SetToolchain(&toolchain); 661 target.SetToolchain(&toolchain);
660 ASSERT_TRUE(target.OnResolved(&err)); 662 ASSERT_TRUE(target.OnResolved(&err));
661 663
662 EXPECT_EQ("./a.dll.lib", target.link_output_file().value()); 664 EXPECT_EQ("./a.dll.lib", target.link_output_file().value());
663 EXPECT_EQ("./a.dll.lib", target.dependency_output_file().value()); 665 EXPECT_EQ("./a.dll.lib", target.dependency_output_file().value());
664 666
665 ASSERT_EQ(2u, target.runtime_outputs().size()); 667 ASSERT_EQ(2u, target.runtime_outputs().size());
666 EXPECT_EQ("./a.dll", target.runtime_outputs()[0].value()); 668 EXPECT_EQ("./a.dll", target.runtime_outputs()[0].value());
667 EXPECT_EQ("./a.pdb", target.runtime_outputs()[1].value()); 669 EXPECT_EQ("./a.pdb", target.runtime_outputs()[1].value());
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after
864 final_target.inputs().push_back(object_file); 866 final_target.inputs().push_back(object_file);
865 EXPECT_TRUE(final_target.OnResolved(&err)); 867 EXPECT_TRUE(final_target.OnResolved(&err));
866 868
867 AssertSchedulerHasOneUnknownFileMatching(&final_target, object_file); 869 AssertSchedulerHasOneUnknownFileMatching(&final_target, object_file);
868 } 870 }
869 871
870 TEST(Target, ResolvePrecompiledHeaders) { 872 TEST(Target, ResolvePrecompiledHeaders) {
871 TestWithScope setup; 873 TestWithScope setup;
872 Err err; 874 Err err;
873 875
874 Target target(setup.settings(), Label(SourceDir("//foo/"), "bar")); 876 Target target(setup.settings(), Label(SourceDir("//foo/"), "bar"), {});
875 877
876 // Target with no settings, no configs, should be a no-op. 878 // Target with no settings, no configs, should be a no-op.
877 EXPECT_TRUE(target.ResolvePrecompiledHeaders(&err)); 879 EXPECT_TRUE(target.ResolvePrecompiledHeaders(&err));
878 880
879 // Config with PCH values. 881 // Config with PCH values.
880 Config config_1(setup.settings(), Label(SourceDir("//foo/"), "c1")); 882 Config config_1(setup.settings(), Label(SourceDir("//foo/"), "c1"), {});
881 std::string pch_1("pch.h"); 883 std::string pch_1("pch.h");
882 SourceFile pcs_1("//pcs.cc"); 884 SourceFile pcs_1("//pcs.cc");
883 config_1.own_values().set_precompiled_header(pch_1); 885 config_1.own_values().set_precompiled_header(pch_1);
884 config_1.own_values().set_precompiled_source(pcs_1); 886 config_1.own_values().set_precompiled_source(pcs_1);
885 ASSERT_TRUE(config_1.OnResolved(&err)); 887 ASSERT_TRUE(config_1.OnResolved(&err));
886 target.configs().push_back(LabelConfigPair(&config_1)); 888 target.configs().push_back(LabelConfigPair(&config_1));
887 889
888 // No PCH info specified on target, but the config specifies one, the 890 // No PCH info specified on target, but the config specifies one, the
889 // values should get copied to the target. 891 // values should get copied to the target.
890 EXPECT_TRUE(target.ResolvePrecompiledHeaders(&err)); 892 EXPECT_TRUE(target.ResolvePrecompiledHeaders(&err));
891 EXPECT_EQ(pch_1, target.config_values().precompiled_header()); 893 EXPECT_EQ(pch_1, target.config_values().precompiled_header());
892 EXPECT_TRUE(target.config_values().precompiled_source() == pcs_1); 894 EXPECT_TRUE(target.config_values().precompiled_source() == pcs_1);
893 895
894 // Now both target and config have matching PCH values. Resolving again 896 // Now both target and config have matching PCH values. Resolving again
895 // should be a no-op since they all match. 897 // should be a no-op since they all match.
896 EXPECT_TRUE(target.ResolvePrecompiledHeaders(&err)); 898 EXPECT_TRUE(target.ResolvePrecompiledHeaders(&err));
897 EXPECT_TRUE(target.config_values().precompiled_header() == pch_1); 899 EXPECT_TRUE(target.config_values().precompiled_header() == pch_1);
898 EXPECT_TRUE(target.config_values().precompiled_source() == pcs_1); 900 EXPECT_TRUE(target.config_values().precompiled_source() == pcs_1);
899 901
900 // Second config with different PCH values. 902 // Second config with different PCH values.
901 Config config_2(setup.settings(), Label(SourceDir("//foo/"), "c2")); 903 Config config_2(setup.settings(), Label(SourceDir("//foo/"), "c2"), {});
902 std::string pch_2("pch2.h"); 904 std::string pch_2("pch2.h");
903 SourceFile pcs_2("//pcs2.cc"); 905 SourceFile pcs_2("//pcs2.cc");
904 config_2.own_values().set_precompiled_header(pch_2); 906 config_2.own_values().set_precompiled_header(pch_2);
905 config_2.own_values().set_precompiled_source(pcs_2); 907 config_2.own_values().set_precompiled_source(pcs_2);
906 ASSERT_TRUE(config_2.OnResolved(&err)); 908 ASSERT_TRUE(config_2.OnResolved(&err));
907 target.configs().push_back(LabelConfigPair(&config_2)); 909 target.configs().push_back(LabelConfigPair(&config_2));
908 910
909 // This should be an error since they don't match. 911 // This should be an error since they don't match.
910 EXPECT_FALSE(target.ResolvePrecompiledHeaders(&err)); 912 EXPECT_FALSE(target.ResolvePrecompiledHeaders(&err));
911 913
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
1042 ASSERT_EQ(c.bundle_data().file_rules().size(), 1u); 1044 ASSERT_EQ(c.bundle_data().file_rules().size(), 1u);
1043 ASSERT_EQ(c.bundle_data().file_rules()[0].sources().size(), 1u); 1045 ASSERT_EQ(c.bundle_data().file_rules()[0].sources().size(), 1u);
1044 ASSERT_EQ(c.bundle_data().bundle_deps().size(), 1u); 1046 ASSERT_EQ(c.bundle_data().bundle_deps().size(), 1u);
1045 1047
1046 // E does not have any bundle_data information but gets a list of 1048 // E does not have any bundle_data information but gets a list of
1047 // bundle_deps to propagate them during target resolution. 1049 // bundle_deps to propagate them during target resolution.
1048 ASSERT_TRUE(e.bundle_data().file_rules().empty()); 1050 ASSERT_TRUE(e.bundle_data().file_rules().empty());
1049 ASSERT_TRUE(e.bundle_data().assets_catalog_sources().empty()); 1051 ASSERT_TRUE(e.bundle_data().assets_catalog_sources().empty());
1050 ASSERT_EQ(e.bundle_data().bundle_deps().size(), 2u); 1052 ASSERT_EQ(e.bundle_data().bundle_deps().size(), 2u);
1051 } 1053 }
OLDNEW
« no previous file with comments | « tools/gn/target_generator.cc ('k') | tools/gn/test_with_scope.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698