set 'no_stamp_files' by default
This sets 'no_stamp_files' by default and update test expectations
to use phony rule instead of stamp.
Bug: 42440099
Change-Id: I14c7463fcdf680c643d55e4329d884f77131cecc
Reviewed-on: https://gn-review.googlesource.com/c/gn/+/17620
Reviewed-by: David Turner <digit@google.com>
Commit-Queue: Takuto Ikuta <tikuta@google.com>
diff --git a/src/gn/build_settings.h b/src/gn/build_settings.h
index dd3bd9c..3d1dbf2 100644
--- a/src/gn/build_settings.h
+++ b/src/gn/build_settings.h
@@ -152,7 +152,7 @@
// See 40045b9 for the reason behind using 1.7.2 as the default version.
Version ninja_required_version_{1, 7, 2};
- bool no_stamp_files_ = false;
+ bool no_stamp_files_ = true;
SourceFile build_config_file_;
SourceFile arg_file_template_path_;
diff --git a/src/gn/ninja_action_target_writer_unittest.cc b/src/gn/ninja_action_target_writer_unittest.cc
index 3f41d97..9b7c76f 100644
--- a/src/gn/ninja_action_target_writer_unittest.cc
+++ b/src/gn/ninja_action_target_writer_unittest.cc
@@ -68,7 +68,7 @@
build foo.out: __foo___bar___rule | ../../foo++/script.py ../../foo++/included.txt
-build obj/foo++/bar.stamp: stamp foo.out
+build phony/foo++/bar: phony foo.out
)";
EXPECT_EQ(expected, out.str()) << expected << "--" << out.str();
}
@@ -113,7 +113,7 @@
build foo.out: __foo_bar___rule | ../../foo/script.py ../../foo/included.txt
pool = console
-build obj/foo/bar.stamp: stamp foo.out
+build phony/foo/bar: phony foo.out
)";
EXPECT_EQ(expected, out.str());
}
@@ -154,7 +154,7 @@
"build foo.out: __foo_bar___rule | ../../foo/script.py "
"../../foo/included.txt ../../foo/source.txt\n"
"\n"
- "build obj/foo/bar.stamp: stamp foo.out\n";
+ "build phony/foo/bar: phony foo.out\n";
EXPECT_EQ(expected_linux, out.str());
}
@@ -209,10 +209,10 @@
" restat = 1\n"
"\n"
"build foo.out: __foo_bar___rule | ../../foo/script.py "
- "../../foo/included.txt ../../foo/source.txt obj/foo/dep.stamp || "
- "obj/foo/datadep.stamp\n"
+ "../../foo/included.txt ../../foo/source.txt phony/foo/dep || "
+ "phony/foo/datadep\n"
"\n"
- "build obj/foo/bar.stamp: stamp foo.out\n";
+ "build phony/foo/bar: phony foo.out\n";
EXPECT_EQ(expected, out.str());
}
@@ -284,20 +284,20 @@
#endif
" description = ACTION //foo:bar()\n"
" restat = 1\n"
- "build obj/foo/bar.inputdeps.stamp: stamp ../../foo/script.py "
- "../../foo/included.txt obj/foo/dep.stamp\n"
+ "build phony/foo/bar.inputdeps: phony ../../foo/script.py "
+ "../../foo/included.txt phony/foo/dep\n"
"\n"
"build input1.out: __foo_bar___rule ../../foo/input1.txt | "
- "obj/foo/bar.inputdeps.stamp || obj/foo/bundle_data_dep.stamp "
- "obj/foo/datadep.stamp\n"
+ "phony/foo/bar.inputdeps || phony/foo/bundle_data_dep "
+ "phony/foo/datadep\n"
" source_name_part = input1\n"
"build input2.out: __foo_bar___rule ../../foo/input2.txt | "
- "obj/foo/bar.inputdeps.stamp || obj/foo/bundle_data_dep.stamp "
- "obj/foo/datadep.stamp\n"
+ "phony/foo/bar.inputdeps || phony/foo/bundle_data_dep "
+ "phony/foo/datadep\n"
" source_name_part = input2\n"
"\n"
- "build obj/foo/bar.stamp: "
- "stamp input1.out input2.out\n";
+ "build phony/foo/bar: "
+ "phony input1.out input2.out\n";
std::string out_str = out.str();
#if defined(OS_WIN)
@@ -351,21 +351,21 @@
#endif
" description = ACTION //foo:bar()\n"
" restat = 1\n"
- "build obj/foo/bar.inputdeps.stamp: stamp ../../foo/script.py "
+ "build phony/foo/bar.inputdeps: phony ../../foo/script.py "
"../../foo/included.txt\n"
"\n"
"build input1.out: __foo_bar___rule ../../foo/input1.txt"
- " | obj/foo/bar.inputdeps.stamp\n"
+ " | phony/foo/bar.inputdeps\n"
" source_name_part = input1\n"
" depfile = gen/input1.d\n"
" deps = gcc\n"
"build input2.out: __foo_bar___rule ../../foo/input2.txt"
- " | obj/foo/bar.inputdeps.stamp\n"
+ " | phony/foo/bar.inputdeps\n"
" source_name_part = input2\n"
" depfile = gen/input2.d\n"
" deps = gcc\n"
"\n"
- "build obj/foo/bar.stamp: stamp input1.out input2.out\n";
+ "build phony/foo/bar: phony input1.out input2.out\n";
EXPECT_EQ(expected_linux, out.str());
}
@@ -419,7 +419,7 @@
// Substitution for the rspfile contents.
" source_name_part = input1\n"
"\n"
- "build obj/foo/bar.stamp: stamp input1.out\n";
+ "build phony/foo/bar: phony input1.out\n";
EXPECT_EQ(expected_linux, out.str());
}
@@ -470,7 +470,7 @@
" source_file_part = input1.txt\n"
" pool = foo_pool\n"
"\n"
- "build obj/foo/bar.stamp: stamp input1.out\n";
+ "build phony/foo/bar: phony input1.out\n";
EXPECT_EQ(expected_linux, out.str());
}
@@ -511,9 +511,9 @@
" restat = 1\n"
"\n"
"build foo.out: __foo_foo___rule | ../../foo/script.py"
- " ../../foo/input1.txt obj/foo/dep.stamp\n"
+ " ../../foo/input1.txt phony/foo/dep\n"
"\n"
- "build obj/foo/foo.stamp: stamp foo.out\n";
+ "build phony/foo/foo: phony foo.out\n";
EXPECT_EQ(expected_linux, out.str());
}
@@ -541,9 +541,9 @@
"\n"
// Do not have obj/foo/dep.stamp as dependency.
"build bar.out: __bar_bar___rule | ../../bar/script.py"
- " ../../bar/input1.txt obj/foo/foo.stamp\n"
+ " ../../bar/input1.txt phony/foo/foo\n"
"\n"
- "build obj/bar/bar.stamp: stamp bar.out\n";
+ "build phony/bar/bar: phony bar.out\n";
EXPECT_EQ(expected_linux, out.str());
}
}
@@ -602,7 +602,7 @@
" include_dirs = -I../../my_inc_dir\n"
" cflags = -isysroot=baz\n"
"\n"
- "build obj/foo/foo.stamp: stamp foo.out\n";
+ "build phony/foo/foo: phony foo.out\n";
std::string out_str = out.str();
EXPECT_EQ(expected, out_str) << expected << "\n" << out_str;
}
@@ -649,7 +649,7 @@
build foo.out: __foo_bar___rule | ../../foo/my$ script.py ../../foo/input$ file.txt
-build obj/foo/bar.stamp: stamp foo.out
+build phony/foo/bar: phony foo.out
)";
EXPECT_EQ(expected, out.str()) << expected << "--" << out.str();
}
diff --git a/src/gn/ninja_binary_target_writer_unittest.cc b/src/gn/ninja_binary_target_writer_unittest.cc
index f390e88..29dfd33 100644
--- a/src/gn/ninja_binary_target_writer_unittest.cc
+++ b/src/gn/ninja_binary_target_writer_unittest.cc
@@ -49,7 +49,7 @@
" source_file_part = input2.cc\n"
" source_name_part = input2\n"
"\n"
- "build obj/foo/bar.stamp: stamp obj/foo/bar.input1.o "
+ "build phony/foo/bar: phony 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);
@@ -77,10 +77,9 @@
"target_out_dir = obj/foo\n"
"target_output_name = bar\n"
"\n"
- "\n"
- "build obj/foo/bar.stamp: stamp\n";
+ "\n";
std::string out_str = out.str();
- EXPECT_EQ(expected, out_str);
+ EXPECT_EQ(expected, out_str) << expected << "\n" << out_str;
}
TEST_F(NinjaBinaryTargetWriterTest, NoSourcesStaticLib) {
@@ -148,7 +147,7 @@
" source_file_part = source1.cc\n"
" source_name_part = source1\n"
"\n"
- "build obj/foo/bar.stamp: stamp obj/foo/bar.source1.o\n";
+ "build phony/foo/bar: phony obj/foo/bar.source1.o\n";
std::string out_str = out.str();
EXPECT_EQ(expected, out_str) << expected << "\n" << out_str;
}
@@ -179,18 +178,18 @@
"target_out_dir = obj/foo\n"
"target_output_name = bar\n"
"\n"
- "build obj/foo/bar.inputs.stamp: stamp "
+ "build phony/foo/bar.inputs: phony "
"../../foo/input1 ../../foo/input2\n"
"build obj/foo/bar.source1.o: cxx ../../foo/source1.cc | "
- "obj/foo/bar.inputs.stamp\n"
+ "phony/foo/bar.inputs\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"
+ "phony/foo/bar.inputs\n"
" source_file_part = source2.cc\n"
" source_name_part = source2\n"
"\n"
- "build obj/foo/bar.stamp: stamp obj/foo/bar.source1.o "
+ "build phony/foo/bar: phony 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;
diff --git a/src/gn/ninja_build_writer_unittest.cc b/src/gn/ninja_build_writer_unittest.cc
index f46cd5f..493ba40 100644
--- a/src/gn/ninja_build_writer_unittest.cc
+++ b/src/gn/ninja_build_writer_unittest.cc
@@ -158,16 +158,16 @@
" depth = 42\n";
const char expected_toolchain[] = "subninja toolchain.ninja\n";
const char expected_targets[] =
- "build bar: phony obj/bar/bar.stamp\n"
- "build baz: phony obj/baz/baz.stamp\n"
- "build foo$:bar: phony obj/foo/bar.stamp\n"
- "build bar$:bar: phony obj/bar/bar.stamp\n"
- "build baz$:baz: phony obj/baz/baz.stamp\n";
+ "build bar: phony phony/bar/bar\n"
+ "build baz: phony phony/baz/baz\n"
+ "build foo$:bar: phony phony/foo/bar\n"
+ "build bar$:bar: phony phony/bar/bar\n"
+ "build baz$:baz: phony phony/baz/baz\n";
const char expected_root_target[] =
"build all: phony $\n"
- " obj/foo/bar.stamp $\n"
- " obj/bar/bar.stamp $\n"
- " obj/baz/baz.stamp\n";
+ " phony/foo/bar $\n"
+ " phony/bar/bar $\n"
+ " phony/baz/baz\n";
const char expected_default[] = "default all\n";
std::string out_str = ninja_out.str();
#define EXPECT_SNIPPET(expected) \
diff --git a/src/gn/ninja_bundle_data_target_writer_unittest.cc b/src/gn/ninja_bundle_data_target_writer_unittest.cc
index 6fa4fe1..9f90245 100644
--- a/src/gn/ninja_bundle_data_target_writer_unittest.cc
+++ b/src/gn/ninja_bundle_data_target_writer_unittest.cc
@@ -46,7 +46,7 @@
writer.Run();
const char expected[] =
- "build obj/foo/data.stamp: stamp "
+ "build phony/foo/data: phony "
"../../foo/input1.txt "
"../../foo/input2.txt "
"../../foo/Foo.xcassets/Contents.json "
diff --git a/src/gn/ninja_c_binary_target_writer_unittest.cc b/src/gn/ninja_c_binary_target_writer_unittest.cc
index 0316eb3..8d2a388 100644
--- a/src/gn/ninja_c_binary_target_writer_unittest.cc
+++ b/src/gn/ninja_c_binary_target_writer_unittest.cc
@@ -61,7 +61,7 @@
" source_file_part = input2.cc\n"
" source_name_part = input2\n"
"\n"
- "build obj/foo/bar.stamp: stamp obj/foo/bar.input1.o "
+ "build phony/foo/bar: phony 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) << expected << "\n" << out_str;
@@ -93,7 +93,7 @@
// order.
"build ./libshlib.so: solink obj/foo/bar.input1.o "
"obj/foo/bar.input2.o ../../foo/input3.o ../../foo/input4.obj "
- "|| obj/foo/bar.stamp\n"
+ "|| phony/foo/bar\n"
" ldflags =\n"
" libs =\n"
" frameworks =\n"
@@ -127,7 +127,7 @@
"\n"
// There are no sources so there are no params to alink. (In practice
// this will probably fail in the archive tool.)
- "build obj/foo/libstlib.a: alink || obj/foo/bar.stamp\n"
+ "build obj/foo/libstlib.a: alink || phony/foo/bar\n"
" arflags =\n"
" output_extension =\n"
" output_dir =\n";
@@ -156,7 +156,7 @@
// order.
"build obj/foo/libstlib.a: alink obj/foo/bar.input1.o "
"obj/foo/bar.input2.o ../../foo/input3.o ../../foo/input4.obj "
- "|| obj/foo/bar.stamp\n"
+ "|| phony/foo/bar\n"
" arflags =\n"
" output_extension =\n"
" output_dir =\n";
@@ -348,11 +348,11 @@
"target_output_name = libshlib\n"
"\n"
"build obj/foo/libshlib.input1.o: cxx ../../foo/input1.cc"
- " || obj/foo/action.stamp\n"
+ " || phony/foo/action\n"
" source_file_part = input1.cc\n"
" source_name_part = input1\n"
"build obj/foo/libshlib.input2.o: cxx ../../foo/input2.cc"
- " || obj/foo/action.stamp\n"
+ " || phony/foo/action\n"
" source_file_part = input2.cc\n"
" source_name_part = input2\n"
"\n"
@@ -360,7 +360,7 @@
// The order-only dependency here is stricly unnecessary since the
// sources list this as an order-only dep. See discussion in the code
// that writes this.
- "obj/foo/libshlib.input2.o || obj/foo/action.stamp\n"
+ "obj/foo/libshlib.input2.o || phony/foo/action\n"
" ldflags =\n"
" libs =\n"
" frameworks =\n"
@@ -416,14 +416,14 @@
"target_output_name = gen_obj\n"
"\n"
"build obj/BUILD_DIR/gen_obj.generated.o: cxx generated.cc"
- " || obj/foo/generate.stamp\n"
+ " || phony/foo/generate\n"
" source_file_part = generated.cc\n"
" source_name_part = generated\n"
"\n"
- "build obj/foo/gen_obj.stamp: stamp obj/BUILD_DIR/gen_obj.generated.o"
+ "build phony/foo/gen_obj: phony obj/BUILD_DIR/gen_obj.generated.o"
// The order-only dependency here is strictly unnecessary since the
// sources list this as an order-only dep.
- " || obj/foo/generate.stamp\n";
+ " || phony/foo/generate\n";
std::string obj_str = obj_out.str();
EXPECT_EQ(std::string(obj_expected), obj_str);
@@ -457,7 +457,7 @@
// The order-only dependency here is strictly unnecessary since
// obj/out/Debug/gen_obj.generated.o has dependency to
// obj/foo/gen_obj.stamp
- " || obj/foo/gen_obj.stamp\n"
+ " || phony/foo/gen_obj\n"
" ldflags =\n"
" libs =\n"
" frameworks =\n"
@@ -563,6 +563,13 @@
Err err;
TestWithScope setup;
+ // An action for our library to depend on.
+ Target action(setup.settings(), Label(SourceDir("//foo/"), "action"));
+ action.set_output_type(Target::ACTION_FOREACH);
+ action.visibility().SetPublic();
+ action.SetToolchain(setup.toolchain());
+ ASSERT_TRUE(action.OnResolved(&err));
+
// A config that force linking with the framework.
Config framework_config(setup.settings(),
Label(SourceDir("//bar"), "framework_config"));
@@ -577,6 +584,7 @@
framework.set_output_type(Target::CREATE_BUNDLE);
framework.bundle_data().product_type() = "com.apple.product-type.framework";
framework.public_configs().push_back(LabelConfigPair(&framework_config));
+ framework.private_deps().push_back(LabelTargetPair(&action));
framework.SetToolchain(setup.toolchain());
framework.visibility().SetPublic();
ASSERT_TRUE(framework.OnResolved(&err));
@@ -603,7 +611,7 @@
"target_output_name = libshlib\n"
"\n"
"\n"
- "build ./libshlib.so: solink | obj/bar/framework.stamp\n"
+ "build ./libshlib.so: solink | phony/bar/framework\n"
" ldflags = -F.\n"
" libs =\n"
" frameworks = -framework System -framework Bar "
@@ -711,7 +719,7 @@
" source_file_part = inter.cc\n"
" source_name_part = inter\n"
"\n"
- "build obj/foo/inter.stamp: stamp obj/foo/inter.inter.o || "
+ "build phony/foo/inter: phony obj/foo/inter.inter.o || "
"./data_target\n";
EXPECT_EQ(inter_expected, inter_out.str());
@@ -748,7 +756,7 @@
" source_name_part = final\n"
"\n"
"build ./exe: link obj/foo/exe.final.o obj/foo/inter.inter.o || "
- "obj/foo/inter.stamp\n"
+ "phony/foo/inter\n"
" ldflags =\n"
" libs =\n"
" frameworks =\n"
@@ -950,8 +958,8 @@
" source_file_part = input2.c\n"
" source_name_part = input2\n"
"\n"
- "build withpch/obj/foo/no_pch_target.stamp: "
- "withpch_stamp withpch/obj/foo/no_pch_target.input1.o "
+ "build withpch/phony/foo/no_pch_target: "
+ "phony withpch/obj/foo/no_pch_target.input1.o "
"withpch/obj/foo/no_pch_target.input2.o\n";
EXPECT_EQ(no_pch_expected, out.str());
}
@@ -1012,7 +1020,7 @@
" source_file_part = input2.c\n"
" source_name_part = input2\n"
"\n"
- "build withpch/obj/foo/pch_target.stamp: withpch_stamp "
+ "build withpch/phony/foo/pch_target: phony "
"withpch/obj/foo/pch_target.input1.o "
"withpch/obj/foo/pch_target.input2.o "
// The precompiled object files were added to the outputs.
@@ -1096,8 +1104,8 @@
" source_file_part = input2.c\n"
" source_name_part = input2\n"
"\n"
- "build withpch/obj/foo/no_pch_target.stamp: "
- "withpch_stamp withpch/obj/foo/no_pch_target.input1.o "
+ "build withpch/phony/foo/no_pch_target: "
+ "phony withpch/obj/foo/no_pch_target.input1.o "
"withpch/obj/foo/no_pch_target.input2.o\n";
EXPECT_EQ(no_pch_expected, out.str());
}
@@ -1156,10 +1164,11 @@
" source_file_part = input2.c\n"
" source_name_part = input2\n"
"\n"
- "build withpch/obj/foo/pch_target.stamp: "
- "withpch_stamp withpch/obj/foo/pch_target.input1.o "
+ "build withpch/phony/foo/pch_target: "
+ "phony withpch/obj/foo/pch_target.input1.o "
"withpch/obj/foo/pch_target.input2.o\n";
- EXPECT_EQ(pch_gcc_expected, out.str());
+ EXPECT_EQ(pch_gcc_expected, out.str()) << pch_gcc_expected << "\n"
+ << out.str();
}
}
@@ -1227,7 +1236,7 @@
" source_file_part = input2.cc\n"
" source_name_part = input2\n"
"\n"
- "build obj/foo/bar.stamp: stamp obj/foo/bar.input1.o "
+ "build phony/foo/bar: phony obj/foo/bar.input1.o "
"obj/foo/bar.input2.o\n";
EXPECT_EQ(expected, out.str());
@@ -1293,18 +1302,18 @@
"target_out_dir = obj/foo\n"
"target_output_name = bar\n"
"\n"
- "build obj/foo/bar.inputs.stamp: stamp"
+ "build phony/foo/bar.inputs: phony"
" ../../foo/input1.data ../../foo/input2.data\n"
"build obj/foo/bar.input1.o: cxx ../../foo/input1.cc"
- " | obj/foo/bar.inputs.stamp\n"
+ " | phony/foo/bar.inputs\n"
" source_file_part = input1.cc\n"
" source_name_part = input1\n"
"build obj/foo/bar.input2.o: cxx ../../foo/input2.cc"
- " | obj/foo/bar.inputs.stamp\n"
+ " | phony/foo/bar.inputs\n"
" source_file_part = input2.cc\n"
" source_name_part = input2\n"
"\n"
- "build obj/foo/bar.stamp: stamp obj/foo/bar.input1.o "
+ "build phony/foo/bar: phony obj/foo/bar.input1.o "
"obj/foo/bar.input2.o\n";
EXPECT_EQ(expected, out.str());
@@ -1348,18 +1357,18 @@
"target_out_dir = obj/foo\n"
"target_output_name = bar\n"
"\n"
- "build obj/foo/bar.inputs.stamp: stamp"
+ "build phony/foo/bar.inputs: phony"
" ../../foo/input1.data ../../foo/input2.data ../../foo/input3.data\n"
"build obj/foo/bar.input1.o: cxx ../../foo/input1.cc"
- " | obj/foo/bar.inputs.stamp\n"
+ " | phony/foo/bar.inputs\n"
" source_file_part = input1.cc\n"
" source_name_part = input1\n"
"build obj/foo/bar.input2.o: cxx ../../foo/input2.cc"
- " | obj/foo/bar.inputs.stamp\n"
+ " | phony/foo/bar.inputs\n"
" source_file_part = input2.cc\n"
" source_name_part = input2\n"
"\n"
- "build obj/foo/bar.stamp: stamp obj/foo/bar.input1.o "
+ "build phony/foo/bar: phony obj/foo/bar.input1.o "
"obj/foo/bar.input2.o\n";
EXPECT_EQ(expected, out.str());
@@ -1593,8 +1602,8 @@
"obj/dylib/libdylib.so | "
"obj/pub_in_staticlib/libpub_in_staticlib.rlib "
"obj/priv_in_staticlib/libpriv_in_staticlib.rlib || "
- "obj/pub_sset_in_staticlib/pub_sset_in_staticlib.stamp "
- "obj/priv_sset_in_staticlib/priv_sset_in_staticlib.stamp\n"
+ "phony/pub_sset_in_staticlib/pub_sset_in_staticlib "
+ "phony/priv_sset_in_staticlib/priv_sset_in_staticlib\n"
" ldflags =\n"
" libs =\n"
" frameworks =\n"
@@ -2335,7 +2344,7 @@
"obj/foo/file2.o: swift ../../foo/file1.swift ../../foo/file2.swift\n"
" restat = 1\n"
"\n"
- "build obj/foo/foo.stamp: stamp"
+ "build phony/foo/foo: phony"
" gen/foo/foo.h obj/foo/Foo.swiftmodule"
" obj/foo/file1.o obj/foo/file2.o\n";
@@ -2370,12 +2379,12 @@
"target_output_name = bar\n"
"\n"
"build gen/bar/bar.h obj/bar/Bar.swiftmodule obj/bar/bar.o: swift "
- "../../bar/bar.swift || obj/foo/foo.stamp\n"
+ "../../bar/bar.swift || phony/foo/foo\n"
" restat = 1\n"
"\n"
- "build obj/bar/bar.stamp: stamp"
+ "build phony/bar/bar: phony"
" gen/bar/bar.h obj/bar/Bar.swiftmodule obj/bar/bar.o "
- "|| obj/foo/foo.stamp\n";
+ "|| phony/foo/foo\n";
const std::string out_str = out.str();
EXPECT_EQ(expected, out_str) << expected << "\n" << out_str;
@@ -2416,12 +2425,12 @@
"target_output_name = bar\n"
"\n"
"build gen/bar/bar.h obj/bar/Bar.swiftmodule obj/bar/bar.o: swift "
- "../../bar/bar.swift || obj/bar/group.stamp obj/foo/foo.stamp\n"
+ "../../bar/bar.swift || phony/bar/group phony/foo/foo\n"
" restat = 1\n"
"\n"
- "build obj/bar/bar.stamp: stamp"
+ "build phony/bar/bar: phony"
" gen/bar/bar.h obj/bar/Bar.swiftmodule obj/bar/bar.o "
- "|| obj/bar/group.stamp obj/foo/foo.stamp\n";
+ "|| phony/bar/group phony/foo/foo\n";
const std::string out_str = out.str();
EXPECT_EQ(expected, out_str) << expected << "\n" << out_str;
@@ -2451,7 +2460,7 @@
"\n"
"build ./bar: link obj/foo/file1.o obj/foo/file2.o "
"| obj/foo/Foo.swiftmodule "
- "|| obj/foo/foo.stamp\n"
+ "|| phony/foo/foo\n"
" ldflags =\n"
" libs =\n"
" frameworks =\n"
diff --git a/src/gn/ninja_copy_target_writer_unittest.cc b/src/gn/ninja_copy_target_writer_unittest.cc
index f641ffa..1b5077a 100644
--- a/src/gn/ninja_copy_target_writer_unittest.cc
+++ b/src/gn/ninja_copy_target_writer_unittest.cc
@@ -35,7 +35,7 @@
"build input1.out: copy ../../foo/input1.txt\n"
"build input2.out: copy ../../foo/input2.txt\n"
"\n"
- "build obj/foo/bar.stamp: stamp input1.out input2.out\n";
+ "build phony/foo/bar: phony input1.out input2.out\n";
std::string out_str = out.str();
EXPECT_EQ(expected_linux, out_str);
}
@@ -63,7 +63,7 @@
const char expected_linux[] =
"build output.out: copy ../../foo/input1.txt\n"
"\n"
- "build obj/foo/bar.stamp: stamp output.out\n";
+ "build phony/foo/bar: phony output.out\n";
std::string out_str = out.str();
EXPECT_EQ(expected_linux, out_str);
}
@@ -88,7 +88,7 @@
const char expected_linux[] =
"build input1.out: copy ../../foo/input1.txt || ../../foo/script.py\n"
"\n"
- "build obj/foo/bar.stamp: stamp input1.out\n";
+ "build phony/foo/bar: phony input1.out\n";
std::string out_str = out.str();
EXPECT_EQ(expected_linux, out_str);
}
@@ -118,9 +118,9 @@
writer.Run();
const char expected_linux[] =
- "build input1.out: copy ../../foo/input1.txt || obj/foo/datadep.stamp\n"
+ "build input1.out: copy ../../foo/input1.txt || phony/foo/datadep\n"
"\n"
- "build obj/foo/bar.stamp: stamp input1.out\n";
+ "build phony/foo/bar: phony input1.out\n";
std::string out_str = out.str();
EXPECT_EQ(expected_linux, out_str);
}
diff --git a/src/gn/ninja_create_bundle_target_writer_unittest.cc b/src/gn/ninja_create_bundle_target_writer_unittest.cc
index 8540671..d79b719 100644
--- a/src/gn/ninja_create_bundle_target_writer_unittest.cc
+++ b/src/gn/ninja_create_bundle_target_writer_unittest.cc
@@ -75,17 +75,17 @@
writer.Run();
const char expected[] =
- "build obj/baz/bar.inputdeps.stamp: stamp obj/foo/bar.stamp "
- "obj/foo/data.stamp\n"
+ "build phony/baz/bar.inputdeps: phony phony/foo/bar "
+ "phony/foo/data\n"
"build bar.bundle/Contents/Resources/input1.txt: copy_bundle_data "
- "../../foo/input1.txt || obj/baz/bar.inputdeps.stamp\n"
+ "../../foo/input1.txt || phony/baz/bar.inputdeps\n"
"build bar.bundle/Contents/Resources/input2.txt: copy_bundle_data "
- "../../foo/input2.txt || obj/baz/bar.inputdeps.stamp\n"
- "build obj/baz/bar.stamp: stamp "
+ "../../foo/input2.txt || phony/baz/bar.inputdeps\n"
+ "build phony/baz/bar: phony "
"bar.bundle/Contents/Resources/input1.txt "
"bar.bundle/Contents/Resources/input2.txt"
- " || obj/baz/bar.inputdeps.stamp\n"
- "build bar.bundle: phony obj/baz/bar.stamp\n";
+ " || phony/baz/bar.inputdeps\n"
+ "build bar.bundle: phony phony/baz/bar\n";
std::string out_str = out.str();
EXPECT_EQ(expected, out_str);
}
@@ -124,17 +124,17 @@
writer.Run();
const char expected[] =
- "build obj/baz/bar.inputdeps.stamp: stamp obj/foo/bar.stamp "
- "obj/foo/data.stamp\n"
+ "build phony/baz/bar.inputdeps: phony phony/foo/bar "
+ "phony/foo/data\n"
"build gen/bar.bundle/Contents/Resources/input1.txt: copy_bundle_data "
- "../../foo/input1.txt || obj/baz/bar.inputdeps.stamp\n"
+ "../../foo/input1.txt || phony/baz/bar.inputdeps\n"
"build gen/bar.bundle/Contents/Resources/input2.txt: copy_bundle_data "
- "../../foo/input2.txt || obj/baz/bar.inputdeps.stamp\n"
- "build obj/baz/bar.stamp: stamp "
+ "../../foo/input2.txt || phony/baz/bar.inputdeps\n"
+ "build phony/baz/bar: phony "
"gen/bar.bundle/Contents/Resources/input1.txt "
"gen/bar.bundle/Contents/Resources/input2.txt || "
- "obj/baz/bar.inputdeps.stamp\n"
- "build gen/bar.bundle: phony obj/baz/bar.stamp\n";
+ "phony/baz/bar.inputdeps\n"
+ "build gen/bar.bundle: phony phony/baz/bar\n";
std::string out_str = out.str();
EXPECT_EQ(expected, out_str);
}
@@ -165,12 +165,12 @@
writer.Run();
const char expected[] =
- "build baz/bar/bar_partial_info.plist: stamp || obj/foo/bar.stamp\n"
- "build obj/baz/bar.stamp: stamp "
- "baz/bar/bar_partial_info.plist || obj/foo/bar.stamp\n"
- "build bar.bundle: phony obj/baz/bar.stamp\n";
+ "build baz/bar/bar_partial_info.plist: stamp || phony/foo/bar\n"
+ "build phony/baz/bar: phony "
+ "baz/bar/bar_partial_info.plist || phony/foo/bar\n"
+ "build bar.bundle: phony phony/baz/bar\n";
std::string out_str = out.str();
- EXPECT_EQ(expected, out_str);
+ EXPECT_EQ(expected, out_str) << expected << "\n" << out_str;
}
// Tests multiple files from asset catalog.
@@ -229,17 +229,17 @@
writer.Run();
const char expected[] =
- "build obj/baz/bar.inputdeps.stamp: stamp obj/foo/bar.stamp "
- "obj/foo/data.stamp\n"
+ "build phony/baz/bar.inputdeps: phony phony/foo/bar "
+ "phony/foo/data\n"
"build bar.bundle/Contents/Resources/Assets.car: compile_xcassets "
- "../../foo/Foo.xcassets | obj/foo/data.stamp || "
- "obj/baz/bar.inputdeps.stamp\n"
+ "../../foo/Foo.xcassets | phony/foo/data || "
+ "phony/baz/bar.inputdeps\n"
" product_type = com.apple.product-type\n"
" xcasset_compiler_flags = --app-icon foo\n"
- "build obj/baz/bar.stamp: stamp "
+ "build phony/baz/bar: phony "
"bar.bundle/Contents/Resources/Assets.car || "
- "obj/baz/bar.inputdeps.stamp\n"
- "build bar.bundle: phony obj/baz/bar.stamp\n";
+ "phony/baz/bar.inputdeps\n"
+ "build bar.bundle: phony phony/baz/bar\n";
std::string out_str = out.str();
EXPECT_EQ(expected, out_str);
}
@@ -250,13 +250,22 @@
Err err;
TestWithScope setup;
+ // An action for our library to depend on.
+ Target action(setup.settings(), Label(SourceDir("//foo/"), "action"));
+ action.set_output_type(Target::ACTION_FOREACH);
+ action.visibility().SetPublic();
+ action.SetToolchain(setup.toolchain());
+ ASSERT_TRUE(action.OnResolved(&err));
+
Target create_bundle(
setup.settings(),
Label(SourceDir("//baz/"), "bar", setup.toolchain()->label().dir(),
setup.toolchain()->label().name()));
SetupBundleDataDir(&create_bundle.bundle_data(), "//out/Debug");
create_bundle.set_output_type(Target::CREATE_BUNDLE);
+ create_bundle.private_deps().push_back(LabelTargetPair(&action));
create_bundle.SetToolchain(setup.toolchain());
+
ASSERT_TRUE(create_bundle.OnResolved(&err));
std::ostringstream out;
@@ -264,10 +273,10 @@
writer.Run();
const char expected[] =
- "build obj/baz/bar.stamp: stamp\n"
- "build bar.bundle: phony obj/baz/bar.stamp\n";
+ "build phony/baz/bar: phony || phony/foo/action\n"
+ "build bar.bundle: phony phony/baz/bar\n";
std::string out_str = out.str();
- EXPECT_EQ(expected, out_str);
+ EXPECT_EQ(expected, out_str) << expected << "\n" << out_str;
}
// Tests complex target with multiple bundle_data sources, including
@@ -384,34 +393,34 @@
writer.Run();
const char expected[] =
- "build obj/baz/bar.inputdeps.stamp: stamp obj/biz/assets.stamp "
- "obj/foo/assets.stamp obj/foo/bar.stamp obj/foo/data.stamp "
- "obj/qux/info_plist.stamp obj/quz/assets.stamp\n"
+ "build phony/baz/bar.inputdeps: phony phony/biz/assets "
+ "phony/foo/assets phony/foo/bar phony/foo/data "
+ "phony/qux/info_plist phony/quz/assets\n"
"build bar.bundle/Contents/Info.plist: copy_bundle_data "
- "../../qux/qux-Info.plist || obj/baz/bar.inputdeps.stamp\n"
+ "../../qux/qux-Info.plist || phony/baz/bar.inputdeps\n"
"build bar.bundle/Contents/Resources/input1.txt: copy_bundle_data "
- "../../foo/input1.txt || obj/baz/bar.inputdeps.stamp\n"
+ "../../foo/input1.txt || phony/baz/bar.inputdeps\n"
"build bar.bundle/Contents/Resources/input2.txt: copy_bundle_data "
- "../../foo/input2.txt || obj/baz/bar.inputdeps.stamp\n"
- "build obj/baz/bar.xcassets.inputdeps.stamp: stamp "
- "obj/foo/assets.stamp "
- "obj/quz/assets.stamp obj/biz/assets.stamp\n"
+ "../../foo/input2.txt || phony/baz/bar.inputdeps\n"
+ "build phony/baz/bar.xcassets.inputdeps: phony "
+ "phony/foo/assets "
+ "phony/quz/assets phony/biz/assets\n"
"build bar.bundle/Contents/Resources/Assets.car | "
"baz/bar/bar_partial_info.plist: compile_xcassets "
"../../foo/Foo.xcassets ../../quz/Quz.xcassets "
- "../../biz/Biz.xcassets | obj/baz/bar.xcassets.inputdeps.stamp || "
- "obj/baz/bar.inputdeps.stamp\n"
+ "../../biz/Biz.xcassets | phony/baz/bar.xcassets.inputdeps || "
+ "phony/baz/bar.inputdeps\n"
" product_type = com.apple.product-type\n"
" partial_info_plist = baz/bar/bar_partial_info.plist\n"
- "build obj/baz/bar.stamp: stamp "
+ "build phony/baz/bar: phony "
"bar.bundle/Contents/Info.plist "
"bar.bundle/Contents/Resources/input1.txt "
"bar.bundle/Contents/Resources/input2.txt "
"bar.bundle/Contents/Resources/Assets.car "
- "baz/bar/bar_partial_info.plist || obj/baz/bar.inputdeps.stamp\n"
- "build bar.bundle: phony obj/baz/bar.stamp\n";
+ "baz/bar/bar_partial_info.plist || phony/baz/bar.inputdeps\n"
+ "build bar.bundle: phony phony/baz/bar\n";
std::string out_str = out.str();
- EXPECT_EQ(expected, out_str);
+ EXPECT_EQ(expected, out_str) << expected << "\n" << out_str;
}
// Tests post-processing step.
@@ -466,32 +475,32 @@
writer.Run();
const char expected[] =
- "build obj/baz/bar.inputdeps.stamp: stamp ./quz obj/foo/bar.stamp "
- "obj/foo/data.stamp\n"
+ "build phony/baz/bar.inputdeps: phony ./quz phony/foo/bar "
+ "phony/foo/data\n"
"rule __baz_bar___toolchain_default__post_processing_rule\n"
" command = ../../build/codesign.py -b=quz bar.bundle\n"
" description = POST PROCESSING //baz:bar(//toolchain:default)\n"
" restat = 1\n"
"\n"
"build bar.bundle/Contents/Resources/input1.txt: copy_bundle_data "
- "../../foo/input1.txt || obj/baz/bar.inputdeps.stamp\n"
+ "../../foo/input1.txt || phony/baz/bar.inputdeps\n"
"build bar.bundle/Contents/Resources/input2.txt: copy_bundle_data "
- "../../foo/input2.txt || obj/baz/bar.inputdeps.stamp\n"
- "build obj/baz/bar.postprocessing.inputdeps.stamp: stamp "
+ "../../foo/input2.txt || phony/baz/bar.inputdeps\n"
+ "build phony/baz/bar.postprocessing.inputdeps: phony "
"../../build/codesign.py "
"quz "
"bar.bundle/Contents/Resources/input1.txt "
"bar.bundle/Contents/Resources/input2.txt || "
- "obj/baz/bar.inputdeps.stamp\n"
+ "phony/baz/bar.inputdeps\n"
"build bar.bundle/Contents/quz bar.bundle/_CodeSignature/CodeResources: "
"__baz_bar___toolchain_default__post_processing_rule "
- "| obj/baz/bar.postprocessing.inputdeps.stamp\n"
- "build obj/baz/bar.stamp: stamp "
+ "| phony/baz/bar.postprocessing.inputdeps\n"
+ "build phony/baz/bar: phony "
"bar.bundle/Contents/quz "
- "bar.bundle/_CodeSignature/CodeResources || obj/baz/bar.inputdeps.stamp\n"
- "build bar.bundle: phony obj/baz/bar.stamp\n";
+ "bar.bundle/_CodeSignature/CodeResources || phony/baz/bar.inputdeps\n"
+ "build bar.bundle: phony phony/baz/bar\n";
std::string out_str = out.str();
- EXPECT_EQ(expected, out_str);
+ EXPECT_EQ(expected, out_str) << out_str << "\n" << expected;
}
TEST(NinjaCreateBundleTargetWriter, PostProcessingNoStampFilesCustomToolchain) {
diff --git a/src/gn/ninja_generated_file_target_writer_unittest.cc b/src/gn/ninja_generated_file_target_writer_unittest.cc
index f883102..481db80 100644
--- a/src/gn/ninja_generated_file_target_writer_unittest.cc
+++ b/src/gn/ninja_generated_file_target_writer_unittest.cc
@@ -63,8 +63,8 @@
writer.Run();
const char expected[] =
- "build obj/foo/bar.stamp: stamp foo.json obj/foo/dep.stamp "
- "obj/foo/dep2.stamp || "
- "obj/foo/bundle_data_dep.stamp obj/foo/datadep.stamp\n";
+ "build phony/foo/bar: phony foo.json phony/foo/dep "
+ "phony/foo/dep2 || "
+ "phony/foo/bundle_data_dep phony/foo/datadep\n";
EXPECT_EQ(expected, out.str());
}
diff --git a/src/gn/ninja_group_target_writer_unittest.cc b/src/gn/ninja_group_target_writer_unittest.cc
index 1fe51ca..ec9f72d 100644
--- a/src/gn/ninja_group_target_writer_unittest.cc
+++ b/src/gn/ninja_group_target_writer_unittest.cc
@@ -54,7 +54,7 @@
writer.Run();
const char expected[] =
- "build obj/foo/bar.stamp: stamp obj/foo/dep.stamp obj/foo/dep2.stamp || "
- "obj/foo/bundle_data_dep.stamp obj/foo/datadep.stamp\n";
+ "build phony/foo/bar: phony phony/foo/dep phony/foo/dep2 || "
+ "phony/foo/bundle_data_dep phony/foo/datadep\n";
EXPECT_EQ(expected, out.str());
}
diff --git a/src/gn/ninja_outputs_writer_unittest.cc b/src/gn/ninja_outputs_writer_unittest.cc
index 52354c6..a5f8a67 100644
--- a/src/gn/ninja_outputs_writer_unittest.cc
+++ b/src/gn/ninja_outputs_writer_unittest.cc
@@ -36,8 +36,6 @@
std::string rule = NinjaTargetWriter::RunAndWriteFile(target, nullptr,
&target_ninja_outputs);
- DCHECK(!rule.empty());
-
std::lock_guard<std::mutex> lock(write_info->lock);
write_info->ninja_outputs_map.emplace(target,
std::move(target_ninja_outputs));
@@ -142,18 +140,16 @@
std::string expected = R"##({
"//:bar": [
"bar.output",
- "obj/bar.stamp"
+ "phony/bar"
],
"//:foo": [
- "obj/foo.stamp"
+ "phony/foo"
],
"//:zoo": [
- "obj/zoo.stamp"
],
"//:zoo(//toolchain:secondary)": [
- "secondary/obj/zoo.stamp"
]
})##";
- EXPECT_EQ(generated, expected);
+ EXPECT_EQ(generated, expected) << generated << "\n" << expected;
}
diff --git a/src/gn/ninja_rust_binary_target_writer_unittest.cc b/src/gn/ninja_rust_binary_target_writer_unittest.cc
index 65be062..461cbd8 100644
--- a/src/gn/ninja_rust_binary_target_writer_unittest.cc
+++ b/src/gn/ninja_rust_binary_target_writer_unittest.cc
@@ -5,6 +5,7 @@
#include "gn/ninja_rust_binary_target_writer.h"
#include "gn/config.h"
+#include "gn/label_ptr.h"
#include "gn/pool.h"
#include "gn/rust_values.h"
#include "gn/scheduler.h"
@@ -584,7 +585,7 @@
"\n"
"build obj/bar/libmylib.rlib: rust_rlib ../../bar/lib.rs | "
"../../bar/mylib.rs ../../bar/lib.rs obj/bar/libmymacro.so || "
- "obj/baz/group.stamp\n"
+ "phony/baz/group\n"
" source_file_part = lib.rs\n"
" source_name_part = lib\n"
" externs = --extern mymacro=obj/bar/libmymacro.so\n"
@@ -824,7 +825,7 @@
"../../foo/main.rs obj/baz/sourceset.csourceset.o "
"obj/bar/libmylib.rlib "
"obj/foo/libstatic.a ./libshared.so ./libshared_with_toc.so.TOC "
- "|| obj/baz/sourceset.stamp\n"
+ "|| phony/baz/sourceset\n"
" source_file_part = main.rs\n"
" source_name_part = main\n"
" externs = --extern mylib=obj/bar/libmylib.rlib\n"
@@ -1089,8 +1090,8 @@
"obj/pub_in_staticlib/libpub_in_staticlib.rlib "
"obj/priv_in_staticlib/libpriv_in_staticlib.rlib "
"obj/pub_in_dylib/libpub_in_dylib.rlib || "
- "obj/pub_sset_in_staticlib/pub_sset_in_staticlib.stamp "
- "obj/priv_sset_in_staticlib/priv_sset_in_staticlib.stamp\n"
+ "phony/pub_sset_in_staticlib/pub_sset_in_staticlib "
+ "phony/priv_sset_in_staticlib/priv_sset_in_staticlib\n"
" source_file_part = main.rs\n"
" source_name_part = main\n"
" externs = "
@@ -1541,7 +1542,7 @@
"\n"
"build ./foo_bar: rust_bin ../../foo/main.rs | "
"../../foo/source.rs ../../foo/main.rs obj/bar/libmylib.rlib || "
- "obj/baz/group.stamp\n"
+ "phony/baz/group\n"
" source_file_part = main.rs\n"
" source_name_part = main\n"
" externs = --extern mylib=obj/bar/libmylib.rlib\n"
@@ -1632,7 +1633,7 @@
writer.Run();
const char expected[] =
- "build obj/foo/bar.inputs.stamp: stamp ../../foo/config.json "
+ "build phony/foo/bar.inputs: phony ../../foo/config.json "
"../../foo/template.h\n"
"crate_name = foo_bar\n"
"crate_type = bin\n"
@@ -1647,7 +1648,7 @@
"\n"
"build ./foo_bar: rust_bin ../../foo/main.rs | ../../foo/source.rs "
"../../foo/main.rs ../../foo/config.json ../../foo/template.h "
- "|| obj/foo/bar.inputs.stamp\n"
+ "|| phony/foo/bar.inputs\n"
" source_file_part = main.rs\n"
" source_name_part = main\n"
" externs =\n"
@@ -1895,7 +1896,7 @@
"\n"
"build ./exe: rust_bin ../../linked/exe.rs | ../../linked/exe.rs "
"obj/sset/bar.input1.o obj/public/libbehind_sourceset_public.rlib "
- "obj/private/libbehind_sourceset_private.rlib || obj/sset/bar.stamp\n"
+ "obj/private/libbehind_sourceset_private.rlib || phony/sset/bar\n"
" source_file_part = exe.rs\n"
" source_name_part = exe\n"
" externs = --extern "
@@ -1964,6 +1965,13 @@
Err err;
TestWithScope setup;
+ // An action for our library to depend on.
+ Target action(setup.settings(), Label(SourceDir("//bar"), "action"));
+ action.set_output_type(Target::ACTION_FOREACH);
+ action.visibility().SetPublic();
+ action.SetToolchain(setup.toolchain());
+ ASSERT_TRUE(action.OnResolved(&err));
+
// A config that force linking with the framework.
Config framework_config(setup.settings(),
Label(SourceDir("//bar"), "framework_config"));
@@ -1978,6 +1986,7 @@
framework.set_output_type(Target::CREATE_BUNDLE);
framework.bundle_data().product_type() = "com.apple.product-type.framework";
framework.public_configs().push_back(LabelConfigPair(&framework_config));
+ framework.private_deps().push_back(LabelTargetPair(&action));
framework.SetToolchain(setup.toolchain());
framework.visibility().SetPublic();
ASSERT_TRUE(framework.OnResolved(&err));
@@ -2013,7 +2022,7 @@
"target_output_name = exe\n"
"\n"
"build ./exe: rust_bin ../../linked/exe.rs | ../../linked/exe.rs || "
- "obj/bar/framework.stamp obj/bar/framework.stamp\n"
+ "phony/bar/framework\n"
" source_file_part = exe.rs\n"
" source_name_part = exe\n"
" externs =\n"
@@ -2072,7 +2081,7 @@
"\n"
"build ./exe: rust_bin ../../linked/exe.rs | ../../linked/exe.rs "
"obj/foo/file1.o obj/foo/file2.o || "
- "obj/foo/foo.stamp obj/foo/Foo.swiftmodule obj/foo/foo.stamp\n"
+ "phony/foo/foo obj/foo/Foo.swiftmodule phony/foo/foo\n"
" source_file_part = exe.rs\n"
" source_name_part = exe\n"
" externs =\n"
diff --git a/src/gn/ninja_target_writer_unittest.cc b/src/gn/ninja_target_writer_unittest.cc
index 6b88674..ae691d7 100644
--- a/src/gn/ninja_target_writer_unittest.cc
+++ b/src/gn/ninja_target_writer_unittest.cc
@@ -133,6 +133,103 @@
// Since there is only one dependency, a stamp file will be returned
// directly without writing any additional rules.
ASSERT_EQ(1u, dep.size());
+ EXPECT_EQ("phony/foo/base", dep[0].value());
+ }
+
+ {
+ std::ostringstream stream;
+ NinjaActionTargetWriter writer(&action, stream);
+ writer.Run();
+ EXPECT_EQ(
+ "rule __foo_action___rule\n"
+ " command = ../../foo/script.py\n"
+ " description = ACTION //foo:action()\n"
+ " restat = 1\n"
+ "\n"
+ "build: __foo_action___rule | ../../foo/script.py"
+ " ../../foo/action_source.txt ./target\n"
+ "\n"
+ "build phony/foo/action: phony\n",
+ stream.str());
+ }
+
+ // Input deps for action which should depend on the base since its a hard dep
+ // that is a (indirect) dependency, as well as the the action source.
+ {
+ std::ostringstream stream;
+ TestingNinjaTargetWriter writer(&action, setup.toolchain(), stream);
+ std::vector<OutputFile> dep = writer.WriteInputDepsStampOrPhonyAndGetDep(
+ std::vector<const Target*>(), 10u);
+
+ ASSERT_EQ(1u, dep.size());
+ EXPECT_EQ("phony/foo/action.inputdeps", dep[0].value());
+ EXPECT_EQ(
+ "build phony/foo/action.inputdeps: phony ../../foo/script.py "
+ "../../foo/action_source.txt ./target\n",
+ stream.str());
+ }
+}
+
+TEST(NinjaTargetWriter, WriteInputDepsStampOrPhonyAndGetDepUseStampFiles) {
+ TestWithScope setup;
+ Err err;
+ setup.build_settings()->set_no_stamp_files(false);
+
+ // Make a base target that's a hard dep (action).
+ Target base_target(setup.settings(), Label(SourceDir("//foo/"), "base"));
+ base_target.set_output_type(Target::ACTION);
+ base_target.visibility().SetPublic();
+ base_target.SetToolchain(setup.toolchain());
+ base_target.action_values().set_script(SourceFile("//foo/script.py"));
+
+ // Dependent target that also includes a source prerequisite (should get
+ // included) and a source (should not be included).
+ Target target(setup.settings(), Label(SourceDir("//foo/"), "target"));
+ target.set_output_type(Target::EXECUTABLE);
+ target.visibility().SetPublic();
+ target.SetToolchain(setup.toolchain());
+ target.config_values().inputs().push_back(SourceFile("//foo/input.txt"));
+ target.sources().push_back(SourceFile("//foo/source.txt"));
+ target.public_deps().push_back(LabelTargetPair(&base_target));
+
+ // Dependent action to test that action sources will be treated the same as
+ // inputs.
+ Target action(setup.settings(), Label(SourceDir("//foo/"), "action"));
+ action.set_output_type(Target::ACTION);
+ action.visibility().SetPublic();
+ action.SetToolchain(setup.toolchain());
+ action.action_values().set_script(SourceFile("//foo/script.py"));
+ action.sources().push_back(SourceFile("//foo/action_source.txt"));
+ action.public_deps().push_back(LabelTargetPair(&target));
+
+ ASSERT_TRUE(base_target.OnResolved(&err));
+ ASSERT_TRUE(target.OnResolved(&err));
+ ASSERT_TRUE(action.OnResolved(&err));
+
+ // Input deps for the base (should be only the script itself).
+ {
+ std::ostringstream stream;
+ TestingNinjaTargetWriter writer(&base_target, setup.toolchain(), stream);
+ std::vector<OutputFile> dep = writer.WriteInputDepsStampOrPhonyAndGetDep(
+ std::vector<const Target*>(), 10u);
+
+ // Since there is only one dependency, it should just be returned and
+ // nothing written to the stream.
+ ASSERT_EQ(1u, dep.size());
+ EXPECT_EQ("../../foo/script.py", dep[0].value());
+ EXPECT_EQ("", stream.str());
+ }
+
+ // Input deps for the target (should depend on the base).
+ {
+ std::ostringstream stream;
+ TestingNinjaTargetWriter writer(&target, setup.toolchain(), stream);
+ std::vector<OutputFile> dep = writer.WriteInputDepsStampOrPhonyAndGetDep(
+ std::vector<const Target*>(), 10u);
+
+ // Since there is only one dependency, a stamp file will be returned
+ // directly without writing any additional rules.
+ ASSERT_EQ(1u, dep.size());
EXPECT_EQ("obj/foo/base.stamp", dep[0].value());
}
@@ -200,6 +297,6 @@
// Since there is more than one dependency, a stamp file will be returned
// and the rule for the stamp file will be written to the stream.
ASSERT_EQ(1u, dep.size());
- EXPECT_EQ("obj/foo/setup.stamp", dep[0].value());
+ EXPECT_EQ("phony/foo/setup", dep[0].value());
EXPECT_EQ("", stream.str());
}
diff --git a/src/gn/target_unittest.cc b/src/gn/target_unittest.cc
index cac3670..ebe40be 100644
--- a/src/gn/target_unittest.cc
+++ b/src/gn/target_unittest.cc
@@ -742,7 +742,7 @@
EXPECT_TRUE(target.GetOutputsAsSourceFiles(LocationRange(), true,
&computed_outputs, &err));
ASSERT_EQ(1u, computed_outputs.size());
- EXPECT_EQ("//out/Debug/obj/a/a.stamp", computed_outputs[0].value());
+ EXPECT_EQ("//out/Debug/phony/a/a", computed_outputs[0].value());
}
TEST_F(TargetTest, CheckStampFileName) {
@@ -770,9 +770,7 @@
std::vector<SourceFile> computed_outputs;
EXPECT_TRUE(target.GetOutputsAsSourceFiles(LocationRange(), true,
&computed_outputs, &err));
- ASSERT_EQ(1u, computed_outputs.size());
- EXPECT_EQ("//out/Debug/obj/a/a.stamp", computed_outputs[0].value())
- << "was instead: " << computed_outputs[0].value();
+ ASSERT_EQ(0u, computed_outputs.size()) << computed_outputs.size();
}
// Tests Target::GetOutputFilesForSource for action_foreach targets (these, like