aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/SkylarkActionFactory.java43
-rw-r--r--src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleContextTest.java6
2 files changed, 44 insertions, 5 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/SkylarkActionFactory.java b/src/main/java/com/google/devtools/build/lib/rules/SkylarkActionFactory.java
index 6157392a68..535987f090 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/SkylarkActionFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/SkylarkActionFactory.java
@@ -51,7 +51,6 @@ public class SkylarkActionFactory implements SkylarkValue {
: ruleContext.getBinOrGenfilesDirectory();
}
-
@SkylarkCallable(
name = "declare_file",
doc =
@@ -93,7 +92,47 @@ public class SkylarkActionFactory implements SkylarkValue {
}
}
- @Override
+ @SkylarkCallable(
+ name = "declare_directory",
+ doc =
+ "Declares that rule or aspect create a directory with the given name, in the "
+ + "current package. You must create an action that generates the file. <br>"
+ + "Files that are specified in rule's outputs do not need to be declared and are "
+ + "available through <a href=\"ctx.html#outputs\">ctx.outputs</a>.",
+ parameters = {
+ @Param(
+ name = "filename",
+ type = String.class,
+ doc =
+ "If no 'sibling' provided, path of the new directory, relative "
+ + "to the current package. Otherwise a base name for a file "
+ + "('sibling' defines a directory)."
+ ),
+ @Param(
+ name = "sibling",
+ doc = "A file that lives in the same directory as the newly declared directory.",
+ type = Artifact.class,
+ noneable = true,
+ positional = false,
+ named = true,
+ defaultValue = "None"
+ )
+ }
+ )
+ public Artifact declareDirectory(String filename, Object sibling) throws EvalException {
+ context.checkMutable("actions.declare_directory");
+ if (Runtime.NONE.equals(sibling)) {
+ return ruleContext.getPackageRelativeTreeArtifact(
+ PathFragment.create(filename), newFileRoot());
+ } else {
+ PathFragment original = ((Artifact) sibling).getRootRelativePath();
+ PathFragment fragment = original.replaceName(filename);
+ return ruleContext.getTreeArtifact(fragment, newFileRoot());
+ }
+ }
+
+
+ @Override
public boolean isImmutable() {
return context.isImmutable();
}
diff --git a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleContextTest.java b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleContextTest.java
index 0e636af7e7..24cc4e0ef2 100644
--- a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleContextTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleContextTest.java
@@ -768,7 +768,7 @@ public class SkylarkRuleContextTest extends SkylarkTestCase {
public void testDeriveTreeArtifact() throws Exception {
SkylarkRuleContext ruleContext = createRuleContext("//foo:foo");
Object result =
- evalRuleContextCode(ruleContext, "ruleContext.experimental_new_directory('a/b')");
+ evalRuleContextCode(ruleContext, "ruleContext.actions.declare_directory('a/b')");
Artifact artifact = (Artifact) result;
PathFragment fragment = artifact.getRootRelativePath();
assertThat(fragment.getPathString()).isEqualTo("foo/a/b");
@@ -781,8 +781,8 @@ public class SkylarkRuleContextTest extends SkylarkTestCase {
Object result =
evalRuleContextCode(
ruleContext,
- "b = ruleContext.experimental_new_directory('a/b')\n"
- + "ruleContext.experimental_new_directory('c', sibling=b)");
+ "b = ruleContext.actions.declare_directory('a/b')\n"
+ + "ruleContext.actions.declare_directory('c', sibling=b)");
Artifact artifact = (Artifact) result;
PathFragment fragment = artifact.getRootRelativePath();
assertThat(fragment.getPathString()).isEqualTo("foo/a/c");