[libc-commits] [libc] [libc] Add some integration features into newhdrgen (PR #114272)

Roland McGrath via libc-commits libc-commits at lists.llvm.org
Wed Oct 30 12:19:07 PDT 2024


https://github.com/frobtech updated https://github.com/llvm/llvm-project/pull/114272

>From 0e5a892f3a3e3dc9d77695cf7f3a4c9a08702aba Mon Sep 17 00:00:00 2001
From: Roland McGrath <mcgrathr at google.com>
Date: Wed, 30 Oct 2024 10:11:57 -0700
Subject: [PATCH 1/3] [libc] Add some integration features into newhdrgen

This adds some command-line switches to the newhdrgen script
that facilitate more generalized build system integration.
These enable the use of the script in Fuchsia's GN build.

The --write-if-changed switch avoids touching the .h output file
if it's unchanged, which is beneficial to incremental rebuilds.

The --depfile switch writes out a make/ninja-compatible depfile
describing the inputs and outputs.  This is crucial for build
system integration when using the following new feature.

When the new --libc-dir switch is given, the YAML file argument
is optional.  Instead, the --h_def_file input file path must have
the --libc-dir path as a prefix and the yaml file is found in its
corresponding place in the libc source tree.
---
 libc/newhdrgen/yaml_to_classes.py | 64 +++++++++++++++++++++++++------
 1 file changed, 53 insertions(+), 11 deletions(-)

diff --git a/libc/newhdrgen/yaml_to_classes.py b/libc/newhdrgen/yaml_to_classes.py
index a295058f7dc821..9eca993da998e6 100644
--- a/libc/newhdrgen/yaml_to_classes.py
+++ b/libc/newhdrgen/yaml_to_classes.py
@@ -219,15 +219,36 @@ def increase_indent(self, flow=False, indentless=False):
 def main():
     parser = argparse.ArgumentParser(description="Generate header files from YAML")
     parser.add_argument(
-        "yaml_file", help="Path to the YAML file containing header specification"
+        "yaml_file",
+        help="Path to the YAML file containing header specification",
+        type=Path,
+        nargs="?",
     )
     parser.add_argument(
         "--output_dir",
         help="Directory to output the generated header file",
+        type=Path,
     )
     parser.add_argument(
         "--h_def_file",
         help="Path to the .h.def template file (required if not using --export_decls)",
+        type=Path,
+    )
+    parser.add_argument(
+        "--libc-dir",
+        help="Path to llvm-libc source tree",
+        type=Path,
+        default=Path(__file__).parents[1]
+    )
+    parser.add_argument(
+        "--depfile",
+        help="Path to write a depfile",
+        type=argparse.FileType("w"),
+    )
+    parser.add_argument(
+        "--write-if-changed",
+        help="Don't touch the output .h file if it's unchanged",
+        action="store_true",
     )
     parser.add_argument(
         "--add_function",
@@ -252,30 +273,51 @@ def main():
     )
     args = parser.parse_args()
 
+    def write_to_file(path, contents):
+        if not args.write_if_changed or not path.exists() or path.read_text() != contents:
+            path.write_text(contents)
+
+    if args.h_def_file and not args.yaml_file:
+        libc_include_dir = args.libc_dir / "include"
+        libc_yaml_dir = args.libc_dir / "newhdrgen" / "yaml"
+        args.yaml_file = libc_yaml_dir / args.h_def_file.with_suffix("").with_suffix(".yaml").relative_to(libc_include_dir)
+
+    if args.output_dir:
+        output_file_path = args.output_dir
+        if output_file_path.is_dir():
+            libc_yaml_dir = args.libc_dir / "newhdrgen" / "yaml"
+            output_file_path /= args.yaml_file.relative_to(libc_yaml_dir).with_suffix(".h")
+            output_file_path.parent.mkdir(parents=True, exist_ok=True)
+    else:
+        output_file_path = args.yaml_file.with_suffix(".h")
+
+    if args.depfile and args.h_def_file:
+        args.depfile.write(
+            f"{output_file_path}: {args.h_def_file} {args.yaml_file}\n")
+        args.depfile.close()
+
     if args.add_function:
         add_function_to_yaml(yaml_file, args.add_function)
 
     header_class = GpuHeader if args.export_decls else HeaderFile
     header = load_yaml_file(args.yaml_file, header_class, args.entry_points)
 
+    if args.add_function:
+        add_function_to_yaml(yaml_file, args.add_function)
+
     header_str = str(header)
+    header_class = GpuHeader if args.export_decls else HeaderFile
+    header = load_yaml_file(args.yaml_file, header_class, args.entry_points)
 
-    if args.output_dir:
-        output_file_path = Path(args.output_dir)
-        if output_file_path.is_dir():
-            output_file_path /= f"{Path(args.yaml_file).stem}.h"
-    else:
-        output_file_path = Path(f"{Path(args.yaml_file).stem}.h")
+    header_str = str(header)
 
     if not args.export_decls and args.h_def_file:
         with open(args.h_def_file, "r") as f:
             h_def_content = f.read()
         final_header_content = fill_public_api(header_str, h_def_content)
-        with open(output_file_path, "w") as f:
-            f.write(final_header_content)
     else:
-        with open(output_file_path, "w") as f:
-            f.write(header_str)
+        final_header_content = str
+    write_to_file(output_file_path, final_header_content)
 
 
 if __name__ == "__main__":

>From 712bbb86db3935a8f350f2d5237eef5b18b4e46b Mon Sep 17 00:00:00 2001
From: Roland McGrath <mcgrathr at google.com>
Date: Wed, 30 Oct 2024 10:23:52 -0700
Subject: [PATCH 2/3] Restore old behavior for test suite with explicit YAML
 file arg

---
 libc/newhdrgen/yaml_to_classes.py | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/libc/newhdrgen/yaml_to_classes.py b/libc/newhdrgen/yaml_to_classes.py
index 9eca993da998e6..9ad6ea0a87d119 100644
--- a/libc/newhdrgen/yaml_to_classes.py
+++ b/libc/newhdrgen/yaml_to_classes.py
@@ -277,16 +277,20 @@ def write_to_file(path, contents):
         if not args.write_if_changed or not path.exists() or path.read_text() != contents:
             path.write_text(contents)
 
-    if args.h_def_file and not args.yaml_file:
+    yaml_file = args.yaml_file
+    if args.h_def_file and not yaml_file:
         libc_include_dir = args.libc_dir / "include"
         libc_yaml_dir = args.libc_dir / "newhdrgen" / "yaml"
-        args.yaml_file = libc_yaml_dir / args.h_def_file.with_suffix("").with_suffix(".yaml").relative_to(libc_include_dir)
+        yaml_file = libc_yaml_dir / args.h_def_file.with_suffix("").with_suffix(".yaml").relative_to(libc_include_dir)
 
     if args.output_dir:
         output_file_path = args.output_dir
         if output_file_path.is_dir():
-            libc_yaml_dir = args.libc_dir / "newhdrgen" / "yaml"
-            output_file_path /= args.yaml_file.relative_to(libc_yaml_dir).with_suffix(".h")
+            if not args.yaml_file:
+                libc_yaml_dir = args.libc_dir / "newhdrgen" / "yaml"
+                output_file_path /= args.yaml_file.relative_to(libc_yaml_dir).with_suffix(".h")
+            else:
+                output_file_path /= f"{Path(args.yaml_file).stem}.h"
             output_file_path.parent.mkdir(parents=True, exist_ok=True)
     else:
         output_file_path = args.yaml_file.with_suffix(".h")

>From 15c13eb5661c5568339cd90dad99b0e2c2e88534 Mon Sep 17 00:00:00 2001
From: Roland McGrath <mcgrathr at google.com>
Date: Wed, 30 Oct 2024 10:27:44 -0700
Subject: [PATCH 3/3] python formatting

---
 libc/newhdrgen/yaml_to_classes.py | 19 +++++++++++++------
 1 file changed, 13 insertions(+), 6 deletions(-)

diff --git a/libc/newhdrgen/yaml_to_classes.py b/libc/newhdrgen/yaml_to_classes.py
index 9ad6ea0a87d119..460bc4a87452c3 100644
--- a/libc/newhdrgen/yaml_to_classes.py
+++ b/libc/newhdrgen/yaml_to_classes.py
@@ -238,7 +238,7 @@ def main():
         "--libc-dir",
         help="Path to llvm-libc source tree",
         type=Path,
-        default=Path(__file__).parents[1]
+        default=Path(__file__).parents[1],
     )
     parser.add_argument(
         "--depfile",
@@ -274,21 +274,29 @@ def main():
     args = parser.parse_args()
 
     def write_to_file(path, contents):
-        if not args.write_if_changed or not path.exists() or path.read_text() != contents:
+        if (
+            not args.write_if_changed
+            or not path.exists()
+            or path.read_text() != contents
+        ):
             path.write_text(contents)
 
     yaml_file = args.yaml_file
     if args.h_def_file and not yaml_file:
         libc_include_dir = args.libc_dir / "include"
         libc_yaml_dir = args.libc_dir / "newhdrgen" / "yaml"
-        yaml_file = libc_yaml_dir / args.h_def_file.with_suffix("").with_suffix(".yaml").relative_to(libc_include_dir)
+        yaml_file = libc_yaml_dir / args.h_def_file.with_suffix("").with_suffix(
+            ".yaml"
+        ).relative_to(libc_include_dir)
 
     if args.output_dir:
         output_file_path = args.output_dir
         if output_file_path.is_dir():
             if not args.yaml_file:
                 libc_yaml_dir = args.libc_dir / "newhdrgen" / "yaml"
-                output_file_path /= args.yaml_file.relative_to(libc_yaml_dir).with_suffix(".h")
+                output_file_path /= args.yaml_file.relative_to(
+                    libc_yaml_dir
+                ).with_suffix(".h")
             else:
                 output_file_path /= f"{Path(args.yaml_file).stem}.h"
             output_file_path.parent.mkdir(parents=True, exist_ok=True)
@@ -296,8 +304,7 @@ def write_to_file(path, contents):
         output_file_path = args.yaml_file.with_suffix(".h")
 
     if args.depfile and args.h_def_file:
-        args.depfile.write(
-            f"{output_file_path}: {args.h_def_file} {args.yaml_file}\n")
+        args.depfile.write(f"{output_file_path}: {args.h_def_file} {args.yaml_file}\n")
         args.depfile.close()
 
     if args.add_function:



More information about the libc-commits mailing list