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" |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
75 "\n" | 75 "\n" |
76 "\n" | 76 "\n" |
77 // Ordering of the obj files here should come out in the order | 77 // Ordering of the obj files here should come out in the order |
78 // specified, with the target's first, followed by the source set's, in | 78 // specified, with the target's first, followed by the source set's, in |
79 // order. | 79 // order. |
80 "build ./libshlib.so: solink obj/foo/bar.input1.o " | 80 "build ./libshlib.so: solink obj/foo/bar.input1.o " |
81 "obj/foo/bar.input2.o ../../foo/input3.o ../../foo/input4.obj " | 81 "obj/foo/bar.input2.o ../../foo/input3.o ../../foo/input4.obj " |
82 "|| obj/foo/bar.stamp\n" | 82 "|| obj/foo/bar.stamp\n" |
83 " ldflags =\n" | 83 " ldflags =\n" |
84 " libs =\n" | 84 " libs =\n" |
85 " output_extension = .so\n"; | 85 " output_extension = .so\n" |
| 86 " output_dir = \n"; |
86 std::string out_str = out.str(); | 87 std::string out_str = out.str(); |
87 EXPECT_EQ(expected, out_str); | 88 EXPECT_EQ(expected, out_str); |
88 } | 89 } |
89 | 90 |
90 // A static library that depends on the source set (should not link it). | 91 // A static library that depends on the source set (should not link it). |
91 Target stlib_target(setup.settings(), Label(SourceDir("//foo/"), "stlib")); | 92 Target stlib_target(setup.settings(), Label(SourceDir("//foo/"), "stlib")); |
92 stlib_target.set_output_type(Target::STATIC_LIBRARY); | 93 stlib_target.set_output_type(Target::STATIC_LIBRARY); |
93 stlib_target.public_deps().push_back(LabelTargetPair(&target)); | 94 stlib_target.public_deps().push_back(LabelTargetPair(&target)); |
94 stlib_target.SetToolchain(setup.toolchain()); | 95 stlib_target.SetToolchain(setup.toolchain()); |
95 ASSERT_TRUE(stlib_target.OnResolved(&err)); | 96 ASSERT_TRUE(stlib_target.OnResolved(&err)); |
96 | 97 |
97 { | 98 { |
98 std::ostringstream out; | 99 std::ostringstream out; |
99 NinjaBinaryTargetWriter writer(&stlib_target, out); | 100 NinjaBinaryTargetWriter writer(&stlib_target, out); |
100 writer.Run(); | 101 writer.Run(); |
101 | 102 |
102 const char expected[] = | 103 const char expected[] = |
103 "defines =\n" | 104 "defines =\n" |
104 "include_dirs =\n" | 105 "include_dirs =\n" |
105 "root_out_dir = .\n" | 106 "root_out_dir = .\n" |
106 "target_out_dir = obj/foo\n" | 107 "target_out_dir = obj/foo\n" |
107 "target_output_name = libstlib\n" | 108 "target_output_name = libstlib\n" |
108 "\n" | 109 "\n" |
109 "\n" | 110 "\n" |
110 // There are no sources so there are no params to alink. (In practice | 111 // There are no sources so there are no params to alink. (In practice |
111 // this will probably fail in the archive tool.) | 112 // this will probably fail in the archive tool.) |
112 "build obj/foo/libstlib.a: alink || obj/foo/bar.stamp\n" | 113 "build obj/foo/libstlib.a: alink || obj/foo/bar.stamp\n" |
113 " output_extension = \n"; | 114 " output_extension = \n" |
| 115 " output_dir = \n"; |
114 std::string out_str = out.str(); | 116 std::string out_str = out.str(); |
115 EXPECT_EQ(expected, out_str); | 117 EXPECT_EQ(expected, out_str); |
116 } | 118 } |
117 | 119 |
118 // Make the static library 'complete', which means it should be linked. | 120 // Make the static library 'complete', which means it should be linked. |
119 stlib_target.set_complete_static_lib(true); | 121 stlib_target.set_complete_static_lib(true); |
120 { | 122 { |
121 std::ostringstream out; | 123 std::ostringstream out; |
122 NinjaBinaryTargetWriter writer(&stlib_target, out); | 124 NinjaBinaryTargetWriter writer(&stlib_target, out); |
123 writer.Run(); | 125 writer.Run(); |
124 | 126 |
125 const char expected[] = | 127 const char expected[] = |
126 "defines =\n" | 128 "defines =\n" |
127 "include_dirs =\n" | 129 "include_dirs =\n" |
128 "root_out_dir = .\n" | 130 "root_out_dir = .\n" |
129 "target_out_dir = obj/foo\n" | 131 "target_out_dir = obj/foo\n" |
130 "target_output_name = libstlib\n" | 132 "target_output_name = libstlib\n" |
131 "\n" | 133 "\n" |
132 "\n" | 134 "\n" |
133 // Ordering of the obj files here should come out in the order | 135 // Ordering of the obj files here should come out in the order |
134 // specified, with the target's first, followed by the source set's, in | 136 // specified, with the target's first, followed by the source set's, in |
135 // order. | 137 // order. |
136 "build obj/foo/libstlib.a: alink obj/foo/bar.input1.o " | 138 "build obj/foo/libstlib.a: alink obj/foo/bar.input1.o " |
137 "obj/foo/bar.input2.o ../../foo/input3.o ../../foo/input4.obj " | 139 "obj/foo/bar.input2.o ../../foo/input3.o ../../foo/input4.obj " |
138 "|| obj/foo/bar.stamp\n" | 140 "|| obj/foo/bar.stamp\n" |
139 " output_extension = \n"; | 141 " output_extension = \n" |
| 142 " output_dir = \n"; |
140 std::string out_str = out.str(); | 143 std::string out_str = out.str(); |
141 EXPECT_EQ(expected, out_str); | 144 EXPECT_EQ(expected, out_str); |
142 } | 145 } |
143 } | 146 } |
144 | 147 |
145 // This tests that output extension overrides apply, and input dependencies | 148 // This tests that output extension and output dir overrides apply, and input |
146 // are applied. | 149 // dependencies are applied. |
147 TEST(NinjaBinaryTargetWriter, ProductExtensionAndInputDeps) { | 150 TEST(NinjaBinaryTargetWriter, OutputExtensionAndInputDeps) { |
148 TestWithScope setup; | 151 TestWithScope setup; |
149 Err err; | 152 Err err; |
150 | 153 |
151 setup.build_settings()->SetBuildDir(SourceDir("//out/Debug/")); | 154 setup.build_settings()->SetBuildDir(SourceDir("//out/Debug/")); |
152 | 155 |
153 // An action for our library to depend on. | 156 // An action for our library to depend on. |
154 Target action(setup.settings(), Label(SourceDir("//foo/"), "action")); | 157 Target action(setup.settings(), Label(SourceDir("//foo/"), "action")); |
155 action.set_output_type(Target::ACTION_FOREACH); | 158 action.set_output_type(Target::ACTION_FOREACH); |
156 action.visibility().SetPublic(); | 159 action.visibility().SetPublic(); |
157 action.SetToolchain(setup.toolchain()); | 160 action.SetToolchain(setup.toolchain()); |
158 ASSERT_TRUE(action.OnResolved(&err)); | 161 ASSERT_TRUE(action.OnResolved(&err)); |
159 | 162 |
160 // A shared library w/ the product_extension set to a custom value. | 163 // A shared library w/ the output_extension set to a custom value. |
161 Target target(setup.settings(), Label(SourceDir("//foo/"), "shlib")); | 164 Target target(setup.settings(), Label(SourceDir("//foo/"), "shlib")); |
162 target.set_output_type(Target::SHARED_LIBRARY); | 165 target.set_output_type(Target::SHARED_LIBRARY); |
163 target.set_output_extension(std::string("so.6")); | 166 target.set_output_extension(std::string("so.6")); |
| 167 target.set_output_dir(SourceDir("//out/Debug/foo/")); |
164 target.sources().push_back(SourceFile("//foo/input1.cc")); | 168 target.sources().push_back(SourceFile("//foo/input1.cc")); |
165 target.sources().push_back(SourceFile("//foo/input2.cc")); | 169 target.sources().push_back(SourceFile("//foo/input2.cc")); |
166 target.public_deps().push_back(LabelTargetPair(&action)); | 170 target.public_deps().push_back(LabelTargetPair(&action)); |
167 target.SetToolchain(setup.toolchain()); | 171 target.SetToolchain(setup.toolchain()); |
168 ASSERT_TRUE(target.OnResolved(&err)); | 172 ASSERT_TRUE(target.OnResolved(&err)); |
169 | 173 |
170 std::ostringstream out; | 174 std::ostringstream out; |
171 NinjaBinaryTargetWriter writer(&target, out); | 175 NinjaBinaryTargetWriter writer(&target, out); |
172 writer.Run(); | 176 writer.Run(); |
173 | 177 |
(...skipping 11 matching lines...) Expand all Loading... |
185 "build obj/foo/libshlib.input2.o: cxx ../../foo/input2.cc" | 189 "build obj/foo/libshlib.input2.o: cxx ../../foo/input2.cc" |
186 " || obj/foo/action.stamp\n" | 190 " || obj/foo/action.stamp\n" |
187 "\n" | 191 "\n" |
188 "build ./libshlib.so.6: solink obj/foo/libshlib.input1.o " | 192 "build ./libshlib.so.6: solink obj/foo/libshlib.input1.o " |
189 // The order-only dependency here is stricly unnecessary since the | 193 // The order-only dependency here is stricly unnecessary since the |
190 // sources list this as an order-only dep. See discussion in the code | 194 // sources list this as an order-only dep. See discussion in the code |
191 // that writes this. | 195 // that writes this. |
192 "obj/foo/libshlib.input2.o || obj/foo/action.stamp\n" | 196 "obj/foo/libshlib.input2.o || obj/foo/action.stamp\n" |
193 " ldflags =\n" | 197 " ldflags =\n" |
194 " libs =\n" | 198 " libs =\n" |
195 " output_extension = .so.6\n"; | 199 " output_extension = .so.6\n" |
| 200 " output_dir = foo\n"; |
196 | 201 |
197 std::string out_str = out.str(); | 202 std::string out_str = out.str(); |
198 EXPECT_EQ(expected, out_str); | 203 EXPECT_EQ(expected, out_str); |
199 } | 204 } |
200 | 205 |
201 // Tests libs are applied. | 206 // Tests libs are applied. |
202 TEST(NinjaBinaryTargetWriter, LibsAndLibDirs) { | 207 TEST(NinjaBinaryTargetWriter, LibsAndLibDirs) { |
203 TestWithScope setup; | 208 TestWithScope setup; |
204 Err err; | 209 Err err; |
205 | 210 |
(...skipping 16 matching lines...) Expand all Loading... |
222 "defines =\n" | 227 "defines =\n" |
223 "include_dirs =\n" | 228 "include_dirs =\n" |
224 "root_out_dir = .\n" | 229 "root_out_dir = .\n" |
225 "target_out_dir = obj/foo\n" | 230 "target_out_dir = obj/foo\n" |
226 "target_output_name = libshlib\n" | 231 "target_output_name = libshlib\n" |
227 "\n" | 232 "\n" |
228 "\n" | 233 "\n" |
229 "build ./libshlib.so: solink | ../../foo/lib1.a\n" | 234 "build ./libshlib.so: solink | ../../foo/lib1.a\n" |
230 " ldflags = -L../../foo/bar\n" | 235 " ldflags = -L../../foo/bar\n" |
231 " libs = ../../foo/lib1.a -lfoo\n" | 236 " libs = ../../foo/lib1.a -lfoo\n" |
232 " output_extension = .so\n"; | 237 " output_extension = .so\n" |
| 238 " output_dir = \n"; |
233 | 239 |
234 std::string out_str = out.str(); | 240 std::string out_str = out.str(); |
235 EXPECT_EQ(expected, out_str); | 241 EXPECT_EQ(expected, out_str); |
236 } | 242 } |
237 | 243 |
238 TEST(NinjaBinaryTargetWriter, EmptyProductExtension) { | 244 TEST(NinjaBinaryTargetWriter, EmptyOutputExtension) { |
239 TestWithScope setup; | 245 TestWithScope setup; |
240 Err err; | 246 Err err; |
241 | 247 |
242 setup.build_settings()->SetBuildDir(SourceDir("//out/Debug/")); | 248 setup.build_settings()->SetBuildDir(SourceDir("//out/Debug/")); |
243 | 249 |
244 // This test is the same as ProductExtension, except that we call | 250 // This test is the same as OutputExtensionAndInputDeps, except that we call |
245 // set_output_extension("") and ensure that we get an empty one and override | 251 // set_output_extension("") and ensure that we get an empty one and override |
246 // the output prefix so that the name matches the target exactly. | 252 // the output prefix so that the name matches the target exactly. |
247 Target target(setup.settings(), Label(SourceDir("//foo/"), "shlib")); | 253 Target target(setup.settings(), Label(SourceDir("//foo/"), "shlib")); |
248 target.set_output_type(Target::SHARED_LIBRARY); | 254 target.set_output_type(Target::SHARED_LIBRARY); |
249 target.set_output_prefix_override(true); | 255 target.set_output_prefix_override(true); |
250 target.set_output_extension(std::string()); | 256 target.set_output_extension(std::string()); |
251 target.sources().push_back(SourceFile("//foo/input1.cc")); | 257 target.sources().push_back(SourceFile("//foo/input1.cc")); |
252 target.sources().push_back(SourceFile("//foo/input2.cc")); | 258 target.sources().push_back(SourceFile("//foo/input2.cc")); |
253 | 259 |
254 target.SetToolchain(setup.toolchain()); | 260 target.SetToolchain(setup.toolchain()); |
(...skipping 12 matching lines...) Expand all Loading... |
267 "target_out_dir = obj/foo\n" | 273 "target_out_dir = obj/foo\n" |
268 "target_output_name = shlib\n" | 274 "target_output_name = shlib\n" |
269 "\n" | 275 "\n" |
270 "build obj/foo/shlib.input1.o: cxx ../../foo/input1.cc\n" | 276 "build obj/foo/shlib.input1.o: cxx ../../foo/input1.cc\n" |
271 "build obj/foo/shlib.input2.o: cxx ../../foo/input2.cc\n" | 277 "build obj/foo/shlib.input2.o: cxx ../../foo/input2.cc\n" |
272 "\n" | 278 "\n" |
273 "build ./shlib: solink obj/foo/shlib.input1.o " | 279 "build ./shlib: solink obj/foo/shlib.input1.o " |
274 "obj/foo/shlib.input2.o\n" | 280 "obj/foo/shlib.input2.o\n" |
275 " ldflags =\n" | 281 " ldflags =\n" |
276 " libs =\n" | 282 " libs =\n" |
277 " output_extension = \n"; | 283 " output_extension = \n" |
| 284 " output_dir = \n"; |
278 | 285 |
279 std::string out_str = out.str(); | 286 std::string out_str = out.str(); |
280 EXPECT_EQ(expected, out_str); | 287 EXPECT_EQ(expected, out_str); |
281 } | 288 } |
282 | 289 |
283 TEST(NinjaBinaryTargetWriter, SourceSetDataDeps) { | 290 TEST(NinjaBinaryTargetWriter, SourceSetDataDeps) { |
284 TestWithScope setup; | 291 TestWithScope setup; |
285 setup.build_settings()->SetBuildDir(SourceDir("//out/Debug/")); | 292 setup.build_settings()->SetBuildDir(SourceDir("//out/Debug/")); |
286 | 293 |
287 Err err; | 294 Err err; |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
350 "root_out_dir = .\n" | 357 "root_out_dir = .\n" |
351 "target_out_dir = obj/foo\n" | 358 "target_out_dir = obj/foo\n" |
352 "target_output_name = exe\n" | 359 "target_output_name = exe\n" |
353 "\n" | 360 "\n" |
354 "build obj/foo/exe.final.o: cxx ../../foo/final.cc\n" | 361 "build obj/foo/exe.final.o: cxx ../../foo/final.cc\n" |
355 "\n" | 362 "\n" |
356 "build ./exe: link obj/foo/exe.final.o obj/foo/inter.inter.o || " | 363 "build ./exe: link obj/foo/exe.final.o obj/foo/inter.inter.o || " |
357 "obj/foo/inter.stamp\n" | 364 "obj/foo/inter.stamp\n" |
358 " ldflags =\n" | 365 " ldflags =\n" |
359 " libs =\n" | 366 " libs =\n" |
360 " output_extension = \n"; | 367 " output_extension = \n" |
| 368 " output_dir = \n"; |
361 EXPECT_EQ(final_expected, final_out.str()); | 369 EXPECT_EQ(final_expected, final_out.str()); |
362 } | 370 } |
363 | 371 |
364 TEST(NinjaBinaryTargetWriter, SharedLibraryModuleDefinitionFile) { | 372 TEST(NinjaBinaryTargetWriter, SharedLibraryModuleDefinitionFile) { |
365 TestWithScope setup; | 373 TestWithScope setup; |
366 setup.build_settings()->SetBuildDir(SourceDir("//out/Debug/")); | 374 setup.build_settings()->SetBuildDir(SourceDir("//out/Debug/")); |
367 | 375 |
368 Target shared_lib(setup.settings(), Label(SourceDir("//foo/"), "bar")); | 376 Target shared_lib(setup.settings(), Label(SourceDir("//foo/"), "bar")); |
369 shared_lib.set_output_type(Target::SHARED_LIBRARY); | 377 shared_lib.set_output_type(Target::SHARED_LIBRARY); |
370 shared_lib.SetToolchain(setup.toolchain()); | 378 shared_lib.SetToolchain(setup.toolchain()); |
(...skipping 14 matching lines...) Expand all Loading... |
385 "cflags_cc =\n" | 393 "cflags_cc =\n" |
386 "root_out_dir = .\n" | 394 "root_out_dir = .\n" |
387 "target_out_dir = obj/foo\n" | 395 "target_out_dir = obj/foo\n" |
388 "target_output_name = libbar\n" | 396 "target_output_name = libbar\n" |
389 "\n" | 397 "\n" |
390 "build obj/foo/libbar.sources.o: cxx ../../foo/sources.cc\n" | 398 "build obj/foo/libbar.sources.o: cxx ../../foo/sources.cc\n" |
391 "\n" | 399 "\n" |
392 "build ./libbar.so: solink obj/foo/libbar.sources.o | ../../foo/bar.def\n" | 400 "build ./libbar.so: solink obj/foo/libbar.sources.o | ../../foo/bar.def\n" |
393 " ldflags = /DEF:../../foo/bar.def\n" | 401 " ldflags = /DEF:../../foo/bar.def\n" |
394 " libs =\n" | 402 " libs =\n" |
395 " output_extension = .so\n"; | 403 " output_extension = .so\n" |
| 404 " output_dir = \n"; |
396 EXPECT_EQ(expected, out.str()); | 405 EXPECT_EQ(expected, out.str()); |
397 } | 406 } |
398 | 407 |
399 TEST(NinjaBinaryTargetWriter, LoadableModule) { | 408 TEST(NinjaBinaryTargetWriter, LoadableModule) { |
400 TestWithScope setup; | 409 TestWithScope setup; |
401 setup.build_settings()->SetBuildDir(SourceDir("//out/Debug/")); | 410 setup.build_settings()->SetBuildDir(SourceDir("//out/Debug/")); |
402 | 411 |
403 Target loadable_module(setup.settings(), Label(SourceDir("//foo/"), "bar")); | 412 Target loadable_module(setup.settings(), Label(SourceDir("//foo/"), "bar")); |
404 loadable_module.set_output_type(Target::LOADABLE_MODULE); | 413 loadable_module.set_output_type(Target::LOADABLE_MODULE); |
405 loadable_module.visibility().SetPublic(); | 414 loadable_module.visibility().SetPublic(); |
(...skipping 14 matching lines...) Expand all Loading... |
420 "cflags_cc =\n" | 429 "cflags_cc =\n" |
421 "root_out_dir = .\n" | 430 "root_out_dir = .\n" |
422 "target_out_dir = obj/foo\n" | 431 "target_out_dir = obj/foo\n" |
423 "target_output_name = libbar\n" | 432 "target_output_name = libbar\n" |
424 "\n" | 433 "\n" |
425 "build obj/foo/libbar.sources.o: cxx ../../foo/sources.cc\n" | 434 "build obj/foo/libbar.sources.o: cxx ../../foo/sources.cc\n" |
426 "\n" | 435 "\n" |
427 "build ./libbar.so: solink_module obj/foo/libbar.sources.o\n" | 436 "build ./libbar.so: solink_module obj/foo/libbar.sources.o\n" |
428 " ldflags =\n" | 437 " ldflags =\n" |
429 " libs =\n" | 438 " libs =\n" |
430 " output_extension = .so\n"; | 439 " output_extension = .so\n" |
| 440 " output_dir = \n"; |
431 EXPECT_EQ(loadable_expected, out.str()); | 441 EXPECT_EQ(loadable_expected, out.str()); |
432 | 442 |
433 // Final target. | 443 // Final target. |
434 Target exe(setup.settings(), Label(SourceDir("//foo/"), "exe")); | 444 Target exe(setup.settings(), Label(SourceDir("//foo/"), "exe")); |
435 exe.set_output_type(Target::EXECUTABLE); | 445 exe.set_output_type(Target::EXECUTABLE); |
436 exe.public_deps().push_back(LabelTargetPair(&loadable_module)); | 446 exe.public_deps().push_back(LabelTargetPair(&loadable_module)); |
437 exe.SetToolchain(setup.toolchain()); | 447 exe.SetToolchain(setup.toolchain()); |
438 exe.sources().push_back(SourceFile("//foo/final.cc")); | 448 exe.sources().push_back(SourceFile("//foo/final.cc")); |
439 ASSERT_TRUE(exe.OnResolved(&err)) << err.message(); | 449 ASSERT_TRUE(exe.OnResolved(&err)) << err.message(); |
440 | 450 |
(...skipping 10 matching lines...) Expand all Loading... |
451 "cflags_cc =\n" | 461 "cflags_cc =\n" |
452 "root_out_dir = .\n" | 462 "root_out_dir = .\n" |
453 "target_out_dir = obj/foo\n" | 463 "target_out_dir = obj/foo\n" |
454 "target_output_name = exe\n" | 464 "target_output_name = exe\n" |
455 "\n" | 465 "\n" |
456 "build obj/foo/exe.final.o: cxx ../../foo/final.cc\n" | 466 "build obj/foo/exe.final.o: cxx ../../foo/final.cc\n" |
457 "\n" | 467 "\n" |
458 "build ./exe: link obj/foo/exe.final.o || ./libbar.so\n" | 468 "build ./exe: link obj/foo/exe.final.o || ./libbar.so\n" |
459 " ldflags =\n" | 469 " ldflags =\n" |
460 " libs =\n" | 470 " libs =\n" |
461 " output_extension = \n"; | 471 " output_extension = \n" |
| 472 " output_dir = \n"; |
462 EXPECT_EQ(final_expected, final_out.str()); | 473 EXPECT_EQ(final_expected, final_out.str()); |
463 } | 474 } |
464 | 475 |
465 TEST(NinjaBinaryTargetWriter, WinPrecompiledHeaders) { | 476 TEST(NinjaBinaryTargetWriter, WinPrecompiledHeaders) { |
466 Err err; | 477 Err err; |
467 | 478 |
468 // This setup's toolchain does not have precompiled headers defined. | 479 // This setup's toolchain does not have precompiled headers defined. |
469 TestWithScope setup; | 480 TestWithScope setup; |
470 | 481 |
471 // A precompiled header toolchain. | 482 // A precompiled header toolchain. |
(...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
727 | 738 |
728 EXPECT_FALSE(scheduler.is_failed()); | 739 EXPECT_FALSE(scheduler.is_failed()); |
729 | 740 |
730 std::ostringstream out; | 741 std::ostringstream out; |
731 NinjaBinaryTargetWriter writer(&target, out); | 742 NinjaBinaryTargetWriter writer(&target, out); |
732 writer.Run(); | 743 writer.Run(); |
733 | 744 |
734 // Should have issued an error. | 745 // Should have issued an error. |
735 EXPECT_TRUE(scheduler.is_failed()); | 746 EXPECT_TRUE(scheduler.is_failed()); |
736 } | 747 } |
OLD | NEW |