diff options
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/rules/SkylarkActionFactory.java | 43 | ||||
-rw-r--r-- | src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleContextTest.java | 6 |
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"); |