blob: 5fd066b68f8ecf7ecc52e6fc0e2171a7cf1374b5 [file] [log] [blame]
// Copyright (c) 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "gn/ninja_binary_target_writer.h"
#include "gn/test_with_scheduler.h"
#include "gn/test_with_scope.h"
#include "util/test/test.h"
using NinjaBinaryTargetWriterTest = TestWithScheduler;
TEST_F(NinjaBinaryTargetWriterTest, CSources) {
Err err;
TestWithScope setup;
Target target(setup.settings(), Label(SourceDir("//foo/"), "bar"));
target.set_output_type(Target::SOURCE_SET);
target.visibility().SetPublic();
target.sources().push_back(SourceFile("//foo/input1.cc"));
target.sources().push_back(SourceFile("//foo/input2.cc"));
// Also test object files, which should be just passed through to the
// dependents to link.
target.sources().push_back(SourceFile("//foo/input3.o"));
target.sources().push_back(SourceFile("//foo/input4.obj"));
target.source_types_used().Set(SourceFile::SOURCE_CPP);
target.source_types_used().Set(SourceFile::SOURCE_O);
target.SetToolchain(setup.toolchain());
ASSERT_TRUE(target.OnResolved(&err));
std::ostringstream out;
NinjaBinaryTargetWriter writer(&target, out);
writer.Run();
const char expected[] =
"defines =\n"
"include_dirs =\n"
"cflags =\n"
"cflags_cc =\n"
"root_out_dir = .\n"
"target_out_dir = obj/foo\n"
"target_output_name = bar\n"
"\n"
"build obj/foo/bar.input1.o: cxx ../../foo/input1.cc\n"
" source_file_part = input1.cc\n"
" source_name_part = input1\n"
"build obj/foo/bar.input2.o: cxx ../../foo/input2.cc\n"
" source_file_part = input2.cc\n"
" source_name_part = input2\n"
"\n"
"build obj/foo/bar.stamp: stamp obj/foo/bar.input1.o "
"obj/foo/bar.input2.o ../../foo/input3.o ../../foo/input4.obj\n";
std::string out_str = out.str();
EXPECT_EQ(expected, out_str);
}
TEST_F(NinjaBinaryTargetWriterTest, NoSourcesSourceSet) {
Err err;
TestWithScope setup;
Target target(setup.settings(), Label(SourceDir("//foo/"), "bar"));
target.set_output_type(Target::SOURCE_SET);
target.visibility().SetPublic();
target.SetToolchain(setup.toolchain());
ASSERT_TRUE(target.OnResolved(&err));
std::ostringstream out;
NinjaBinaryTargetWriter writer(&target, out);
writer.Run();
const char expected[] =
"defines =\n"
"include_dirs =\n"
"root_out_dir = .\n"
"target_out_dir = obj/foo\n"
"target_output_name = bar\n"
"\n"
"\n"
"build obj/foo/bar.stamp: stamp\n";
std::string out_str = out.str();
EXPECT_EQ(expected, out_str);
}
TEST_F(NinjaBinaryTargetWriterTest, NoSourcesStaticLib) {
Err err;
TestWithScope setup;
Target target(setup.settings(), Label(SourceDir("//foo/"), "bar"));
target.set_output_type(Target::STATIC_LIBRARY);
target.visibility().SetPublic();
target.SetToolchain(setup.toolchain());
ASSERT_TRUE(target.OnResolved(&err));
std::ostringstream out;
NinjaBinaryTargetWriter writer(&target, out);
writer.Run();
const char expected[] =
"defines =\n"
"include_dirs =\n"
"root_out_dir = .\n"
"target_out_dir = obj/foo\n"
"target_output_name = libbar\n"
"\n"
"\n"
"build obj/foo/libbar.a: alink\n"
" arflags =\n"
" output_extension = \n"
" output_dir = \n";
std::string out_str = out.str();
EXPECT_EQ(expected, out_str);
}
TEST_F(NinjaBinaryTargetWriterTest, Inputs) {
Err err;
TestWithScope setup;
{
Target target(setup.settings(), Label(SourceDir("//foo/"), "bar"));
target.set_output_type(Target::SOURCE_SET);
target.visibility().SetPublic();
target.sources().push_back(SourceFile("//foo/source1.cc"));
target.config_values().inputs().push_back(SourceFile("//foo/input1"));
target.config_values().inputs().push_back(SourceFile("//foo/input2"));
target.source_types_used().Set(SourceFile::SOURCE_CPP);
target.SetToolchain(setup.toolchain());
ASSERT_TRUE(target.OnResolved(&err));
std::ostringstream out;
NinjaBinaryTargetWriter writer(&target, out);
writer.Run();
const char expected[] =
"defines =\n"
"include_dirs =\n"
"cflags =\n"
"cflags_cc =\n"
"root_out_dir = .\n"
"target_out_dir = obj/foo\n"
"target_output_name = bar\n"
"\n"
"build obj/foo/bar.source1.o: cxx ../../foo/source1.cc | "
"../../foo/input1 ../../foo/input2\n"
" source_file_part = source1.cc\n"
" source_name_part = source1\n"
"\n"
"build obj/foo/bar.stamp: stamp obj/foo/bar.source1.o\n";
std::string out_str = out.str();
EXPECT_EQ(expected, out_str) << expected << "\n" << out_str;
}
{
Target target(setup.settings(), Label(SourceDir("//foo/"), "bar"));
target.set_output_type(Target::SOURCE_SET);
target.visibility().SetPublic();
target.sources().push_back(SourceFile("//foo/source1.cc"));
target.sources().push_back(SourceFile("//foo/source2.cc"));
target.config_values().inputs().push_back(SourceFile("//foo/input1"));
target.config_values().inputs().push_back(SourceFile("//foo/input2"));
target.source_types_used().Set(SourceFile::SOURCE_CPP);
target.SetToolchain(setup.toolchain());
ASSERT_TRUE(target.OnResolved(&err));
std::ostringstream out;
NinjaBinaryTargetWriter writer(&target, out);
writer.Run();
const char expected[] =
"defines =\n"
"include_dirs =\n"
"cflags =\n"
"cflags_cc =\n"
"root_out_dir = .\n"
"target_out_dir = obj/foo\n"
"target_output_name = bar\n"
"\n"
"build obj/foo/bar.inputs.stamp: stamp "
"../../foo/input1 ../../foo/input2\n"
"build obj/foo/bar.source1.o: cxx ../../foo/source1.cc | "
"obj/foo/bar.inputs.stamp\n"
" source_file_part = source1.cc\n"
" source_name_part = source1\n"
"build obj/foo/bar.source2.o: cxx ../../foo/source2.cc | "
"obj/foo/bar.inputs.stamp\n"
" source_file_part = source2.cc\n"
" source_name_part = source2\n"
"\n"
"build obj/foo/bar.stamp: stamp obj/foo/bar.source1.o "
"obj/foo/bar.source2.o\n";
std::string out_str = out.str();
EXPECT_EQ(expected, out_str) << expected << "\n" << out_str;
}
}