OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 } |
OLD | NEW |