Empty Dir Support

PiperOrigin-RevId: 469818319
diff --git a/kotlin/common.bzl b/kotlin/common.bzl
index 6627b09..8a06b56 100644
--- a/kotlin/common.bzl
+++ b/kotlin/common.bzl
@@ -661,18 +661,32 @@
 
     args = ctx.actions.args()
 
-    args.add("cf", output_jar)
     for in_dir in input_dirs:
         if not in_dir.is_directory:
             fail("Expected a directory input, but got {}.".format(in_dir))
-        args.add("-C", in_dir.path)
-        args.add(".")
+        args.add(in_dir.path)
 
-    ctx.actions.run(
-        executable = jar_tool,
+    ctx.actions.run_shell(
+        command = """
+            JAR_TOOL={}
+            OUT_JAR={}
+            OUT_DIR="$(dirname $OUT_JAR)"
+            RES_DIR=$OUT_DIR/META-INF
+            mkdir $RES_DIR
+            $JAR_TOOL cf $OUT_JAR $RES_DIR
+            rmdir $RES_DIR
+            for INPUT_DIR in $@
+            do
+                if [ -d $INPUT_DIR ]
+                then
+                    $JAR_TOOL uf $OUT_JAR -C $INPUT_DIR .
+                fi
+            done
+        """.format(jar_tool.executable.path, output_jar.path),
+        arguments = [args],
         inputs = input_dirs,
         outputs = [output_jar],
-        arguments = [args],
+        tools = [jar_tool],
         mnemonic = "KtJarActionFromTreeArtifacts",
         progress_message = "Create Jar %{output}",
     )
diff --git a/tests/analysis/util.bzl b/tests/analysis/util.bzl
index a18a140..cec0cc3 100644
--- a/tests/analysis/util.bzl
+++ b/tests/analysis/util.bzl
@@ -34,18 +34,24 @@
     return name
 
 def _create_dir_impl(ctx):
-    if not ctx.files.srcs:
-        fail("Creating empty directories not implemented")
-
     dir = ctx.actions.declare_directory(ctx.attr.name)
-    ctx.actions.run_shell(
-        command = "mkdir -p {0} && cp {1} {0}".format(
-            dir.path + "/" + ctx.attr.subdir,
-            " ".join([s.path for s in ctx.files.srcs]),
-        ),
-        inputs = ctx.files.srcs,
-        outputs = [dir],
-    )
+    if ctx.files.srcs:
+        ctx.actions.run_shell(
+            command = "mkdir -p {0} && cp {1} {0}".format(
+                dir.path + "/" + ctx.attr.subdir,
+                " ".join([s.path for s in ctx.files.srcs]),
+            ),
+            inputs = ctx.files.srcs,
+            outputs = [dir],
+        )
+    else:
+        ctx.actions.run_shell(
+            command = "mkdir -p {0}".format(
+                dir.path + "/" + ctx.attr.subdir,
+            ),
+            inputs = ctx.files.srcs,
+            outputs = [dir],
+        )
     return [DefaultInfo(files = depset([dir]))]
 
 _create_dir = rule(
diff --git a/tests/jvm/java/srcartifacts/BUILD b/tests/jvm/java/srcartifacts/BUILD
index af06470..d530213 100644
--- a/tests/jvm/java/srcartifacts/BUILD
+++ b/tests/jvm/java/srcartifacts/BUILD
@@ -30,7 +30,8 @@
         ":dir/kotlin",
     ],
     resources = [
-        ":dir/resources",
+        "dir/empty",
+        "dir/resources",
     ],
     test_class = "srcartifacts.SrcArtifactsTest",
     deps = [
@@ -56,6 +57,12 @@
 )
 
 create_dir(
+    name = "dir/empty",
+    srcs = [],
+    subdir = "srcartifacts/empty",
+)
+
+create_dir(
     name = "dir/resources",
     srcs = [
         create_file(