| 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 TestWithScope setup; | 17 TestWithScope setup; |
| 17 Err err; | |
| 18 | |
| 19 setup.build_settings()->SetBuildDir(SourceDir("//out/Debug/")); | |
| 20 | 18 |
| 21 Target target(setup.settings(), Label(SourceDir("//foo/"), "bar")); | 19 Target target(setup.settings(), Label(SourceDir("//foo/"), "bar")); |
| 22 target.set_output_type(Target::SOURCE_SET); | 20 target.set_output_type(Target::SOURCE_SET); |
| 23 target.visibility().SetPublic(); | 21 target.visibility().SetPublic(); |
| 24 target.sources().push_back(SourceFile("//foo/input1.cc")); | 22 target.sources().push_back(SourceFile("//foo/input1.cc")); |
| 25 target.sources().push_back(SourceFile("//foo/input2.cc")); | 23 target.sources().push_back(SourceFile("//foo/input2.cc")); |
| 26 // 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 |
| 27 // dependents to link. | 25 // dependents to link. |
| 28 target.sources().push_back(SourceFile("//foo/input3.o")); | 26 target.sources().push_back(SourceFile("//foo/input3.o")); |
| 29 target.sources().push_back(SourceFile("//foo/input4.obj")); | 27 target.sources().push_back(SourceFile("//foo/input4.obj")); |
| (...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 250 " output_extension = \n" | 248 " output_extension = \n" |
| 251 " output_dir = \n"; | 249 " output_dir = \n"; |
| 252 std::string out_str = out.str(); | 250 std::string out_str = out.str(); |
| 253 EXPECT_EQ(expected, out_str); | 251 EXPECT_EQ(expected, out_str); |
| 254 } | 252 } |
| 255 } | 253 } |
| 256 | 254 |
| 257 // This tests that output extension and output dir overrides apply, and input | 255 // This tests that output extension and output dir overrides apply, and input |
| 258 // dependencies are applied. | 256 // dependencies are applied. |
| 259 TEST(NinjaBinaryTargetWriter, OutputExtensionAndInputDeps) { | 257 TEST(NinjaBinaryTargetWriter, OutputExtensionAndInputDeps) { |
| 258 Err err; |
| 260 TestWithScope setup; | 259 TestWithScope setup; |
| 261 Err err; | |
| 262 | |
| 263 setup.build_settings()->SetBuildDir(SourceDir("//out/Debug/")); | |
| 264 | 260 |
| 265 // An action for our library to depend on. | 261 // An action for our library to depend on. |
| 266 Target action(setup.settings(), Label(SourceDir("//foo/"), "action")); | 262 Target action(setup.settings(), Label(SourceDir("//foo/"), "action")); |
| 267 action.set_output_type(Target::ACTION_FOREACH); | 263 action.set_output_type(Target::ACTION_FOREACH); |
| 268 action.visibility().SetPublic(); | 264 action.visibility().SetPublic(); |
| 269 action.SetToolchain(setup.toolchain()); | 265 action.SetToolchain(setup.toolchain()); |
| 270 ASSERT_TRUE(action.OnResolved(&err)); | 266 ASSERT_TRUE(action.OnResolved(&err)); |
| 271 | 267 |
| 272 // A shared library w/ the output_extension set to a custom value. | 268 // A shared library w/ the output_extension set to a custom value. |
| 273 Target target(setup.settings(), Label(SourceDir("//foo/"), "shlib")); | 269 Target target(setup.settings(), Label(SourceDir("//foo/"), "shlib")); |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 307 " libs =\n" | 303 " libs =\n" |
| 308 " output_extension = .so.6\n" | 304 " output_extension = .so.6\n" |
| 309 " output_dir = foo\n"; | 305 " output_dir = foo\n"; |
| 310 | 306 |
| 311 std::string out_str = out.str(); | 307 std::string out_str = out.str(); |
| 312 EXPECT_EQ(expected, out_str); | 308 EXPECT_EQ(expected, out_str); |
| 313 } | 309 } |
| 314 | 310 |
| 315 // Tests libs are applied. | 311 // Tests libs are applied. |
| 316 TEST(NinjaBinaryTargetWriter, LibsAndLibDirs) { | 312 TEST(NinjaBinaryTargetWriter, LibsAndLibDirs) { |
| 313 Err err; |
| 317 TestWithScope setup; | 314 TestWithScope setup; |
| 318 Err err; | |
| 319 | |
| 320 setup.build_settings()->SetBuildDir(SourceDir("//out/Debug/")); | |
| 321 | 315 |
| 322 // A shared library w/ libs and lib_dirs. | 316 // A shared library w/ libs and lib_dirs. |
| 323 Target target(setup.settings(), Label(SourceDir("//foo/"), "shlib")); | 317 Target target(setup.settings(), Label(SourceDir("//foo/"), "shlib")); |
| 324 target.set_output_type(Target::SHARED_LIBRARY); | 318 target.set_output_type(Target::SHARED_LIBRARY); |
| 325 target.config_values().libs().push_back(LibFile(SourceFile("//foo/lib1.a"))); | 319 target.config_values().libs().push_back(LibFile(SourceFile("//foo/lib1.a"))); |
| 326 target.config_values().libs().push_back(LibFile("foo")); | 320 target.config_values().libs().push_back(LibFile("foo")); |
| 327 target.config_values().lib_dirs().push_back(SourceDir("//foo/bar/")); | 321 target.config_values().lib_dirs().push_back(SourceDir("//foo/bar/")); |
| 328 target.SetToolchain(setup.toolchain()); | 322 target.SetToolchain(setup.toolchain()); |
| 329 ASSERT_TRUE(target.OnResolved(&err)); | 323 ASSERT_TRUE(target.OnResolved(&err)); |
| 330 | 324 |
| (...skipping 13 matching lines...) Expand all Loading... |
| 344 " ldflags = -L../../foo/bar\n" | 338 " ldflags = -L../../foo/bar\n" |
| 345 " libs = ../../foo/lib1.a -lfoo\n" | 339 " libs = ../../foo/lib1.a -lfoo\n" |
| 346 " output_extension = .so\n" | 340 " output_extension = .so\n" |
| 347 " output_dir = \n"; | 341 " output_dir = \n"; |
| 348 | 342 |
| 349 std::string out_str = out.str(); | 343 std::string out_str = out.str(); |
| 350 EXPECT_EQ(expected, out_str); | 344 EXPECT_EQ(expected, out_str); |
| 351 } | 345 } |
| 352 | 346 |
| 353 TEST(NinjaBinaryTargetWriter, EmptyOutputExtension) { | 347 TEST(NinjaBinaryTargetWriter, EmptyOutputExtension) { |
| 348 Err err; |
| 354 TestWithScope setup; | 349 TestWithScope setup; |
| 355 Err err; | |
| 356 | |
| 357 setup.build_settings()->SetBuildDir(SourceDir("//out/Debug/")); | |
| 358 | 350 |
| 359 // This test is the same as OutputExtensionAndInputDeps, except that we call | 351 // This test is the same as OutputExtensionAndInputDeps, except that we call |
| 360 // set_output_extension("") and ensure that we get an empty one and override | 352 // set_output_extension("") and ensure that we get an empty one and override |
| 361 // the output prefix so that the name matches the target exactly. | 353 // the output prefix so that the name matches the target exactly. |
| 362 Target target(setup.settings(), Label(SourceDir("//foo/"), "shlib")); | 354 Target target(setup.settings(), Label(SourceDir("//foo/"), "shlib")); |
| 363 target.set_output_type(Target::SHARED_LIBRARY); | 355 target.set_output_type(Target::SHARED_LIBRARY); |
| 364 target.set_output_prefix_override(true); | 356 target.set_output_prefix_override(true); |
| 365 target.set_output_extension(std::string()); | 357 target.set_output_extension(std::string()); |
| 366 target.sources().push_back(SourceFile("//foo/input1.cc")); | 358 target.sources().push_back(SourceFile("//foo/input1.cc")); |
| 367 target.sources().push_back(SourceFile("//foo/input2.cc")); | 359 target.sources().push_back(SourceFile("//foo/input2.cc")); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 390 " ldflags =\n" | 382 " ldflags =\n" |
| 391 " libs =\n" | 383 " libs =\n" |
| 392 " output_extension = \n" | 384 " output_extension = \n" |
| 393 " output_dir = \n"; | 385 " output_dir = \n"; |
| 394 | 386 |
| 395 std::string out_str = out.str(); | 387 std::string out_str = out.str(); |
| 396 EXPECT_EQ(expected, out_str); | 388 EXPECT_EQ(expected, out_str); |
| 397 } | 389 } |
| 398 | 390 |
| 399 TEST(NinjaBinaryTargetWriter, SourceSetDataDeps) { | 391 TEST(NinjaBinaryTargetWriter, SourceSetDataDeps) { |
| 392 Err err; |
| 400 TestWithScope setup; | 393 TestWithScope setup; |
| 401 setup.build_settings()->SetBuildDir(SourceDir("//out/Debug/")); | |
| 402 | |
| 403 Err err; | |
| 404 | 394 |
| 405 // This target is a data (runtime) dependency of the intermediate target. | 395 // This target is a data (runtime) dependency of the intermediate target. |
| 406 Target data(setup.settings(), Label(SourceDir("//foo/"), "data_target")); | 396 Target data(setup.settings(), Label(SourceDir("//foo/"), "data_target")); |
| 407 data.set_output_type(Target::EXECUTABLE); | 397 data.set_output_type(Target::EXECUTABLE); |
| 408 data.visibility().SetPublic(); | 398 data.visibility().SetPublic(); |
| 409 data.SetToolchain(setup.toolchain()); | 399 data.SetToolchain(setup.toolchain()); |
| 410 ASSERT_TRUE(data.OnResolved(&err)); | 400 ASSERT_TRUE(data.OnResolved(&err)); |
| 411 | 401 |
| 412 // Intermediate source set target. | 402 // Intermediate source set target. |
| 413 Target inter(setup.settings(), Label(SourceDir("//foo/"), "inter")); | 403 Target inter(setup.settings(), Label(SourceDir("//foo/"), "inter")); |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 472 "build ./exe: link obj/foo/exe.final.o obj/foo/inter.inter.o || " | 462 "build ./exe: link obj/foo/exe.final.o obj/foo/inter.inter.o || " |
| 473 "obj/foo/inter.stamp\n" | 463 "obj/foo/inter.stamp\n" |
| 474 " ldflags =\n" | 464 " ldflags =\n" |
| 475 " libs =\n" | 465 " libs =\n" |
| 476 " output_extension = \n" | 466 " output_extension = \n" |
| 477 " output_dir = \n"; | 467 " output_dir = \n"; |
| 478 EXPECT_EQ(final_expected, final_out.str()); | 468 EXPECT_EQ(final_expected, final_out.str()); |
| 479 } | 469 } |
| 480 | 470 |
| 481 TEST(NinjaBinaryTargetWriter, SharedLibraryModuleDefinitionFile) { | 471 TEST(NinjaBinaryTargetWriter, SharedLibraryModuleDefinitionFile) { |
| 472 Err err; |
| 482 TestWithScope setup; | 473 TestWithScope setup; |
| 483 setup.build_settings()->SetBuildDir(SourceDir("//out/Debug/")); | |
| 484 | 474 |
| 485 Target shared_lib(setup.settings(), Label(SourceDir("//foo/"), "bar")); | 475 Target shared_lib(setup.settings(), Label(SourceDir("//foo/"), "bar")); |
| 486 shared_lib.set_output_type(Target::SHARED_LIBRARY); | 476 shared_lib.set_output_type(Target::SHARED_LIBRARY); |
| 487 shared_lib.SetToolchain(setup.toolchain()); | 477 shared_lib.SetToolchain(setup.toolchain()); |
| 488 shared_lib.sources().push_back(SourceFile("//foo/sources.cc")); | 478 shared_lib.sources().push_back(SourceFile("//foo/sources.cc")); |
| 489 shared_lib.sources().push_back(SourceFile("//foo/bar.def")); | 479 shared_lib.sources().push_back(SourceFile("//foo/bar.def")); |
| 490 | |
| 491 Err err; | |
| 492 ASSERT_TRUE(shared_lib.OnResolved(&err)); | 480 ASSERT_TRUE(shared_lib.OnResolved(&err)); |
| 493 | 481 |
| 494 std::ostringstream out; | 482 std::ostringstream out; |
| 495 NinjaBinaryTargetWriter writer(&shared_lib, out); | 483 NinjaBinaryTargetWriter writer(&shared_lib, out); |
| 496 writer.Run(); | 484 writer.Run(); |
| 497 | 485 |
| 498 const char expected[] = | 486 const char expected[] = |
| 499 "defines =\n" | 487 "defines =\n" |
| 500 "include_dirs =\n" | 488 "include_dirs =\n" |
| 501 "cflags =\n" | 489 "cflags =\n" |
| 502 "cflags_cc =\n" | 490 "cflags_cc =\n" |
| 503 "root_out_dir = .\n" | 491 "root_out_dir = .\n" |
| 504 "target_out_dir = obj/foo\n" | 492 "target_out_dir = obj/foo\n" |
| 505 "target_output_name = libbar\n" | 493 "target_output_name = libbar\n" |
| 506 "\n" | 494 "\n" |
| 507 "build obj/foo/libbar.sources.o: cxx ../../foo/sources.cc\n" | 495 "build obj/foo/libbar.sources.o: cxx ../../foo/sources.cc\n" |
| 508 "\n" | 496 "\n" |
| 509 "build ./libbar.so: solink obj/foo/libbar.sources.o | ../../foo/bar.def\n" | 497 "build ./libbar.so: solink obj/foo/libbar.sources.o | ../../foo/bar.def\n" |
| 510 " ldflags = /DEF:../../foo/bar.def\n" | 498 " ldflags = /DEF:../../foo/bar.def\n" |
| 511 " libs =\n" | 499 " libs =\n" |
| 512 " output_extension = .so\n" | 500 " output_extension = .so\n" |
| 513 " output_dir = \n"; | 501 " output_dir = \n"; |
| 514 EXPECT_EQ(expected, out.str()); | 502 EXPECT_EQ(expected, out.str()); |
| 515 } | 503 } |
| 516 | 504 |
| 517 TEST(NinjaBinaryTargetWriter, LoadableModule) { | 505 TEST(NinjaBinaryTargetWriter, LoadableModule) { |
| 506 Err err; |
| 518 TestWithScope setup; | 507 TestWithScope setup; |
| 519 setup.build_settings()->SetBuildDir(SourceDir("//out/Debug/")); | |
| 520 | 508 |
| 521 Target loadable_module(setup.settings(), Label(SourceDir("//foo/"), "bar")); | 509 Target loadable_module(setup.settings(), Label(SourceDir("//foo/"), "bar")); |
| 522 loadable_module.set_output_type(Target::LOADABLE_MODULE); | 510 loadable_module.set_output_type(Target::LOADABLE_MODULE); |
| 523 loadable_module.visibility().SetPublic(); | 511 loadable_module.visibility().SetPublic(); |
| 524 loadable_module.SetToolchain(setup.toolchain()); | 512 loadable_module.SetToolchain(setup.toolchain()); |
| 525 loadable_module.sources().push_back(SourceFile("//foo/sources.cc")); | 513 loadable_module.sources().push_back(SourceFile("//foo/sources.cc")); |
| 526 | |
| 527 Err err; | |
| 528 ASSERT_TRUE(loadable_module.OnResolved(&err)) << err.message(); | 514 ASSERT_TRUE(loadable_module.OnResolved(&err)) << err.message(); |
| 529 | 515 |
| 530 std::ostringstream out; | 516 std::ostringstream out; |
| 531 NinjaBinaryTargetWriter writer(&loadable_module, out); | 517 NinjaBinaryTargetWriter writer(&loadable_module, out); |
| 532 writer.Run(); | 518 writer.Run(); |
| 533 | 519 |
| 534 const char loadable_expected[] = | 520 const char loadable_expected[] = |
| 535 "defines =\n" | 521 "defines =\n" |
| 536 "include_dirs =\n" | 522 "include_dirs =\n" |
| 537 "cflags =\n" | 523 "cflags =\n" |
| (...skipping 313 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 851 NinjaBinaryTargetWriter writer(&target, out); | 837 NinjaBinaryTargetWriter writer(&target, out); |
| 852 writer.Run(); | 838 writer.Run(); |
| 853 | 839 |
| 854 // Should have issued an error. | 840 // Should have issued an error. |
| 855 EXPECT_TRUE(scheduler.is_failed()); | 841 EXPECT_TRUE(scheduler.is_failed()); |
| 856 } | 842 } |
| 857 | 843 |
| 858 // This tests that output extension and output dir overrides apply, and input | 844 // This tests that output extension and output dir overrides apply, and input |
| 859 // dependencies are applied. | 845 // dependencies are applied. |
| 860 TEST(NinjaBinaryTargetWriter, InputFiles) { | 846 TEST(NinjaBinaryTargetWriter, InputFiles) { |
| 847 Err err; |
| 861 TestWithScope setup; | 848 TestWithScope setup; |
| 862 Err err; | |
| 863 | |
| 864 setup.build_settings()->SetBuildDir(SourceDir("//out/Debug/")); | |
| 865 | 849 |
| 866 // This target has one input. | 850 // This target has one input. |
| 867 { | 851 { |
| 868 Target target(setup.settings(), Label(SourceDir("//foo/"), "bar")); | 852 Target target(setup.settings(), Label(SourceDir("//foo/"), "bar")); |
| 869 target.set_output_type(Target::SOURCE_SET); | 853 target.set_output_type(Target::SOURCE_SET); |
| 870 target.visibility().SetPublic(); | 854 target.visibility().SetPublic(); |
| 871 target.sources().push_back(SourceFile("//foo/input1.cc")); | 855 target.sources().push_back(SourceFile("//foo/input1.cc")); |
| 872 target.sources().push_back(SourceFile("//foo/input2.cc")); | 856 target.sources().push_back(SourceFile("//foo/input2.cc")); |
| 873 target.inputs().push_back(SourceFile("//foo/input.data")); | 857 target.inputs().push_back(SourceFile("//foo/input.data")); |
| 874 target.SetToolchain(setup.toolchain()); | 858 target.SetToolchain(setup.toolchain()); |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 929 " | obj/foo/bar.inputs.stamp\n" | 913 " | obj/foo/bar.inputs.stamp\n" |
| 930 "build obj/foo/bar.input2.o: cxx ../../foo/input2.cc" | 914 "build obj/foo/bar.input2.o: cxx ../../foo/input2.cc" |
| 931 " | obj/foo/bar.inputs.stamp\n" | 915 " | obj/foo/bar.inputs.stamp\n" |
| 932 "\n" | 916 "\n" |
| 933 "build obj/foo/bar.stamp: stamp obj/foo/bar.input1.o " | 917 "build obj/foo/bar.stamp: stamp obj/foo/bar.input1.o " |
| 934 "obj/foo/bar.input2.o\n"; | 918 "obj/foo/bar.input2.o\n"; |
| 935 | 919 |
| 936 EXPECT_EQ(expected, out.str()); | 920 EXPECT_EQ(expected, out.str()); |
| 937 } | 921 } |
| 938 } | 922 } |
| OLD | NEW |