16d528ed9Sopenharmony_cidiff --git a/src/gn/filesystem_utils.cc b/src/gn/filesystem_utils.cc 26d528ed9Sopenharmony_ciindex 58d8cca..5f61443 100644 36d528ed9Sopenharmony_ci--- a/src/gn/filesystem_utils.cc 46d528ed9Sopenharmony_ci+++ b/src/gn/filesystem_utils.cc 56d528ed9Sopenharmony_ci@@ -1069,25 +1069,10 @@ OutputFile GetSubBuildDirAsOutputFile(const BuildDirContext& context, 66d528ed9Sopenharmony_ci OutputFile result = GetBuildDirAsOutputFile(context, type); 76d528ed9Sopenharmony_ci 86d528ed9Sopenharmony_ci if (source_dir.is_source_absolute()) { 96d528ed9Sopenharmony_ci- std::string_view build_dir = context.build_settings->build_dir().value(); 106d528ed9Sopenharmony_ci- std::string_view source_dir_path = source_dir.value(); 116d528ed9Sopenharmony_ci- if (source_dir_path.substr(0, build_dir.size()) == build_dir) { 126d528ed9Sopenharmony_ci- // The source dir is source-absolute, but in the build directory 136d528ed9Sopenharmony_ci- // (e.g. `//out/Debug/gen/src/foo.cc` or 146d528ed9Sopenharmony_ci- // `//out/Debug/toolchain1/gen/foo.cc`), which happens for generated 156d528ed9Sopenharmony_ci- // sources. In this case, remove the build directory prefix, and replace 166d528ed9Sopenharmony_ci- // it with `BUILD_DIR`. This will create results like `obj/BUILD_DIR/gen` 176d528ed9Sopenharmony_ci- // or `toolchain2/obj/BUILD_DIR/toolchain1/gen` which look surprising, 186d528ed9Sopenharmony_ci- // but guarantee unicity. 196d528ed9Sopenharmony_ci- result.value().append("BUILD_DIR/"); 206d528ed9Sopenharmony_ci- result.value().append(&source_dir_path[build_dir.size()], 216d528ed9Sopenharmony_ci- source_dir_path.size() - build_dir.size()); 226d528ed9Sopenharmony_ci- } else { 236d528ed9Sopenharmony_ci- // The source dir is source-absolute, so we trim off the two leading 246d528ed9Sopenharmony_ci- // slashes to append to the toolchain object directory. 256d528ed9Sopenharmony_ci- result.value().append(&source_dir.value()[2], 266d528ed9Sopenharmony_ci- source_dir.value().size() - 2); 276d528ed9Sopenharmony_ci- } 286d528ed9Sopenharmony_ci+ // The source dir is source-absolute, so we trim off the two leading 296d528ed9Sopenharmony_ci+ // slashes to append to the toolchain object directory. 306d528ed9Sopenharmony_ci+ result.value().append(&source_dir.value()[2], 316d528ed9Sopenharmony_ci+ source_dir.value().size() - 2); 326d528ed9Sopenharmony_ci } else { 336d528ed9Sopenharmony_ci // System-absolute. 346d528ed9Sopenharmony_ci AppendFixedAbsolutePathSuffix(context.build_settings, source_dir, &result); 356d528ed9Sopenharmony_cidiff --git a/src/gn/ninja_c_binary_target_writer_unittest.cc b/src/gn/ninja_c_binary_target_writer_unittest.cc 366d528ed9Sopenharmony_ciindex 9476193..6056c36 100644 376d528ed9Sopenharmony_ci--- a/src/gn/ninja_c_binary_target_writer_unittest.cc 386d528ed9Sopenharmony_ci+++ b/src/gn/ninja_c_binary_target_writer_unittest.cc 396d528ed9Sopenharmony_ci@@ -405,18 +405,18 @@ TEST_F(NinjaCBinaryTargetWriterTest, NoHardDepsToNoPublicHeaderTarget) { 406d528ed9Sopenharmony_ci "target_out_dir = obj/foo\n" 416d528ed9Sopenharmony_ci "target_output_name = gen_obj\n" 426d528ed9Sopenharmony_ci "\n" 436d528ed9Sopenharmony_ci- "build obj/BUILD_DIR/gen_obj.generated.o: cxx generated.cc" 446d528ed9Sopenharmony_ci+ "build obj/out/Debug/gen_obj.generated.o: cxx generated.cc" 456d528ed9Sopenharmony_ci " || obj/foo/generate.stamp\n" 466d528ed9Sopenharmony_ci " source_file_part = generated.cc\n" 476d528ed9Sopenharmony_ci " source_name_part = generated\n" 486d528ed9Sopenharmony_ci "\n" 496d528ed9Sopenharmony_ci- "build obj/foo/gen_obj.stamp: stamp obj/BUILD_DIR/gen_obj.generated.o" 506d528ed9Sopenharmony_ci+ "build obj/foo/gen_obj.stamp: stamp obj/out/Debug/gen_obj.generated.o" 516d528ed9Sopenharmony_ci // The order-only dependency here is strictly unnecessary since the 526d528ed9Sopenharmony_ci // sources list this as an order-only dep. 536d528ed9Sopenharmony_ci " || obj/foo/generate.stamp\n"; 546d528ed9Sopenharmony_ci 556d528ed9Sopenharmony_ci std::string obj_str = obj_out.str(); 566d528ed9Sopenharmony_ci- EXPECT_EQ(std::string(obj_expected), obj_str); 576d528ed9Sopenharmony_ci+ EXPECT_EQ(obj_expected, obj_str); 586d528ed9Sopenharmony_ci 596d528ed9Sopenharmony_ci // A shared library depends on gen_obj, having corresponding header for 606d528ed9Sopenharmony_ci // generated obj. 616d528ed9Sopenharmony_ci@@ -442,7 +442,7 @@ TEST_F(NinjaCBinaryTargetWriterTest, NoHardDepsToNoPublicHeaderTarget) { 626d528ed9Sopenharmony_ci "target_output_name = libgen_lib\n" 636d528ed9Sopenharmony_ci "\n" 646d528ed9Sopenharmony_ci "\n" 656d528ed9Sopenharmony_ci- "build ./libgen_lib.so: solink obj/BUILD_DIR/gen_obj.generated.o" 666d528ed9Sopenharmony_ci+ "build ./libgen_lib.so: solink obj/out/Debug/gen_obj.generated.o" 676d528ed9Sopenharmony_ci // The order-only dependency here is strictly unnecessary since 686d528ed9Sopenharmony_ci // obj/out/Debug/gen_obj.generated.o has dependency to 696d528ed9Sopenharmony_ci // obj/foo/gen_obj.stamp 706d528ed9Sopenharmony_cidiff --git a/src/gn/substitution_writer_unittest.cc b/src/gn/substitution_writer_unittest.cc 716d528ed9Sopenharmony_ciindex eaa521a..fc3c446 100644 726d528ed9Sopenharmony_ci--- a/src/gn/substitution_writer_unittest.cc 736d528ed9Sopenharmony_ci+++ b/src/gn/substitution_writer_unittest.cc 746d528ed9Sopenharmony_ci@@ -45,12 +45,6 @@ TEST(SubstitutionWriter, ApplyPatternToSource) { 756d528ed9Sopenharmony_ci SourceFile result = SubstitutionWriter::ApplyPatternToSource( 766d528ed9Sopenharmony_ci nullptr, setup.settings(), pattern, SourceFile("//foo/bar/myfile.txt")); 776d528ed9Sopenharmony_ci ASSERT_EQ("//out/Debug/gen/foo/bar/myfile.tmp", result.value()); 786d528ed9Sopenharmony_ci- 796d528ed9Sopenharmony_ci- result = SubstitutionWriter::ApplyPatternToSource( 806d528ed9Sopenharmony_ci- nullptr, setup.settings(), pattern, 816d528ed9Sopenharmony_ci- SourceFile("//out/Debug/gen/generated_file.cc")); 826d528ed9Sopenharmony_ci- ASSERT_EQ("//out/Debug/gen/BUILD_DIR/gen/generated_file.tmp", result.value()) 836d528ed9Sopenharmony_ci- << result.value(); 846d528ed9Sopenharmony_ci } 856d528ed9Sopenharmony_ci 866d528ed9Sopenharmony_ci TEST(SubstitutionWriter, ApplyPatternToSourceAsOutputFile) { 87