Parse built-in WORKSPACE files
This doesn't actually add any default workspace files, yet, but adds machinery
for them. Also did some cleanup/renaming.
--
MOS_MIGRATED_REVID=86085127
diff --git a/src/main/java/com/google/devtools/build/lib/packages/ExternalPackage.java b/src/main/java/com/google/devtools/build/lib/packages/ExternalPackage.java
index 9c92b33..ac4920c 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/ExternalPackage.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/ExternalPackage.java
@@ -34,6 +34,7 @@
*/
public class ExternalPackage extends Package {
+ private String workspaceName;
private Map<RepositoryName, Rule> repositoryMap;
ExternalPackage() {
@@ -41,6 +42,13 @@
}
/**
+ * Returns the name for this repository.
+ */
+ public String getWorkspaceName() {
+ return workspaceName;
+ }
+
+ /**
* Returns a description of the repository with the given name, or null if there's no such
* repository.
*/
@@ -79,28 +87,37 @@
/**
* Given a workspace file path, creates an ExternalPackage.
*/
- public static class ExternalPackageBuilder
- extends AbstractBuilder<ExternalPackage, ExternalPackageBuilder> {
+ public static class Builder
+ extends AbstractBuilder<ExternalPackage, Builder> {
+ private String workspaceName;
private Map<Label, Binding> bindMap = Maps.newHashMap();
private Map<RepositoryName, Rule> repositoryMap = Maps.newHashMap();
- public ExternalPackageBuilder(Path workspacePath) {
+ public Builder(Path workspacePath) {
super(new ExternalPackage());
setFilename(workspacePath);
setMakeEnv(new MakeEnvironment.Builder());
}
@Override
- protected ExternalPackageBuilder self() {
+ protected Builder self() {
return this;
}
@Override
public ExternalPackage build() {
+ pkg.workspaceName = workspaceName;
pkg.repositoryMap = ImmutableMap.copyOf(repositoryMap);
return super.build();
}
+ /**
+ * Sets the name for this repository.
+ */
+ public void setWorkspaceName(String name) {
+ workspaceName = name;
+ }
+
public void addBinding(Label label, Binding binding) {
bindMap.put(label, binding);
}
@@ -178,7 +195,7 @@
* Creates an external repository rule.
* @throws SyntaxException if the repository name is invalid.
*/
- public ExternalPackageBuilder createAndAddRepositoryRule(RuleClass ruleClass,
+ public Builder createAndAddRepositoryRule(RuleClass ruleClass,
Map<String, Object> kwargs, FuncallExpression ast)
throws InvalidRuleException, NameConflictException, SyntaxException {
StoredEventHandler eventHandler = new StoredEventHandler();
diff --git a/src/main/java/com/google/devtools/build/lib/packages/RuleClassProvider.java b/src/main/java/com/google/devtools/build/lib/packages/RuleClassProvider.java
index 90fdfca..07b1b18 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/RuleClassProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/RuleClassProvider.java
@@ -17,7 +17,9 @@
import com.google.devtools.build.lib.events.EventHandler;
import com.google.devtools.build.lib.syntax.SkylarkEnvironment;
import com.google.devtools.build.lib.syntax.ValidationEnvironment;
+import com.google.devtools.build.lib.vfs.PathFragment;
+import java.util.List;
import java.util.Map;
/**
@@ -46,4 +48,11 @@
* Returns the Skylark module to register the native rules with.
*/
Object getNativeModule();
+
+ /**
+ * Returns paths to the WORKSPACE files needed to provide external dependencies for built-in
+ * rules. The PathFragments are relative to Bazel's install directory. Returns an empty list if
+ * there are none defined.
+ */
+ List<PathFragment> getWorkspaceFiles();
}
diff --git a/src/main/java/com/google/devtools/build/lib/packages/RuleFactory.java b/src/main/java/com/google/devtools/build/lib/packages/RuleFactory.java
index c79bbaa..cffef50 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/RuleFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/RuleFactory.java
@@ -23,7 +23,6 @@
import com.google.devtools.build.lib.syntax.FuncallExpression;
import com.google.devtools.build.lib.syntax.Label;
import com.google.devtools.build.lib.syntax.Label.SyntaxException;
-import com.google.devtools.build.lib.vfs.PathFragment;
import java.util.Map;
import java.util.Set;
@@ -106,7 +105,7 @@
throw new InvalidRuleException("illegal rule name: " + name + ": " + e.getMessage());
}
boolean inWorkspaceFile = location.getPath() != null
- && location.getPath().endsWith(new PathFragment("WORKSPACE"));
+ && location.getPath().getBaseName().contains("WORKSPACE");
if (ruleClass.getWorkspaceOnly() && !inWorkspaceFile) {
throw new RuleFactory.InvalidRuleException(ruleClass + " must be in the WORKSPACE file "
+ "(used by " + label + ")");