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

Side by Side Diff: tools/gn/ninja_binary_target_writer_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
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/ninja_binary_target_writer.h" 5 #include "tools/gn/ninja_binary_target_writer.h"
6 6
7 #include <sstream> 7 #include <sstream>
8 #include <utility> 8 #include <utility>
9 9
10 #include "testing/gtest/include/gtest/gtest.h" 10 #include "testing/gtest/include/gtest/gtest.h"
11 #include "tools/gn/scheduler.h" 11 #include "tools/gn/scheduler.h"
12 #include "tools/gn/target.h" 12 #include "tools/gn/target.h"
13 #include "tools/gn/test_with_scope.h" 13 #include "tools/gn/test_with_scope.h"
14 14
15 TEST(NinjaBinaryTargetWriter, SourceSet) { 15 TEST(NinjaBinaryTargetWriter, SourceSet) {
16 Err err; 16 Err err;
17 TestWithScope setup; 17 TestWithScope setup;
18 18
19 Target target(setup.settings(), Label(SourceDir("//foo/"), "bar")); 19 Target target(setup.settings(), Label(SourceDir("//foo/"), "bar"), {});
20 target.set_output_type(Target::SOURCE_SET); 20 target.set_output_type(Target::SOURCE_SET);
21 target.visibility().SetPublic(); 21 target.visibility().SetPublic();
22 target.sources().push_back(SourceFile("//foo/input1.cc")); 22 target.sources().push_back(SourceFile("//foo/input1.cc"));
23 target.sources().push_back(SourceFile("//foo/input2.cc")); 23 target.sources().push_back(SourceFile("//foo/input2.cc"));
24 // Also test object files, which should be just passed through to the 24 // Also test object files, which should be just passed through to the
25 // dependents to link. 25 // dependents to link.
26 target.sources().push_back(SourceFile("//foo/input3.o")); 26 target.sources().push_back(SourceFile("//foo/input3.o"));
27 target.sources().push_back(SourceFile("//foo/input4.obj")); 27 target.sources().push_back(SourceFile("//foo/input4.obj"));
28 target.SetToolchain(setup.toolchain()); 28 target.SetToolchain(setup.toolchain());
29 ASSERT_TRUE(target.OnResolved(&err)); 29 ASSERT_TRUE(target.OnResolved(&err));
(...skipping 16 matching lines...) Expand all
46 "build obj/foo/bar.input1.o: cxx ../../foo/input1.cc\n" 46 "build obj/foo/bar.input1.o: cxx ../../foo/input1.cc\n"
47 "build obj/foo/bar.input2.o: cxx ../../foo/input2.cc\n" 47 "build obj/foo/bar.input2.o: cxx ../../foo/input2.cc\n"
48 "\n" 48 "\n"
49 "build obj/foo/bar.stamp: stamp obj/foo/bar.input1.o " 49 "build obj/foo/bar.stamp: stamp obj/foo/bar.input1.o "
50 "obj/foo/bar.input2.o ../../foo/input3.o ../../foo/input4.obj\n"; 50 "obj/foo/bar.input2.o ../../foo/input3.o ../../foo/input4.obj\n";
51 std::string out_str = out.str(); 51 std::string out_str = out.str();
52 EXPECT_EQ(expected, out_str); 52 EXPECT_EQ(expected, out_str);
53 } 53 }
54 54
55 // A shared library that depends on the source set. 55 // A shared library that depends on the source set.
56 Target shlib_target(setup.settings(), Label(SourceDir("//foo/"), "shlib")); 56 Target shlib_target(setup.settings(), Label(SourceDir("//foo/"), "shlib"),
57 {});
57 shlib_target.set_output_type(Target::SHARED_LIBRARY); 58 shlib_target.set_output_type(Target::SHARED_LIBRARY);
58 shlib_target.public_deps().push_back(LabelTargetPair(&target)); 59 shlib_target.public_deps().push_back(LabelTargetPair(&target));
59 shlib_target.SetToolchain(setup.toolchain()); 60 shlib_target.SetToolchain(setup.toolchain());
60 ASSERT_TRUE(shlib_target.OnResolved(&err)); 61 ASSERT_TRUE(shlib_target.OnResolved(&err));
61 62
62 { 63 {
63 std::ostringstream out; 64 std::ostringstream out;
64 NinjaBinaryTargetWriter writer(&shlib_target, out); 65 NinjaBinaryTargetWriter writer(&shlib_target, out);
65 writer.Run(); 66 writer.Run();
66 67
(...skipping 13 matching lines...) Expand all
80 "|| obj/foo/bar.stamp\n" 81 "|| obj/foo/bar.stamp\n"
81 " ldflags =\n" 82 " ldflags =\n"
82 " libs =\n" 83 " libs =\n"
83 " output_extension = .so\n" 84 " output_extension = .so\n"
84 " output_dir = \n"; 85 " output_dir = \n";
85 std::string out_str = out.str(); 86 std::string out_str = out.str();
86 EXPECT_EQ(expected, out_str); 87 EXPECT_EQ(expected, out_str);
87 } 88 }
88 89
89 // A static library that depends on the source set (should not link it). 90 // A static library that depends on the source set (should not link it).
90 Target stlib_target(setup.settings(), Label(SourceDir("//foo/"), "stlib")); 91 Target stlib_target(setup.settings(), Label(SourceDir("//foo/"), "stlib"),
92 {});
91 stlib_target.set_output_type(Target::STATIC_LIBRARY); 93 stlib_target.set_output_type(Target::STATIC_LIBRARY);
92 stlib_target.public_deps().push_back(LabelTargetPair(&target)); 94 stlib_target.public_deps().push_back(LabelTargetPair(&target));
93 stlib_target.SetToolchain(setup.toolchain()); 95 stlib_target.SetToolchain(setup.toolchain());
94 ASSERT_TRUE(stlib_target.OnResolved(&err)); 96 ASSERT_TRUE(stlib_target.OnResolved(&err));
95 97
96 { 98 {
97 std::ostringstream out; 99 std::ostringstream out;
98 NinjaBinaryTargetWriter writer(&stlib_target, out); 100 NinjaBinaryTargetWriter writer(&stlib_target, out);
99 writer.Run(); 101 writer.Run();
100 102
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after
252 } 254 }
253 } 255 }
254 256
255 // This tests that output extension and output dir overrides apply, and input 257 // This tests that output extension and output dir overrides apply, and input
256 // dependencies are applied. 258 // dependencies are applied.
257 TEST(NinjaBinaryTargetWriter, OutputExtensionAndInputDeps) { 259 TEST(NinjaBinaryTargetWriter, OutputExtensionAndInputDeps) {
258 Err err; 260 Err err;
259 TestWithScope setup; 261 TestWithScope setup;
260 262
261 // An action for our library to depend on. 263 // An action for our library to depend on.
262 Target action(setup.settings(), Label(SourceDir("//foo/"), "action")); 264 Target action(setup.settings(), Label(SourceDir("//foo/"), "action"), {});
263 action.set_output_type(Target::ACTION_FOREACH); 265 action.set_output_type(Target::ACTION_FOREACH);
264 action.visibility().SetPublic(); 266 action.visibility().SetPublic();
265 action.SetToolchain(setup.toolchain()); 267 action.SetToolchain(setup.toolchain());
266 ASSERT_TRUE(action.OnResolved(&err)); 268 ASSERT_TRUE(action.OnResolved(&err));
267 269
268 // A shared library w/ the output_extension set to a custom value. 270 // A shared library w/ the output_extension set to a custom value.
269 Target target(setup.settings(), Label(SourceDir("//foo/"), "shlib")); 271 Target target(setup.settings(), Label(SourceDir("//foo/"), "shlib"), {});
270 target.set_output_type(Target::SHARED_LIBRARY); 272 target.set_output_type(Target::SHARED_LIBRARY);
271 target.set_output_extension(std::string("so.6")); 273 target.set_output_extension(std::string("so.6"));
272 target.set_output_dir(SourceDir("//out/Debug/foo/")); 274 target.set_output_dir(SourceDir("//out/Debug/foo/"));
273 target.sources().push_back(SourceFile("//foo/input1.cc")); 275 target.sources().push_back(SourceFile("//foo/input1.cc"));
274 target.sources().push_back(SourceFile("//foo/input2.cc")); 276 target.sources().push_back(SourceFile("//foo/input2.cc"));
275 target.public_deps().push_back(LabelTargetPair(&action)); 277 target.public_deps().push_back(LabelTargetPair(&action));
276 target.SetToolchain(setup.toolchain()); 278 target.SetToolchain(setup.toolchain());
277 ASSERT_TRUE(target.OnResolved(&err)); 279 ASSERT_TRUE(target.OnResolved(&err));
278 280
279 std::ostringstream out; 281 std::ostringstream out;
(...skipping 27 matching lines...) Expand all
307 std::string out_str = out.str(); 309 std::string out_str = out.str();
308 EXPECT_EQ(expected, out_str); 310 EXPECT_EQ(expected, out_str);
309 } 311 }
310 312
311 // Tests libs are applied. 313 // Tests libs are applied.
312 TEST(NinjaBinaryTargetWriter, LibsAndLibDirs) { 314 TEST(NinjaBinaryTargetWriter, LibsAndLibDirs) {
313 Err err; 315 Err err;
314 TestWithScope setup; 316 TestWithScope setup;
315 317
316 // A shared library w/ libs and lib_dirs. 318 // A shared library w/ libs and lib_dirs.
317 Target target(setup.settings(), Label(SourceDir("//foo/"), "shlib")); 319 Target target(setup.settings(), Label(SourceDir("//foo/"), "shlib"), {});
318 target.set_output_type(Target::SHARED_LIBRARY); 320 target.set_output_type(Target::SHARED_LIBRARY);
319 target.config_values().libs().push_back(LibFile(SourceFile("//foo/lib1.a"))); 321 target.config_values().libs().push_back(LibFile(SourceFile("//foo/lib1.a")));
320 target.config_values().libs().push_back(LibFile("foo")); 322 target.config_values().libs().push_back(LibFile("foo"));
321 target.config_values().lib_dirs().push_back(SourceDir("//foo/bar/")); 323 target.config_values().lib_dirs().push_back(SourceDir("//foo/bar/"));
322 target.SetToolchain(setup.toolchain()); 324 target.SetToolchain(setup.toolchain());
323 ASSERT_TRUE(target.OnResolved(&err)); 325 ASSERT_TRUE(target.OnResolved(&err));
324 326
325 std::ostringstream out; 327 std::ostringstream out;
326 NinjaBinaryTargetWriter writer(&target, out); 328 NinjaBinaryTargetWriter writer(&target, out);
327 writer.Run(); 329 writer.Run();
(...skipping 16 matching lines...) Expand all
344 EXPECT_EQ(expected, out_str); 346 EXPECT_EQ(expected, out_str);
345 } 347 }
346 348
347 TEST(NinjaBinaryTargetWriter, EmptyOutputExtension) { 349 TEST(NinjaBinaryTargetWriter, EmptyOutputExtension) {
348 Err err; 350 Err err;
349 TestWithScope setup; 351 TestWithScope setup;
350 352
351 // This test is the same as OutputExtensionAndInputDeps, except that we call 353 // This test is the same as OutputExtensionAndInputDeps, except that we call
352 // set_output_extension("") and ensure that we get an empty one and override 354 // set_output_extension("") and ensure that we get an empty one and override
353 // the output prefix so that the name matches the target exactly. 355 // the output prefix so that the name matches the target exactly.
354 Target target(setup.settings(), Label(SourceDir("//foo/"), "shlib")); 356 Target target(setup.settings(), Label(SourceDir("//foo/"), "shlib"), {});
355 target.set_output_type(Target::SHARED_LIBRARY); 357 target.set_output_type(Target::SHARED_LIBRARY);
356 target.set_output_prefix_override(true); 358 target.set_output_prefix_override(true);
357 target.set_output_extension(std::string()); 359 target.set_output_extension(std::string());
358 target.sources().push_back(SourceFile("//foo/input1.cc")); 360 target.sources().push_back(SourceFile("//foo/input1.cc"));
359 target.sources().push_back(SourceFile("//foo/input2.cc")); 361 target.sources().push_back(SourceFile("//foo/input2.cc"));
360 362
361 target.SetToolchain(setup.toolchain()); 363 target.SetToolchain(setup.toolchain());
362 ASSERT_TRUE(target.OnResolved(&err)); 364 ASSERT_TRUE(target.OnResolved(&err));
363 365
364 std::ostringstream out; 366 std::ostringstream out;
(...skipping 21 matching lines...) Expand all
386 388
387 std::string out_str = out.str(); 389 std::string out_str = out.str();
388 EXPECT_EQ(expected, out_str); 390 EXPECT_EQ(expected, out_str);
389 } 391 }
390 392
391 TEST(NinjaBinaryTargetWriter, SourceSetDataDeps) { 393 TEST(NinjaBinaryTargetWriter, SourceSetDataDeps) {
392 Err err; 394 Err err;
393 TestWithScope setup; 395 TestWithScope setup;
394 396
395 // This target is a data (runtime) dependency of the intermediate target. 397 // This target is a data (runtime) dependency of the intermediate target.
396 Target data(setup.settings(), Label(SourceDir("//foo/"), "data_target")); 398 Target data(setup.settings(), Label(SourceDir("//foo/"), "data_target"), {});
397 data.set_output_type(Target::EXECUTABLE); 399 data.set_output_type(Target::EXECUTABLE);
398 data.visibility().SetPublic(); 400 data.visibility().SetPublic();
399 data.SetToolchain(setup.toolchain()); 401 data.SetToolchain(setup.toolchain());
400 ASSERT_TRUE(data.OnResolved(&err)); 402 ASSERT_TRUE(data.OnResolved(&err));
401 403
402 // Intermediate source set target. 404 // Intermediate source set target.
403 Target inter(setup.settings(), Label(SourceDir("//foo/"), "inter")); 405 Target inter(setup.settings(), Label(SourceDir("//foo/"), "inter"), {});
404 inter.set_output_type(Target::SOURCE_SET); 406 inter.set_output_type(Target::SOURCE_SET);
405 inter.visibility().SetPublic(); 407 inter.visibility().SetPublic();
406 inter.data_deps().push_back(LabelTargetPair(&data)); 408 inter.data_deps().push_back(LabelTargetPair(&data));
407 inter.SetToolchain(setup.toolchain()); 409 inter.SetToolchain(setup.toolchain());
408 inter.sources().push_back(SourceFile("//foo/inter.cc")); 410 inter.sources().push_back(SourceFile("//foo/inter.cc"));
409 ASSERT_TRUE(inter.OnResolved(&err)) << err.message(); 411 ASSERT_TRUE(inter.OnResolved(&err)) << err.message();
410 412
411 // Write out the intermediate target. 413 // Write out the intermediate target.
412 std::ostringstream inter_out; 414 std::ostringstream inter_out;
413 NinjaBinaryTargetWriter inter_writer(&inter, inter_out); 415 NinjaBinaryTargetWriter inter_writer(&inter, inter_out);
(...skipping 11 matching lines...) Expand all
425 "target_out_dir = obj/foo\n" 427 "target_out_dir = obj/foo\n"
426 "target_output_name = inter\n" 428 "target_output_name = inter\n"
427 "\n" 429 "\n"
428 "build obj/foo/inter.inter.o: cxx ../../foo/inter.cc\n" 430 "build obj/foo/inter.inter.o: cxx ../../foo/inter.cc\n"
429 "\n" 431 "\n"
430 "build obj/foo/inter.stamp: stamp obj/foo/inter.inter.o || " 432 "build obj/foo/inter.stamp: stamp obj/foo/inter.inter.o || "
431 "./data_target\n"; 433 "./data_target\n";
432 EXPECT_EQ(inter_expected, inter_out.str()); 434 EXPECT_EQ(inter_expected, inter_out.str());
433 435
434 // Final target. 436 // Final target.
435 Target exe(setup.settings(), Label(SourceDir("//foo/"), "exe")); 437 Target exe(setup.settings(), Label(SourceDir("//foo/"), "exe"), {});
436 exe.set_output_type(Target::EXECUTABLE); 438 exe.set_output_type(Target::EXECUTABLE);
437 exe.public_deps().push_back(LabelTargetPair(&inter)); 439 exe.public_deps().push_back(LabelTargetPair(&inter));
438 exe.SetToolchain(setup.toolchain()); 440 exe.SetToolchain(setup.toolchain());
439 exe.sources().push_back(SourceFile("//foo/final.cc")); 441 exe.sources().push_back(SourceFile("//foo/final.cc"));
440 ASSERT_TRUE(exe.OnResolved(&err)); 442 ASSERT_TRUE(exe.OnResolved(&err));
441 443
442 std::ostringstream final_out; 444 std::ostringstream final_out;
443 NinjaBinaryTargetWriter final_writer(&exe, final_out); 445 NinjaBinaryTargetWriter final_writer(&exe, final_out);
444 final_writer.Run(); 446 final_writer.Run();
445 447
(...skipping 19 matching lines...) Expand all
465 " libs =\n" 467 " libs =\n"
466 " output_extension = \n" 468 " output_extension = \n"
467 " output_dir = \n"; 469 " output_dir = \n";
468 EXPECT_EQ(final_expected, final_out.str()); 470 EXPECT_EQ(final_expected, final_out.str());
469 } 471 }
470 472
471 TEST(NinjaBinaryTargetWriter, SharedLibraryModuleDefinitionFile) { 473 TEST(NinjaBinaryTargetWriter, SharedLibraryModuleDefinitionFile) {
472 Err err; 474 Err err;
473 TestWithScope setup; 475 TestWithScope setup;
474 476
475 Target shared_lib(setup.settings(), Label(SourceDir("//foo/"), "bar")); 477 Target shared_lib(setup.settings(), Label(SourceDir("//foo/"), "bar"), {});
476 shared_lib.set_output_type(Target::SHARED_LIBRARY); 478 shared_lib.set_output_type(Target::SHARED_LIBRARY);
477 shared_lib.SetToolchain(setup.toolchain()); 479 shared_lib.SetToolchain(setup.toolchain());
478 shared_lib.sources().push_back(SourceFile("//foo/sources.cc")); 480 shared_lib.sources().push_back(SourceFile("//foo/sources.cc"));
479 shared_lib.sources().push_back(SourceFile("//foo/bar.def")); 481 shared_lib.sources().push_back(SourceFile("//foo/bar.def"));
480 ASSERT_TRUE(shared_lib.OnResolved(&err)); 482 ASSERT_TRUE(shared_lib.OnResolved(&err));
481 483
482 std::ostringstream out; 484 std::ostringstream out;
483 NinjaBinaryTargetWriter writer(&shared_lib, out); 485 NinjaBinaryTargetWriter writer(&shared_lib, out);
484 writer.Run(); 486 writer.Run();
485 487
(...skipping 13 matching lines...) Expand all
499 " libs =\n" 501 " libs =\n"
500 " output_extension = .so\n" 502 " output_extension = .so\n"
501 " output_dir = \n"; 503 " output_dir = \n";
502 EXPECT_EQ(expected, out.str()); 504 EXPECT_EQ(expected, out.str());
503 } 505 }
504 506
505 TEST(NinjaBinaryTargetWriter, LoadableModule) { 507 TEST(NinjaBinaryTargetWriter, LoadableModule) {
506 Err err; 508 Err err;
507 TestWithScope setup; 509 TestWithScope setup;
508 510
509 Target loadable_module(setup.settings(), Label(SourceDir("//foo/"), "bar")); 511 Target loadable_module(setup.settings(), Label(SourceDir("//foo/"), "bar"),
512 {});
510 loadable_module.set_output_type(Target::LOADABLE_MODULE); 513 loadable_module.set_output_type(Target::LOADABLE_MODULE);
511 loadable_module.visibility().SetPublic(); 514 loadable_module.visibility().SetPublic();
512 loadable_module.SetToolchain(setup.toolchain()); 515 loadable_module.SetToolchain(setup.toolchain());
513 loadable_module.sources().push_back(SourceFile("//foo/sources.cc")); 516 loadable_module.sources().push_back(SourceFile("//foo/sources.cc"));
514 ASSERT_TRUE(loadable_module.OnResolved(&err)) << err.message(); 517 ASSERT_TRUE(loadable_module.OnResolved(&err)) << err.message();
515 518
516 std::ostringstream out; 519 std::ostringstream out;
517 NinjaBinaryTargetWriter writer(&loadable_module, out); 520 NinjaBinaryTargetWriter writer(&loadable_module, out);
518 writer.Run(); 521 writer.Run();
519 522
520 const char loadable_expected[] = 523 const char loadable_expected[] =
521 "defines =\n" 524 "defines =\n"
522 "include_dirs =\n" 525 "include_dirs =\n"
523 "cflags =\n" 526 "cflags =\n"
524 "cflags_cc =\n" 527 "cflags_cc =\n"
525 "root_out_dir = .\n" 528 "root_out_dir = .\n"
526 "target_out_dir = obj/foo\n" 529 "target_out_dir = obj/foo\n"
527 "target_output_name = libbar\n" 530 "target_output_name = libbar\n"
528 "\n" 531 "\n"
529 "build obj/foo/libbar.sources.o: cxx ../../foo/sources.cc\n" 532 "build obj/foo/libbar.sources.o: cxx ../../foo/sources.cc\n"
530 "\n" 533 "\n"
531 "build ./libbar.so: solink_module obj/foo/libbar.sources.o\n" 534 "build ./libbar.so: solink_module obj/foo/libbar.sources.o\n"
532 " ldflags =\n" 535 " ldflags =\n"
533 " libs =\n" 536 " libs =\n"
534 " output_extension = .so\n" 537 " output_extension = .so\n"
535 " output_dir = \n"; 538 " output_dir = \n";
536 EXPECT_EQ(loadable_expected, out.str()); 539 EXPECT_EQ(loadable_expected, out.str());
537 540
538 // Final target. 541 // Final target.
539 Target exe(setup.settings(), Label(SourceDir("//foo/"), "exe")); 542 Target exe(setup.settings(), Label(SourceDir("//foo/"), "exe"), {});
540 exe.set_output_type(Target::EXECUTABLE); 543 exe.set_output_type(Target::EXECUTABLE);
541 exe.public_deps().push_back(LabelTargetPair(&loadable_module)); 544 exe.public_deps().push_back(LabelTargetPair(&loadable_module));
542 exe.SetToolchain(setup.toolchain()); 545 exe.SetToolchain(setup.toolchain());
543 exe.sources().push_back(SourceFile("//foo/final.cc")); 546 exe.sources().push_back(SourceFile("//foo/final.cc"));
544 ASSERT_TRUE(exe.OnResolved(&err)) << err.message(); 547 ASSERT_TRUE(exe.OnResolved(&err)) << err.message();
545 548
546 std::ostringstream final_out; 549 std::ostringstream final_out;
547 NinjaBinaryTargetWriter final_writer(&exe, final_out); 550 NinjaBinaryTargetWriter final_writer(&exe, final_out);
548 final_writer.Run(); 551 final_writer.Run();
549 552
(...skipping 20 matching lines...) Expand all
570 573
571 TEST(NinjaBinaryTargetWriter, WinPrecompiledHeaders) { 574 TEST(NinjaBinaryTargetWriter, WinPrecompiledHeaders) {
572 Err err; 575 Err err;
573 576
574 // This setup's toolchain does not have precompiled headers defined. 577 // This setup's toolchain does not have precompiled headers defined.
575 TestWithScope setup; 578 TestWithScope setup;
576 579
577 // A precompiled header toolchain. 580 // A precompiled header toolchain.
578 Settings pch_settings(setup.build_settings(), "withpch/"); 581 Settings pch_settings(setup.build_settings(), "withpch/");
579 Toolchain pch_toolchain(&pch_settings, 582 Toolchain pch_toolchain(&pch_settings,
580 Label(SourceDir("//toolchain/"), "withpch")); 583 Label(SourceDir("//toolchain/"), "withpch"), {});
581 pch_settings.set_toolchain_label(pch_toolchain.label()); 584 pch_settings.set_toolchain_label(pch_toolchain.label());
582 pch_settings.set_default_toolchain_label(setup.toolchain()->label()); 585 pch_settings.set_default_toolchain_label(setup.toolchain()->label());
583 586
584 // Declare a C++ compiler that supports PCH. 587 // Declare a C++ compiler that supports PCH.
585 std::unique_ptr<Tool> cxx_tool(new Tool); 588 std::unique_ptr<Tool> cxx_tool(new Tool);
586 TestWithScope::SetCommandForTool( 589 TestWithScope::SetCommandForTool(
587 "c++ {{source}} {{cflags}} {{cflags_cc}} {{defines}} {{include_dirs}} " 590 "c++ {{source}} {{cflags}} {{cflags_cc}} {{defines}} {{include_dirs}} "
588 "-o {{output}}", 591 "-o {{output}}",
589 cxx_tool.get()); 592 cxx_tool.get());
590 cxx_tool->set_outputs(SubstitutionList::MakeForTest( 593 cxx_tool->set_outputs(SubstitutionList::MakeForTest(
591 "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o")); 594 "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o"));
592 cxx_tool->set_precompiled_header_type(Tool::PCH_MSVC); 595 cxx_tool->set_precompiled_header_type(Tool::PCH_MSVC);
593 pch_toolchain.SetTool(Toolchain::TYPE_CXX, std::move(cxx_tool)); 596 pch_toolchain.SetTool(Toolchain::TYPE_CXX, std::move(cxx_tool));
594 597
595 // Add a C compiler as well. 598 // Add a C compiler as well.
596 std::unique_ptr<Tool> cc_tool(new Tool); 599 std::unique_ptr<Tool> cc_tool(new Tool);
597 TestWithScope::SetCommandForTool( 600 TestWithScope::SetCommandForTool(
598 "cc {{source}} {{cflags}} {{cflags_c}} {{defines}} {{include_dirs}} " 601 "cc {{source}} {{cflags}} {{cflags_c}} {{defines}} {{include_dirs}} "
599 "-o {{output}}", 602 "-o {{output}}",
600 cc_tool.get()); 603 cc_tool.get());
601 cc_tool->set_outputs(SubstitutionList::MakeForTest( 604 cc_tool->set_outputs(SubstitutionList::MakeForTest(
602 "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o")); 605 "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o"));
603 cc_tool->set_precompiled_header_type(Tool::PCH_MSVC); 606 cc_tool->set_precompiled_header_type(Tool::PCH_MSVC);
604 pch_toolchain.SetTool(Toolchain::TYPE_CC, std::move(cc_tool)); 607 pch_toolchain.SetTool(Toolchain::TYPE_CC, std::move(cc_tool));
605 pch_toolchain.ToolchainSetupComplete(); 608 pch_toolchain.ToolchainSetupComplete();
606 609
607 // This target doesn't specify precompiled headers. 610 // This target doesn't specify precompiled headers.
608 { 611 {
609 Target no_pch_target(&pch_settings, 612 Target no_pch_target(&pch_settings,
610 Label(SourceDir("//foo/"), "no_pch_target")); 613 Label(SourceDir("//foo/"), "no_pch_target"), {});
611 no_pch_target.set_output_type(Target::SOURCE_SET); 614 no_pch_target.set_output_type(Target::SOURCE_SET);
612 no_pch_target.visibility().SetPublic(); 615 no_pch_target.visibility().SetPublic();
613 no_pch_target.sources().push_back(SourceFile("//foo/input1.cc")); 616 no_pch_target.sources().push_back(SourceFile("//foo/input1.cc"));
614 no_pch_target.sources().push_back(SourceFile("//foo/input2.c")); 617 no_pch_target.sources().push_back(SourceFile("//foo/input2.c"));
615 no_pch_target.config_values().cflags_c().push_back("-std=c99"); 618 no_pch_target.config_values().cflags_c().push_back("-std=c99");
616 no_pch_target.SetToolchain(&pch_toolchain); 619 no_pch_target.SetToolchain(&pch_toolchain);
617 ASSERT_TRUE(no_pch_target.OnResolved(&err)); 620 ASSERT_TRUE(no_pch_target.OnResolved(&err));
618 621
619 std::ostringstream out; 622 std::ostringstream out;
620 NinjaBinaryTargetWriter writer(&no_pch_target, out); 623 NinjaBinaryTargetWriter writer(&no_pch_target, out);
(...skipping 13 matching lines...) Expand all
634 "withpch_cc ../../foo/input2.c\n" 637 "withpch_cc ../../foo/input2.c\n"
635 "\n" 638 "\n"
636 "build withpch/obj/foo/no_pch_target.stamp: " 639 "build withpch/obj/foo/no_pch_target.stamp: "
637 "withpch_stamp withpch/obj/foo/no_pch_target.input1.o " 640 "withpch_stamp withpch/obj/foo/no_pch_target.input1.o "
638 "withpch/obj/foo/no_pch_target.input2.o\n"; 641 "withpch/obj/foo/no_pch_target.input2.o\n";
639 EXPECT_EQ(no_pch_expected, out.str()); 642 EXPECT_EQ(no_pch_expected, out.str());
640 } 643 }
641 644
642 // This target specifies PCH. 645 // This target specifies PCH.
643 { 646 {
644 Target pch_target(&pch_settings, 647 Target pch_target(&pch_settings, Label(SourceDir("//foo/"), "pch_target"),
645 Label(SourceDir("//foo/"), "pch_target")); 648 {});
646 pch_target.config_values().set_precompiled_header("build/precompile.h"); 649 pch_target.config_values().set_precompiled_header("build/precompile.h");
647 pch_target.config_values().set_precompiled_source( 650 pch_target.config_values().set_precompiled_source(
648 SourceFile("//build/precompile.cc")); 651 SourceFile("//build/precompile.cc"));
649 pch_target.set_output_type(Target::SOURCE_SET); 652 pch_target.set_output_type(Target::SOURCE_SET);
650 pch_target.visibility().SetPublic(); 653 pch_target.visibility().SetPublic();
651 pch_target.sources().push_back(SourceFile("//foo/input1.cc")); 654 pch_target.sources().push_back(SourceFile("//foo/input1.cc"));
652 pch_target.sources().push_back(SourceFile("//foo/input2.c")); 655 pch_target.sources().push_back(SourceFile("//foo/input2.c"));
653 pch_target.SetToolchain(&pch_toolchain); 656 pch_target.SetToolchain(&pch_toolchain);
654 ASSERT_TRUE(pch_target.OnResolved(&err)); 657 ASSERT_TRUE(pch_target.OnResolved(&err));
655 658
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
698 701
699 TEST(NinjaBinaryTargetWriter, GCCPrecompiledHeaders) { 702 TEST(NinjaBinaryTargetWriter, GCCPrecompiledHeaders) {
700 Err err; 703 Err err;
701 704
702 // This setup's toolchain does not have precompiled headers defined. 705 // This setup's toolchain does not have precompiled headers defined.
703 TestWithScope setup; 706 TestWithScope setup;
704 707
705 // A precompiled header toolchain. 708 // A precompiled header toolchain.
706 Settings pch_settings(setup.build_settings(), "withpch/"); 709 Settings pch_settings(setup.build_settings(), "withpch/");
707 Toolchain pch_toolchain(&pch_settings, 710 Toolchain pch_toolchain(&pch_settings,
708 Label(SourceDir("//toolchain/"), "withpch")); 711 Label(SourceDir("//toolchain/"), "withpch"), {});
709 pch_settings.set_toolchain_label(pch_toolchain.label()); 712 pch_settings.set_toolchain_label(pch_toolchain.label());
710 pch_settings.set_default_toolchain_label(setup.toolchain()->label()); 713 pch_settings.set_default_toolchain_label(setup.toolchain()->label());
711 714
712 // Declare a C++ compiler that supports PCH. 715 // Declare a C++ compiler that supports PCH.
713 std::unique_ptr<Tool> cxx_tool(new Tool); 716 std::unique_ptr<Tool> cxx_tool(new Tool);
714 TestWithScope::SetCommandForTool( 717 TestWithScope::SetCommandForTool(
715 "c++ {{source}} {{cflags}} {{cflags_cc}} {{defines}} {{include_dirs}} " 718 "c++ {{source}} {{cflags}} {{cflags_cc}} {{defines}} {{include_dirs}} "
716 "-o {{output}}", 719 "-o {{output}}",
717 cxx_tool.get()); 720 cxx_tool.get());
718 cxx_tool->set_outputs(SubstitutionList::MakeForTest( 721 cxx_tool->set_outputs(SubstitutionList::MakeForTest(
(...skipping 10 matching lines...) Expand all
729 cc_tool.get()); 732 cc_tool.get());
730 cc_tool->set_outputs(SubstitutionList::MakeForTest( 733 cc_tool->set_outputs(SubstitutionList::MakeForTest(
731 "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o")); 734 "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o"));
732 cc_tool->set_precompiled_header_type(Tool::PCH_GCC); 735 cc_tool->set_precompiled_header_type(Tool::PCH_GCC);
733 pch_toolchain.SetTool(Toolchain::TYPE_CC, std::move(cc_tool)); 736 pch_toolchain.SetTool(Toolchain::TYPE_CC, std::move(cc_tool));
734 pch_toolchain.ToolchainSetupComplete(); 737 pch_toolchain.ToolchainSetupComplete();
735 738
736 // This target doesn't specify precompiled headers. 739 // This target doesn't specify precompiled headers.
737 { 740 {
738 Target no_pch_target(&pch_settings, 741 Target no_pch_target(&pch_settings,
739 Label(SourceDir("//foo/"), "no_pch_target")); 742 Label(SourceDir("//foo/"), "no_pch_target"), {});
740 no_pch_target.set_output_type(Target::SOURCE_SET); 743 no_pch_target.set_output_type(Target::SOURCE_SET);
741 no_pch_target.visibility().SetPublic(); 744 no_pch_target.visibility().SetPublic();
742 no_pch_target.sources().push_back(SourceFile("//foo/input1.cc")); 745 no_pch_target.sources().push_back(SourceFile("//foo/input1.cc"));
743 no_pch_target.sources().push_back(SourceFile("//foo/input2.c")); 746 no_pch_target.sources().push_back(SourceFile("//foo/input2.c"));
744 no_pch_target.config_values().cflags_c().push_back("-std=c99"); 747 no_pch_target.config_values().cflags_c().push_back("-std=c99");
745 no_pch_target.SetToolchain(&pch_toolchain); 748 no_pch_target.SetToolchain(&pch_toolchain);
746 ASSERT_TRUE(no_pch_target.OnResolved(&err)); 749 ASSERT_TRUE(no_pch_target.OnResolved(&err));
747 750
748 std::ostringstream out; 751 std::ostringstream out;
749 NinjaBinaryTargetWriter writer(&no_pch_target, out); 752 NinjaBinaryTargetWriter writer(&no_pch_target, out);
(...skipping 13 matching lines...) Expand all
763 "withpch_cc ../../foo/input2.c\n" 766 "withpch_cc ../../foo/input2.c\n"
764 "\n" 767 "\n"
765 "build withpch/obj/foo/no_pch_target.stamp: " 768 "build withpch/obj/foo/no_pch_target.stamp: "
766 "withpch_stamp withpch/obj/foo/no_pch_target.input1.o " 769 "withpch_stamp withpch/obj/foo/no_pch_target.input1.o "
767 "withpch/obj/foo/no_pch_target.input2.o\n"; 770 "withpch/obj/foo/no_pch_target.input2.o\n";
768 EXPECT_EQ(no_pch_expected, out.str()); 771 EXPECT_EQ(no_pch_expected, out.str());
769 } 772 }
770 773
771 // This target specifies PCH. 774 // This target specifies PCH.
772 { 775 {
773 Target pch_target(&pch_settings, 776 Target pch_target(&pch_settings, Label(SourceDir("//foo/"), "pch_target"),
774 Label(SourceDir("//foo/"), "pch_target")); 777 {});
775 pch_target.config_values().set_precompiled_source( 778 pch_target.config_values().set_precompiled_source(
776 SourceFile("//build/precompile.h")); 779 SourceFile("//build/precompile.h"));
777 pch_target.config_values().cflags_c().push_back("-std=c99"); 780 pch_target.config_values().cflags_c().push_back("-std=c99");
778 pch_target.set_output_type(Target::SOURCE_SET); 781 pch_target.set_output_type(Target::SOURCE_SET);
779 pch_target.visibility().SetPublic(); 782 pch_target.visibility().SetPublic();
780 pch_target.sources().push_back(SourceFile("//foo/input1.cc")); 783 pch_target.sources().push_back(SourceFile("//foo/input1.cc"));
781 pch_target.sources().push_back(SourceFile("//foo/input2.c")); 784 pch_target.sources().push_back(SourceFile("//foo/input2.c"));
782 pch_target.SetToolchain(&pch_toolchain); 785 pch_target.SetToolchain(&pch_toolchain);
783 ASSERT_TRUE(pch_target.OnResolved(&err)); 786 ASSERT_TRUE(pch_target.OnResolved(&err));
784 787
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
841 } 844 }
842 845
843 // This tests that output extension and output dir overrides apply, and input 846 // This tests that output extension and output dir overrides apply, and input
844 // dependencies are applied. 847 // dependencies are applied.
845 TEST(NinjaBinaryTargetWriter, InputFiles) { 848 TEST(NinjaBinaryTargetWriter, InputFiles) {
846 Err err; 849 Err err;
847 TestWithScope setup; 850 TestWithScope setup;
848 851
849 // This target has one input. 852 // This target has one input.
850 { 853 {
851 Target target(setup.settings(), Label(SourceDir("//foo/"), "bar")); 854 Target target(setup.settings(), Label(SourceDir("//foo/"), "bar"), {});
852 target.set_output_type(Target::SOURCE_SET); 855 target.set_output_type(Target::SOURCE_SET);
853 target.visibility().SetPublic(); 856 target.visibility().SetPublic();
854 target.sources().push_back(SourceFile("//foo/input1.cc")); 857 target.sources().push_back(SourceFile("//foo/input1.cc"));
855 target.sources().push_back(SourceFile("//foo/input2.cc")); 858 target.sources().push_back(SourceFile("//foo/input2.cc"));
856 target.inputs().push_back(SourceFile("//foo/input.data")); 859 target.inputs().push_back(SourceFile("//foo/input.data"));
857 target.SetToolchain(setup.toolchain()); 860 target.SetToolchain(setup.toolchain());
858 ASSERT_TRUE(target.OnResolved(&err)); 861 ASSERT_TRUE(target.OnResolved(&err));
859 862
860 std::ostringstream out; 863 std::ostringstream out;
861 NinjaBinaryTargetWriter writer(&target, out); 864 NinjaBinaryTargetWriter writer(&target, out);
(...skipping 14 matching lines...) Expand all
876 " | ../../foo/input.data\n" 879 " | ../../foo/input.data\n"
877 "\n" 880 "\n"
878 "build obj/foo/bar.stamp: stamp obj/foo/bar.input1.o " 881 "build obj/foo/bar.stamp: stamp obj/foo/bar.input1.o "
879 "obj/foo/bar.input2.o\n"; 882 "obj/foo/bar.input2.o\n";
880 883
881 EXPECT_EQ(expected, out.str()); 884 EXPECT_EQ(expected, out.str());
882 } 885 }
883 886
884 // This target has multiple inputs. 887 // This target has multiple inputs.
885 { 888 {
886 Target target(setup.settings(), Label(SourceDir("//foo/"), "bar")); 889 Target target(setup.settings(), Label(SourceDir("//foo/"), "bar"), {});
887 target.set_output_type(Target::SOURCE_SET); 890 target.set_output_type(Target::SOURCE_SET);
888 target.visibility().SetPublic(); 891 target.visibility().SetPublic();
889 target.sources().push_back(SourceFile("//foo/input1.cc")); 892 target.sources().push_back(SourceFile("//foo/input1.cc"));
890 target.sources().push_back(SourceFile("//foo/input2.cc")); 893 target.sources().push_back(SourceFile("//foo/input2.cc"));
891 target.inputs().push_back(SourceFile("//foo/input1.data")); 894 target.inputs().push_back(SourceFile("//foo/input1.data"));
892 target.inputs().push_back(SourceFile("//foo/input2.data")); 895 target.inputs().push_back(SourceFile("//foo/input2.data"));
893 target.SetToolchain(setup.toolchain()); 896 target.SetToolchain(setup.toolchain());
894 ASSERT_TRUE(target.OnResolved(&err)); 897 ASSERT_TRUE(target.OnResolved(&err));
895 898
896 std::ostringstream out; 899 std::ostringstream out;
(...skipping 15 matching lines...) Expand all
912 " | obj/foo/bar.inputs.stamp\n" 915 " | obj/foo/bar.inputs.stamp\n"
913 "build obj/foo/bar.input2.o: cxx ../../foo/input2.cc" 916 "build obj/foo/bar.input2.o: cxx ../../foo/input2.cc"
914 " | obj/foo/bar.inputs.stamp\n" 917 " | obj/foo/bar.inputs.stamp\n"
915 "\n" 918 "\n"
916 "build obj/foo/bar.stamp: stamp obj/foo/bar.input1.o " 919 "build obj/foo/bar.stamp: stamp obj/foo/bar.input1.o "
917 "obj/foo/bar.input2.o\n"; 920 "obj/foo/bar.input2.o\n";
918 921
919 EXPECT_EQ(expected, out.str()); 922 EXPECT_EQ(expected, out.str());
920 } 923 }
921 } 924 }
OLDNEW
« no previous file with comments | « tools/gn/ninja_action_target_writer_unittest.cc ('k') | tools/gn/ninja_build_writer_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698