Index: tools/gn/test_with_scope.cc |
diff --git a/tools/gn/test_with_scope.cc b/tools/gn/test_with_scope.cc |
index 55fbc2eb8fa3c1ca33d33c1eeefec8bb580acc7d..06f4d0476b15868d0417692aa66e0346992bbeea 100644 |
--- a/tools/gn/test_with_scope.cc |
+++ b/tools/gn/test_with_scope.cc |
@@ -8,6 +8,19 @@ |
#include "tools/gn/parser.h" |
#include "tools/gn/tokenizer.h" |
+namespace { |
+ |
+void SetCommandForTool(const std::string& cmd, Tool* tool) { |
+ Err err; |
+ SubstitutionPattern command; |
+ command.Parse(cmd, NULL, &err); |
+ CHECK(!err.has_error()) |
+ << "Couldn't parse \"" << cmd << "\", " << "got " << err.message(); |
+ tool->set_command(command); |
+} |
+ |
+} // namespace |
+ |
TestWithScope::TestWithScope() |
: build_settings_(), |
settings_(&build_settings_, std::string()), |
@@ -19,11 +32,98 @@ TestWithScope::TestWithScope() |
settings_.set_toolchain_label(toolchain_.label()); |
settings_.set_default_toolchain_label(toolchain_.label()); |
+ |
+ SetupToolchain(&toolchain_); |
} |
TestWithScope::~TestWithScope() { |
} |
+// static |
+void TestWithScope::SetupToolchain(Toolchain* toolchain) { |
+ Err err; |
+ |
+ // CC |
+ scoped_ptr<Tool> cc_tool(new Tool); |
+ SetCommandForTool( |
+ "cc {{source}} {{cflags}} {{cflags_c}} {{defines}} {{include_dirs}} " |
+ "-o {{output}}", |
+ cc_tool.get()); |
+ cc_tool->set_outputs(SubstitutionList::MakeForTest( |
+ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o")); |
+ toolchain->SetTool(Toolchain::TYPE_CC, cc_tool.Pass()); |
+ |
+ // CXX |
+ scoped_ptr<Tool> cxx_tool(new Tool); |
+ SetCommandForTool( |
+ "c++ {{source}} {{cflags}} {{cflags_cc}} {{defines}} {{include_dirs}} " |
+ "-o {{output}}", |
+ cxx_tool.get()); |
+ cxx_tool->set_outputs(SubstitutionList::MakeForTest( |
+ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o")); |
+ toolchain->SetTool(Toolchain::TYPE_CXX, cxx_tool.Pass()); |
+ |
+ // OBJC |
+ scoped_ptr<Tool> objc_tool(new Tool); |
+ SetCommandForTool( |
+ "objcc {{source}} {{cflags}} {{cflags_objc}} {{defines}} " |
+ "{{include_dirs}} -o {{output}}", |
+ objc_tool.get()); |
+ objc_tool->set_outputs(SubstitutionList::MakeForTest( |
+ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o")); |
+ toolchain->SetTool(Toolchain::TYPE_OBJC, objc_tool.Pass()); |
+ |
+ // OBJC |
+ scoped_ptr<Tool> objcxx_tool(new Tool); |
+ SetCommandForTool( |
+ "objcxx {{source}} {{cflags}} {{cflags_objcc}} {{defines}} " |
+ "{{include_dirs}} -o {{output}}", |
+ objcxx_tool.get()); |
+ objcxx_tool->set_outputs(SubstitutionList::MakeForTest( |
+ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o")); |
+ toolchain->SetTool(Toolchain::TYPE_OBJCXX, objcxx_tool.Pass()); |
+ |
+ // Don't use RC and ASM tools in unit tests yet. Add here if needed. |
+ |
+ // ALINK |
+ scoped_ptr<Tool> alink_tool(new Tool); |
+ SetCommandForTool("ar {{output}} {{source}}", alink_tool.get()); |
+ alink_tool->set_output_prefix("lib"); |
+ alink_tool->set_outputs(SubstitutionList::MakeForTest( |
+ "{{target_out_dir}}/{{target_output_name}}.a")); |
+ toolchain->SetTool(Toolchain::TYPE_ALINK, alink_tool.Pass()); |
+ |
+ // SOLINK |
+ scoped_ptr<Tool> solink_tool(new Tool); |
+ SetCommandForTool("ld -shared -o {{target_output_name}}.so {{inputs}} " |
+ "{{ldflags}} {{libs}}", solink_tool.get()); |
+ solink_tool->set_output_prefix("lib"); |
+ solink_tool->set_default_output_extension(".so"); |
+ solink_tool->set_outputs(SubstitutionList::MakeForTest( |
+ "{{root_out_dir}}/{{target_output_name}}{{output_extension}}")); |
+ toolchain->SetTool(Toolchain::TYPE_SOLINK, solink_tool.Pass()); |
+ |
+ // LINK |
+ scoped_ptr<Tool> link_tool(new Tool); |
+ SetCommandForTool("ld -o {{target_output_name}} {{source}} " |
+ "{{ldflags}} {{libs}}", link_tool.get()); |
+ link_tool->set_outputs(SubstitutionList::MakeForTest( |
+ "{{root_out_dir}}/{{target_output_name}}")); |
+ toolchain->SetTool(Toolchain::TYPE_LINK, link_tool.Pass()); |
+ |
+ // STAMP |
+ scoped_ptr<Tool> stamp_tool(new Tool); |
+ SetCommandForTool("touch {{output}}", stamp_tool.get()); |
+ toolchain->SetTool(Toolchain::TYPE_STAMP, stamp_tool.Pass()); |
+ |
+ // COPY |
+ scoped_ptr<Tool> copy_tool(new Tool); |
+ SetCommandForTool("cp {{source}} {{output}}", copy_tool.get()); |
+ toolchain->SetTool(Toolchain::TYPE_COPY, copy_tool.Pass()); |
+ |
+ toolchain->ToolchainSetupComplete(); |
+} |
+ |
void TestWithScope::AppendPrintOutput(const std::string& str) { |
print_output_.append(str); |
} |