[llvm] 10f7255 - [gn build] Extract compiled_action.gni from tablegen.gni

Nico Weber via llvm-commits llvm-commits at lists.llvm.org
Fri Jun 3 07:22:25 PDT 2022


Author: Nico Weber
Date: 2022-06-03T10:22:15-04:00
New Revision: 10f7255d32b690a44556297cee9a2ddb476e8ea6

URL: https://github.com/llvm/llvm-project/commit/10f7255d32b690a44556297cee9a2ddb476e8ea6
DIFF: https://github.com/llvm/llvm-project/commit/10f7255d32b690a44556297cee9a2ddb476e8ea6.diff

LOG: [gn build] Extract compiled_action.gni from tablegen.gni

After years of tablegen being the only host binary we run as part
of the build, we're now in the process of growing at least two more:
- make_confusable_table (https://reviews.llvm.org/rG180bae08a04d)
- pseudo-gen (not yet fully hooked up in the GN build, but I have
  a local branch that hooks it up)

Factor out the few lines we need for running a host binary as part of the
build.

No behavior change.

Differential Revision: https://reviews.llvm.org/D126963

Added: 
    llvm/utils/gn/build/compiled_action.gni
    llvm/utils/gn/build/run_built_binary.py

Modified: 
    llvm/utils/gn/secondary/llvm/utils/TableGen/tablegen.gni

Removed: 
    llvm/utils/gn/build/run_tablegen.py


################################################################################
diff  --git a/llvm/utils/gn/build/compiled_action.gni b/llvm/utils/gn/build/compiled_action.gni
new file mode 100644
index 0000000000000..697fe3de2a9e5
--- /dev/null
+++ b/llvm/utils/gn/build/compiled_action.gni
@@ -0,0 +1,74 @@
+# Defines compiled_action().
+#
+# compiled_action() is like action(), except that it runs a built binary
+# instead of a script.
+#
+# Parameters:
+#
+#   tool (required)
+#       [label] Label of the tool to run. This should be an executable, and
+#       this label should not include a toolchain (anything in parens). This
+#       tool will be built for the host.
+#
+#   outputs (required)
+#       [list of files] Same meaning as for action().
+#
+#   args (required)
+#       [list of strings] Flags to pass to the built binary. Almost identical
+#       to action()'s `args`, except that `tool` is implicitly added as first
+#       element.
+#
+#   depfile
+#   inputs
+#   public_configs
+#   visibility   (all optional)
+#       Same meaning as for action().
+#
+# Example use:
+#
+#   compiled_action("run_my_tool") {
+#     tool = "//tools/something:mytool"
+#     inputs = [ "my_input_file.txt" ]
+#     outputs = [ "$target_gen_dir/mysource.inc" ]
+#     args = [
+#       rebase_path(inputs[0], root_build_dir),
+#       rebase_path(outputs[0], root_build_dir),
+#     ]
+#   }
+#
+# You would typically declare your tool like this:
+#   if (host_toolchain == current_toolchain) {
+#     executable("mytool") {
+#       ...
+#     }
+#   }
+# The if statement around the executable is optional. It means "I only care
+# about this target in the host toolchain". Usually this is what you want, and
+# saves unnecessarily compiling your tool for the target platform. If you
+# need a target build of your tool as well, omit the if statement.
+
+template("compiled_action") {
+  assert(defined(invoker.args), "must set 'args' in $target_name")
+  assert(defined(invoker.outputs), "must set 'outputs' in $target_name")
+  assert(defined(invoker.tool), "must set 'tool' in $target_name")
+  assert(!defined(invoker.sources),
+         "use 'inputs' instead of 'sources' in $target_name")
+
+  action(target_name) {
+    forward_variables_from(invoker,
+                           [
+                             "depfile",
+                             "inputs",
+                             "outputs",
+                             "public_configs",
+                             "visibility",
+                           ])
+    host_tool = invoker.tool + "($host_toolchain)"
+    host_executable = get_label_info(host_tool, "root_out_dir") +
+                      "/bin/" + get_label_info(host_tool, "name")
+    deps = [ host_tool ]
+    script = "//llvm/utils/gn/build/run_built_binary.py"
+    args = [ rebase_path(host_executable, root_build_dir) ] + invoker.args
+  }
+}
+

diff  --git a/llvm/utils/gn/build/run_tablegen.py b/llvm/utils/gn/build/run_built_binary.py
similarity index 87%
rename from llvm/utils/gn/build/run_tablegen.py
rename to llvm/utils/gn/build/run_built_binary.py
index 71476d24273b9..faac5654873b9 100755
--- a/llvm/utils/gn/build/run_tablegen.py
+++ b/llvm/utils/gn/build/run_built_binary.py
@@ -1,5 +1,5 @@
 #!/usr/bin/env python3
-"""Runs tablegen."""
+"""Runs a built binary."""
 
 import subprocess
 import sys

diff  --git a/llvm/utils/gn/secondary/llvm/utils/TableGen/tablegen.gni b/llvm/utils/gn/secondary/llvm/utils/TableGen/tablegen.gni
index 741d3b6ce2481..21433642946c1 100644
--- a/llvm/utils/gn/secondary/llvm/utils/TableGen/tablegen.gni
+++ b/llvm/utils/gn/secondary/llvm/utils/TableGen/tablegen.gni
@@ -24,6 +24,8 @@
 #     td_file = "AttributesCompatFunc.td"
 #   }
 
+import("//llvm/utils/gn/build/compiled_action.gni")
+
 template("tablegen") {
   assert(defined(invoker.args), "must set 'args' in $target_name")
 
@@ -33,25 +35,20 @@ template("tablegen") {
     include_dirs = [ target_gen_dir ]
   }
 
-  action(target_name) {
+  compiled_action(target_name) {
     forward_variables_from(invoker, [ "visibility" ])
 
     if (defined(invoker.tblgen_target)) {
-      tblgen_target = invoker.tblgen_target
+      tool = invoker.tblgen_target
     } else {
-      tblgen_target = "//llvm/utils/TableGen:llvm-tblgen"
+      tool = "//llvm/utils/TableGen:llvm-tblgen"
     }
-    tblgen_target += "($host_toolchain)"
-    tblgen_executable = get_label_info(tblgen_target, "root_out_dir") +
-                        "/bin/" + get_label_info(tblgen_target, "name")
-    deps = [ tblgen_target ]
     if (defined(invoker.td_file)) {
       td_file = invoker.td_file
     } else {
       td_file = "$target_name.td"
     }
-    sources = [ td_file ]
-    script = "//llvm/utils/gn/build/run_tablegen.py"
+    inputs = [ td_file ]
     if (defined(invoker.output_name)) {
       gen_output = "$target_gen_dir/" + invoker.output_name
     } else {
@@ -61,7 +58,6 @@ template("tablegen") {
     td_file = rebase_path(td_file, root_build_dir)
 
     args = [
-             rebase_path(tblgen_executable, root_build_dir),
              "--write-if-changed",
 
              "-I",


        


More information about the llvm-commits mailing list