| Index: tools/gn/ninja_script_target_writer_unittest.cc
|
| diff --git a/tools/gn/ninja_script_target_writer_unittest.cc b/tools/gn/ninja_script_target_writer_unittest.cc
|
| index f2c8a933092c8a4d50218d9215cd37354ce4f2c3..6319dff7ad97a997a87d2579937544f4ebe94c68 100644
|
| --- a/tools/gn/ninja_script_target_writer_unittest.cc
|
| +++ b/tools/gn/ninja_script_target_writer_unittest.cc
|
| @@ -36,6 +36,34 @@ TEST(NinjaScriptTargetWriter, WriteOutputFilesForBuildLine) {
|
| EXPECT_EQ(" gen/a$ bbar.h gen/bar.cc", out_str);
|
| }
|
|
|
| +TEST(NinjaScriptTargetWriter, WriteOutputFilesForBuildLineWithDepfile) {
|
| + TestWithScope setup;
|
| + setup.build_settings()->SetBuildDir(SourceDir("//out/Debug/"));
|
| + Target target(setup.settings(), Label(SourceDir("//foo/"), "bar"));
|
| +
|
| + target.script_values().set_depfile(
|
| + SourceFile("//out/Debug/gen/{{source_name_part}}.d"));
|
| + target.script_values().outputs().push_back(
|
| + SourceFile("//out/Debug/gen/{{source_name_part}}.h"));
|
| + target.script_values().outputs().push_back(
|
| + SourceFile("//out/Debug/gen/{{source_name_part}}.cc"));
|
| +
|
| + std::ostringstream out;
|
| + NinjaScriptTargetWriter writer(&target, setup.toolchain(), out);
|
| +
|
| + FileTemplate output_template = writer.GetOutputTemplate();
|
| +
|
| + SourceFile source("//foo/bar.in");
|
| + std::vector<OutputFile> output_files;
|
| + writer.WriteOutputFilesForBuildLine(output_template, source, &output_files);
|
| +
|
| + std::string out_str = out.str();
|
| +#if defined(OS_WIN)
|
| + std::replace(out_str.begin(), out_str.end(), '\\', '/');
|
| +#endif
|
| + EXPECT_EQ(" gen/bar.d gen/bar.h gen/bar.cc", out_str);
|
| +}
|
| +
|
| TEST(NinjaScriptTargetWriter, WriteArgsSubstitutions) {
|
| TestWithScope setup;
|
| setup.build_settings()->SetBuildDir(SourceDir("//out/Debug/"));
|
| @@ -77,7 +105,8 @@ TEST(NinjaScriptTargetWriter, InvokeOverSources) {
|
| target.script_values().args().push_back(
|
| "--out=foo bar{{source_name_part}}.o");
|
|
|
| - target.script_values().outputs().push_back(SourceFile("//out/Debug/{{source_name_part}}.out"));
|
| + target.script_values().outputs().push_back(
|
| + SourceFile("//out/Debug/{{source_name_part}}.out"));
|
|
|
| target.source_prereqs().push_back(SourceFile("//foo/included.txt"));
|
|
|
| @@ -159,3 +188,110 @@ TEST(NinjaScriptTargetWriter, InvokeOverSources) {
|
| EXPECT_EQ(expected_win, out_str);
|
| }
|
| }
|
| +
|
| +// Tests the "run script over multiple source files" mode, with a depfile.
|
| +TEST(NinjaScriptTargetWriter, InvokeOverSourcesWithDepfile) {
|
| + TestWithScope setup;
|
| + setup.build_settings()->SetBuildDir(SourceDir("//out/Debug/"));
|
| + Target target(setup.settings(), Label(SourceDir("//foo/"), "bar"));
|
| + target.set_output_type(Target::CUSTOM);
|
| +
|
| + target.sources().push_back(SourceFile("//foo/input1.txt"));
|
| + target.sources().push_back(SourceFile("//foo/input2.txt"));
|
| +
|
| + target.script_values().set_script(SourceFile("//foo/script.py"));
|
| + target.script_values().set_depfile(
|
| + SourceFile("//out/Debug/gen/{{source_name_part}}.d"));
|
| +
|
| + target.script_values().args().push_back("-i");
|
| + target.script_values().args().push_back("{{source}}");
|
| + target.script_values().args().push_back(
|
| + "--out=foo bar{{source_name_part}}.o");
|
| +
|
| + target.script_values().outputs().push_back(
|
| + SourceFile("//out/Debug/{{source_name_part}}.out"));
|
| +
|
| + target.source_prereqs().push_back(SourceFile("//foo/included.txt"));
|
| +
|
| + // Posix.
|
| + {
|
| + setup.settings()->set_target_os(Settings::LINUX);
|
| + setup.build_settings()->set_python_path(base::FilePath(FILE_PATH_LITERAL(
|
| + "/usr/bin/python")));
|
| +
|
| + std::ostringstream out;
|
| + NinjaScriptTargetWriter writer(&target, setup.toolchain(), out);
|
| + writer.Run();
|
| +
|
| + const char expected_linux[] =
|
| + "rule __foo_bar___rule\n"
|
| + " command = /usr/bin/python ../../foo/script.py -i ${source} "
|
| + "\"--out=foo$ bar${source_name_part}.o\"\n"
|
| + " description = CUSTOM //foo:bar()\n"
|
| + " restat = 1\n"
|
| + "\n"
|
| + "build gen/input1.d input1.out: __foo_bar___rule ../../foo/input1.txt"
|
| + " | ../../foo/included.txt\n"
|
| + " source = ../../foo/input1.txt\n"
|
| + " source_name_part = input1\n"
|
| + " depfile = gen/input1.d\n"
|
| + "build gen/input2.d input2.out: __foo_bar___rule ../../foo/input2.txt"
|
| + " | ../../foo/included.txt\n"
|
| + " source = ../../foo/input2.txt\n"
|
| + " source_name_part = input2\n"
|
| + " depfile = gen/input2.d\n"
|
| + "\n"
|
| + "build obj/foo/bar.stamp: stamp input1.out input2.out\n";
|
| +
|
| + std::string out_str = out.str();
|
| +#if defined(OS_WIN)
|
| + std::replace(out_str.begin(), out_str.end(), '\\', '/');
|
| +#endif
|
| + EXPECT_EQ(expected_linux, out_str);
|
| + }
|
| +
|
| + // Windows.
|
| + {
|
| + // Note: we use forward slashes here so that the output will be the same on
|
| + // Linux and Windows.
|
| + setup.build_settings()->set_python_path(base::FilePath(FILE_PATH_LITERAL(
|
| + "C:/python/python.exe")));
|
| + setup.settings()->set_target_os(Settings::WIN);
|
| +
|
| + std::ostringstream out;
|
| + NinjaScriptTargetWriter writer(&target, setup.toolchain(), out);
|
| + writer.Run();
|
| +
|
| + // TODO(brettw) I think we'll need to worry about backslashes here
|
| + // depending if we're on actual Windows or Linux pretending to be Windows.
|
| + const char expected_win[] =
|
| + "rule __foo_bar___rule\n"
|
| + " command = C:/python/python.exe gyp-win-tool action-wrapper "
|
| + "environment.x86 __foo_bar___rule.$unique_name.rsp\n"
|
| + " description = CUSTOM //foo:bar()\n"
|
| + " restat = 1\n"
|
| + " rspfile = __foo_bar___rule.$unique_name.rsp\n"
|
| + " rspfile_content = C:/python/python.exe ../../foo/script.py -i "
|
| + "${source} \"--out=foo$ bar${source_name_part}.o\"\n"
|
| + "\n"
|
| + "build gen/input1.d input1.out: __foo_bar___rule ../../foo/input1.txt"
|
| + " | ../../foo/included.txt\n"
|
| + " unique_name = 0\n"
|
| + " source = ../../foo/input1.txt\n"
|
| + " source_name_part = input1\n"
|
| + " depfile = gen/input1.d\n"
|
| + "build gen/input2.d input2.out: __foo_bar___rule ../../foo/input2.txt"
|
| + " | ../../foo/included.txt\n"
|
| + " unique_name = 1\n"
|
| + " source = ../../foo/input2.txt\n"
|
| + " source_name_part = input2\n"
|
| + " depfile = gen/input2.d\n"
|
| + "\n"
|
| + "build obj/foo/bar.stamp: stamp input1.out input2.out\n";
|
| + std::string out_str = out.str();
|
| +#if defined(OS_WIN)
|
| + std::replace(out_str.begin(), out_str.end(), '\\', '/');
|
| +#endif
|
| + EXPECT_EQ(expected_win, out_str);
|
| + }
|
| +}
|
|
|