Fix symlinking under output_root
- output_root_inputs contains paths, relative to output root
- but method createOutputArtifact() awaits paths, relative to working directory
Closes #10800.
PiperOrigin-RevId: 295526181
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/actions/NinjaActionsHelper.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/actions/NinjaActionsHelper.java
index 48b3915..3eae54d 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/actions/NinjaActionsHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/ninja/actions/NinjaActionsHelper.java
@@ -90,10 +90,17 @@
return;
}
for (String input : this.outputRootInputs) {
- PathFragment inputPathFragment = PathFragment.create(input);
- DerivedArtifact derivedArtifact = artifactsHelper.createOutputArtifact(inputPathFragment);
+ // output_root_inputs are relative to the output_root directory, and we should
+ // pass inside createOutputArtifact() paths, relative to working directory.
+ DerivedArtifact derivedArtifact =
+ artifactsHelper.createOutputArtifact(
+ artifactsHelper
+ .getOutputRootPath()
+ .getRelative(input)
+ .relativeTo(artifactsHelper.getWorkingDirectory()));
+ // This method already expects the path relative to output_root.
PathFragment absolutePath =
- artifactsHelper.createAbsolutePathUnderOutputRoot(inputPathFragment);
+ artifactsHelper.createAbsolutePathUnderOutputRoot(PathFragment.create(input));
SymlinkAction symlinkAction =
SymlinkAction.toAbsolutePath(
ruleContext.getActionOwner(),
diff --git a/src/test/java/com/google/devtools/build/lib/bazel/rules/ninja/NinjaGraphTest.java b/src/test/java/com/google/devtools/build/lib/bazel/rules/ninja/NinjaGraphTest.java
index 09703f4..6563072 100644
--- a/src/test/java/com/google/devtools/build/lib/bazel/rules/ninja/NinjaGraphTest.java
+++ b/src/test/java/com/google/devtools/build/lib/bazel/rules/ninja/NinjaGraphTest.java
@@ -66,14 +66,14 @@
"build_config/build.ninja",
"rule echo",
" command = echo \"Hello $$(cat ${in})!\" > ${out}",
- "build hello.txt: echo input.txt");
+ "build build_config/hello.txt: echo build_config/input.txt");
+ // Working directory is workspace root.
ConfiguredTarget configuredTarget =
scratchConfiguredTarget(
"",
"graph",
"ninja_graph(name = 'graph', output_root = 'build_config',",
- " working_directory = 'build_config',",
" main = 'build_config/build.ninja',",
" output_root_inputs = ['input.txt'])");
assertThat(configuredTarget).isInstanceOf(RuleConfiguredTarget.class);
@@ -90,7 +90,7 @@
ninjaAction.getCommandLines().getCommandLines();
assertThat(commandLines).hasSize(1);
assertThat(commandLines.get(0).commandLine.toString())
- .endsWith("cd build_config && echo \"Hello $(cat input.txt)!\" > hello.txt");
+ .endsWith("echo \"Hello $(cat build_config/input.txt)!\" > build_config/hello.txt");
assertThat(ninjaAction.getPrimaryInput().getExecPathString())
.isEqualTo("build_config/input.txt");
assertThat(ninjaAction.getPrimaryOutput().getExecPathString())