aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar cpeyser <cpeyser@google.com>2017-05-26 16:30:01 +0200
committerGravatar Marcel Hlopko <hlopko@google.com>2017-05-26 16:53:36 +0200
commite3736d168deec840ba1bd83f47a554db9b814b75 (patch)
tree57e84ba05c9b136092a06ebad2a36a49e96f3983 /src
parent73fe48b508fb90a90aa15e40ee0f5058ba2bcced (diff)
For objc rules, generated headers are mandatory inputs to CppCompileAction.
PiperOrigin-RevId: 157218175
Diffstat (limited to 'src')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCppSemantics.java14
-rw-r--r--src/main/java/com/google/devtools/build/lib/vfs/PathFragment.java8
2 files changed, 22 insertions, 0 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCppSemantics.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCppSemantics.java
index c2e1bd8530..903f09bd8e 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCppSemantics.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCppSemantics.java
@@ -19,6 +19,7 @@ import static com.google.devtools.build.lib.rules.objc.ObjcProvider.HEADER;
import static com.google.devtools.build.lib.rules.objc.ObjcProvider.STATIC_FRAMEWORK_FILE;
import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.analysis.RuleContext;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
@@ -99,6 +100,19 @@ public class ObjcCppSemantics implements CppSemantics {
actionBuilder.addTransitiveMandatoryInputs(objcProvider.get(STATIC_FRAMEWORK_FILE));
actionBuilder.addTransitiveMandatoryInputs(objcProvider.get(DYNAMIC_FRAMEWORK_FILE));
+ ImmutableSet.Builder<Artifact> generatedHeaders = ImmutableSet.builder();
+
+ // TODO(b/62060839): Identify the mechanism used to add generated headers in c++, and recycle
+ // it here.
+ PathFragment genfilesSegment =
+ ruleContext.getConfiguration().getGenfilesDirectory().getExecPath().getLastSegment();
+ for (Artifact header : objcProvider.get(HEADER)) {
+ if (genfilesSegment.equals(header.getRoot().getExecPath().getLastSegment())) {
+ generatedHeaders.add(header);
+ }
+ }
+ actionBuilder.addMandatoryInputs(generatedHeaders.build());
+
if (isHeaderThinningEnabled) {
Artifact sourceFile = actionBuilder.getSourceFile();
if (!sourceFile.isTreeArtifact()
diff --git a/src/main/java/com/google/devtools/build/lib/vfs/PathFragment.java b/src/main/java/com/google/devtools/build/lib/vfs/PathFragment.java
index 41e45b1944..caad724f83 100644
--- a/src/main/java/com/google/devtools/build/lib/vfs/PathFragment.java
+++ b/src/main/java/com/google/devtools/build/lib/vfs/PathFragment.java
@@ -554,6 +554,14 @@ public abstract class PathFragment implements Comparable<PathFragment>, Serializ
}
/**
+ * Returns the last segment in this path, or null if this PathFragment represents the root of the
+ * filesystem.
+ */
+ public PathFragment getLastSegment() {
+ return segments.length == 0 ? null : relativeTo(getParentDirectory());
+ }
+
+ /**
* Returns a new PathFragment formed by appending {@code newName} to the
* parent directory. Null is returned iff this method is called on a
* PathFragment with zero segments. If {@code newName} designates an absolute path,