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
3 // found in the LICENSE file.
7 #include "testing/gtest/include/gtest/gtest.h"
8 #include "tools/gn/ninja_binary_target_writer.h"
9 #include "tools/gn/test_with_scope.h"
11 TEST(NinjaBinaryTargetWriter, SourceSet) {
13 setup.build_settings()->SetBuildDir(SourceDir("//out/Debug/"));
14 setup.settings()->set_target_os(Settings::WIN);
16 Target target(setup.settings(), Label(SourceDir("//foo/"), "bar"));
17 target.set_output_type(Target::SOURCE_SET);
18 target.sources().push_back(SourceFile("//foo/input1.cc"));
19 target.sources().push_back(SourceFile("//foo/input2.cc"));
20 // Also test object files, which should be just passed through to the
21 // dependents to link.
22 target.sources().push_back(SourceFile("//foo/input3.o"));
23 target.sources().push_back(SourceFile("//foo/input4.obj"));
28 std::ostringstream out;
29 NinjaBinaryTargetWriter writer(&target, setup.toolchain(), out);
32 const char expected_win[] =
41 "target_out_dir = obj/foo\n"
44 "build obj/foo/bar.input1.obj: cxx ../../foo/input1.cc\n"
45 "build obj/foo/bar.input2.obj: cxx ../../foo/input2.cc\n"
47 "build obj/foo/bar.stamp: stamp obj/foo/bar.input1.obj "
48 "obj/foo/bar.input2.obj ../../foo/input3.o ../../foo/input4.obj\n";
49 std::string out_str = out.str();
51 std::replace(out_str.begin(), out_str.end(), '\\', '/');
53 EXPECT_EQ(expected_win, out_str);
56 // A shared library that depends on the source set.
57 Target shlib_target(setup.settings(), Label(SourceDir("//foo/"), "shlib"));
58 shlib_target.set_output_type(Target::SHARED_LIBRARY);
59 shlib_target.deps().push_back(LabelTargetPair(&target));
60 shlib_target.OnResolved();
63 std::ostringstream out;
64 NinjaBinaryTargetWriter writer(&shlib_target, setup.toolchain(), out);
67 const char expected_win[] =
75 "target_name = shlib\n"
76 "target_out_dir = obj/foo\n"
80 "manifests = obj/foo/shlib.intermediate.manifest\n"
81 "ldflags = /MANIFEST /ManifestFile:obj/foo/shlib.intermediate."
84 // Ordering of the obj files here should come out in the order
85 // specified, with the target's first, followed by the source set's, in
87 "build shlib.dll shlib.dll.lib: solink obj/foo/bar.input1.obj "
88 "obj/foo/bar.input2.obj ../../foo/input3.o "
89 "../../foo/input4.obj\n"
90 " soname = shlib.dll\n"
93 " implibflag = /IMPLIB:shlib.dll.lib\n\n";
94 std::string out_str = out.str();
96 std::replace(out_str.begin(), out_str.end(), '\\', '/');
98 EXPECT_EQ(expected_win, out_str);
101 // A static library that depends on the source set (should not link it).
102 Target stlib_target(setup.settings(), Label(SourceDir("//foo/"), "stlib"));
103 stlib_target.set_output_type(Target::STATIC_LIBRARY);
104 stlib_target.deps().push_back(LabelTargetPair(&target));
105 stlib_target.OnResolved();
108 std::ostringstream out;
109 NinjaBinaryTargetWriter writer(&stlib_target, setup.toolchain(), out);
112 const char expected_win[] =
120 "target_name = stlib\n"
121 "target_out_dir = obj/foo\n"
125 "manifests = obj/foo/stlib.intermediate.manifest\n"
126 "ldflags = /MANIFEST /ManifestFile:obj/foo/stlib.intermediate.manifest\n"
128 // There are no sources so there are no params to alink.
129 "build obj/foo/stlib.lib: alink\n\n";
130 std::string out_str = out.str();
132 std::replace(out_str.begin(), out_str.end(), '\\', '/');
134 EXPECT_EQ(expected_win, out_str);
139 TEST(NinjaBinaryTargetWriter, ProductExtension) {
141 setup.build_settings()->SetBuildDir(SourceDir("//out/Debug/"));
142 setup.settings()->set_target_os(Settings::LINUX);
144 // A shared library w/ the product_extension set to a custom value.
145 Target target(setup.settings(), Label(SourceDir("//foo/"), "shlib"));
146 target.set_output_type(Target::SHARED_LIBRARY);
147 target.set_output_extension(std::string("so.6"));
148 target.sources().push_back(SourceFile("//foo/input1.cc"));
149 target.sources().push_back(SourceFile("//foo/input2.cc"));
152 std::ostringstream out;
153 NinjaBinaryTargetWriter writer(&target, setup.toolchain(), out);
156 const char expected[] =
164 "target_name = shlib\n"
165 "target_out_dir = obj/foo\n"
168 "build obj/foo/shlib.input1.o: cxx ../../foo/input1.cc\n"
169 "build obj/foo/shlib.input2.o: cxx ../../foo/input2.cc\n"
173 "build libshlib.so.6: solink obj/foo/shlib.input1.o "
174 "obj/foo/shlib.input2.o\n"
175 " soname = libshlib.so.6\n"
176 " lib = libshlib.so.6\n"
179 std::string out_str = out.str();
181 std::replace(out_str.begin(), out_str.end(), '\\', '/');
183 EXPECT_EQ(expected, out_str);
186 TEST(NinjaBinaryTargetWriter, EmptyProductExtension) {
188 setup.build_settings()->SetBuildDir(SourceDir("//out/Debug/"));
189 setup.settings()->set_target_os(Settings::LINUX);
191 // This test is the same as ProductExtension, except that
192 // we call set_output_extension("") and ensure that we still get the default.
193 Target target(setup.settings(), Label(SourceDir("//foo/"), "shlib"));
194 target.set_output_type(Target::SHARED_LIBRARY);
195 target.set_output_extension(std::string());
196 target.sources().push_back(SourceFile("//foo/input1.cc"));
197 target.sources().push_back(SourceFile("//foo/input2.cc"));
199 std::ostringstream out;
200 NinjaBinaryTargetWriter writer(&target, setup.toolchain(), out);
203 const char expected[] =
211 "target_name = shlib\n"
212 "target_out_dir = obj/foo\n"
215 "build obj/foo/shlib.input1.o: cxx ../../foo/input1.cc\n"
216 "build obj/foo/shlib.input2.o: cxx ../../foo/input2.cc\n"
220 "build libshlib.so: solink obj/foo/shlib.input1.o "
221 "obj/foo/shlib.input2.o\n"
222 " soname = libshlib.so\n"
223 " lib = libshlib.so\n"
226 std::string out_str = out.str();
228 std::replace(out_str.begin(), out_str.end(), '\\', '/');
230 EXPECT_EQ(expected, out_str);