aboutsummaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
Diffstat (limited to 'tools')
-rw-r--r--tools/interface_generator/BUILD.bazel25
-rw-r--r--tools/interface_generator/LICENSE.md15
-rw-r--r--tools/interface_generator/MODULE.bazel16
-rwxr-xr-xtools/interface_generator/interface_generator.py60
-rw-r--r--tools/interface_generator/requirements.txt2
-rw-r--r--tools/interface_generator/requirements_lock.txt74
-rw-r--r--tools/interface_generator/templates/c_functions.mako4
-rw-r--r--tools/interface_generator/templates/c_header.mako13
-rw-r--r--tools/interface_generator/templates/c_system_include.mako4
-rw-r--r--tools/interface_generator/templates/c_types.mako6
10 files changed, 219 insertions, 0 deletions
diff --git a/tools/interface_generator/BUILD.bazel b/tools/interface_generator/BUILD.bazel
new file mode 100644
index 0000000..2e700a2
--- /dev/null
+++ b/tools/interface_generator/BUILD.bazel
@@ -0,0 +1,25 @@
+load("@rules_python//python:pip.bzl", "compile_pip_requirements")
+
+package(default_visibility = ["//visibility:public"])
+
+# This rule adds a convenient way to update the requirements file.
+compile_pip_requirements(
+ name = "requirements",
+ src = "requirements.txt",
+ requirements_txt = "requirements_lock.txt",
+)
+
+py_binary(
+ name = "interface_generator",
+ srcs = ["interface_generator.py"],
+ args = ["-l", "$(location LICENSE.md)"],
+ data = glob(["templates/*"]) + ["LICENSE.md"],
+ deps = [
+ "@pip//mako",
+ ],
+)
+
+alias(
+ name = "smokeTest",
+ actual = ":interface_generator",
+)
diff --git a/tools/interface_generator/LICENSE.md b/tools/interface_generator/LICENSE.md
new file mode 100644
index 0000000..39318a8
--- /dev/null
+++ b/tools/interface_generator/LICENSE.md
@@ -0,0 +1,15 @@
+Copyright (c) 2024 aqua@iserlohn-fortress.net
+
+Permission to use, copy, modify, and distribute this software for any purpose
+with or without fee is hereby granted, provided that the above copyright notice
+and this permission notice appear in all copies.
+
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+SPDX License Identifier: [ISC](https://spdx.org/licenses/ISC.html)
diff --git a/tools/interface_generator/MODULE.bazel b/tools/interface_generator/MODULE.bazel
new file mode 100644
index 0000000..d87d7d8
--- /dev/null
+++ b/tools/interface_generator/MODULE.bazel
@@ -0,0 +1,16 @@
+###############################################################################
+# Bazel now uses Bzlmod by default to manage external dependencies.
+# Please consider migrating your external dependencies from WORKSPACE to MODULE.bazel.
+#
+# For more details, please check https://github.com/bazelbuild/bazel/issues/18958
+###############################################################################
+
+bazel_dep(name = "rules_python", version = "0.31.0")
+
+pip = use_extension("@rules_python//python/extensions:pip.bzl", "pip")
+pip.parse(
+ hub_name = "pip",
+ python_version = "3.11",
+ requirements_lock = "//:requirements_lock.txt",
+)
+use_repo(pip, "pip")
diff --git a/tools/interface_generator/interface_generator.py b/tools/interface_generator/interface_generator.py
new file mode 100755
index 0000000..4eb8d69
--- /dev/null
+++ b/tools/interface_generator/interface_generator.py
@@ -0,0 +1,60 @@
+#!/usr/bin/env python3
+
+from argparse import ArgumentParser
+from mako.template import Template
+from mako.lookup import TemplateLookup
+
+PROG = {
+ "name": "interface_generator",
+ "version": "0.1",
+}
+
+
+def generate_file(template, kwargs):
+ """generate file using a tempalte"""
+ lookup = TemplateLookup(directories=[".", "templates"])
+ template = lookup.get_template(template)
+ result = template.render(**kwargs, PROG=PROG)
+
+ # print(kwargs)
+ print(result)
+
+
+def main():
+ parser = ArgumentParser(
+ prog="interface_generator",
+ description="Generate a C header file from an interface definition",
+ )
+ parser.add_argument("-l", "--license", required=True)
+
+ parser_args = parser.parse_args()
+ print(parser_args)
+
+ args = {
+ "name": "stdio",
+ "license": parser_args.license,
+ "system_includes": ["stdarg.h"],
+ "types": [
+ {
+ "name": "FILE",
+ "members": [
+ "int fd",
+ "int (*putc)(const struct FILE*, const char)",
+ "int (*puts)(const struct FILE*, const char*)",
+ ],
+ },
+ ],
+ "functions": [
+ {
+ "name": "printf",
+ "return": "int",
+ "arguments": ["const char*__restrict__ format", "..."],
+ },
+ ],
+ }
+
+ generate_file("c_header.mako", args)
+
+
+if __name__ == "__main__":
+ main()
diff --git a/tools/interface_generator/requirements.txt b/tools/interface_generator/requirements.txt
new file mode 100644
index 0000000..9c39cd4
--- /dev/null
+++ b/tools/interface_generator/requirements.txt
@@ -0,0 +1,2 @@
+Mako==1.3.3
+MarkupSafe==2.1.5
diff --git a/tools/interface_generator/requirements_lock.txt b/tools/interface_generator/requirements_lock.txt
new file mode 100644
index 0000000..85ae312
--- /dev/null
+++ b/tools/interface_generator/requirements_lock.txt
@@ -0,0 +1,74 @@
+#
+# This file is autogenerated by pip-compile with Python 3.11
+# by the following command:
+#
+# bazel run //:requirements.update
+#
+mako==1.3.3 \
+ --hash=sha256:5324b88089a8978bf76d1629774fcc2f1c07b82acdf00f4c5dd8ceadfffc4b40 \
+ --hash=sha256:e16c01d9ab9c11f7290eef1cfefc093fb5a45ee4a3da09e2fec2e4d1bae54e73
+ # via -r requirements.txt
+markupsafe==2.1.5 \
+ --hash=sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf \
+ --hash=sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff \
+ --hash=sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f \
+ --hash=sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3 \
+ --hash=sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532 \
+ --hash=sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f \
+ --hash=sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617 \
+ --hash=sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df \
+ --hash=sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4 \
+ --hash=sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906 \
+ --hash=sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f \
+ --hash=sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4 \
+ --hash=sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8 \
+ --hash=sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371 \
+ --hash=sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2 \
+ --hash=sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465 \
+ --hash=sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52 \
+ --hash=sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6 \
+ --hash=sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169 \
+ --hash=sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad \
+ --hash=sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2 \
+ --hash=sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0 \
+ --hash=sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029 \
+ --hash=sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f \
+ --hash=sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a \
+ --hash=sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced \
+ --hash=sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5 \
+ --hash=sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c \
+ --hash=sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf \
+ --hash=sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9 \
+ --hash=sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb \
+ --hash=sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad \
+ --hash=sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3 \
+ --hash=sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1 \
+ --hash=sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46 \
+ --hash=sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc \
+ --hash=sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a \
+ --hash=sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee \
+ --hash=sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900 \
+ --hash=sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5 \
+ --hash=sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea \
+ --hash=sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f \
+ --hash=sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5 \
+ --hash=sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e \
+ --hash=sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a \
+ --hash=sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f \
+ --hash=sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50 \
+ --hash=sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a \
+ --hash=sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b \
+ --hash=sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4 \
+ --hash=sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff \
+ --hash=sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2 \
+ --hash=sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46 \
+ --hash=sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b \
+ --hash=sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf \
+ --hash=sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5 \
+ --hash=sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5 \
+ --hash=sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab \
+ --hash=sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd \
+ --hash=sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68
+ # via
+ # -r requirements.txt
+ # mako
diff --git a/tools/interface_generator/templates/c_functions.mako b/tools/interface_generator/templates/c_functions.mako
new file mode 100644
index 0000000..a7f88be
--- /dev/null
+++ b/tools/interface_generator/templates/c_functions.mako
@@ -0,0 +1,4 @@
+/* Functions */
+% for fn in functions:
+${fn['return']} ${fn['name']}(${ ", ".join(fn['arguments']) });
+% endfor
diff --git a/tools/interface_generator/templates/c_header.mako b/tools/interface_generator/templates/c_header.mako
new file mode 100644
index 0000000..069b449
--- /dev/null
+++ b/tools/interface_generator/templates/c_header.mako
@@ -0,0 +1,13 @@
+/* This file is generated by ${PROG['name']} v${PROG['version']} */
+
+/******************************************************************************
+<%include file="${license}" />
+ ******************************************************************************/
+
+#ifndef ${ name.upper() }_H
+#define ${ name.upper() }_H
+
+<%include file="c_system_include.mako" />
+<%include file="c_types.mako" />
+<%include file="c_functions.mako" />
+#endif /* ${ name.upper() }_H */
diff --git a/tools/interface_generator/templates/c_system_include.mako b/tools/interface_generator/templates/c_system_include.mako
new file mode 100644
index 0000000..d6a9d09
--- /dev/null
+++ b/tools/interface_generator/templates/c_system_include.mako
@@ -0,0 +1,4 @@
+/* System includes */
+% for path in system_includes:
+#include <${path}>
+% endfor
diff --git a/tools/interface_generator/templates/c_types.mako b/tools/interface_generator/templates/c_types.mako
new file mode 100644
index 0000000..ac32469
--- /dev/null
+++ b/tools/interface_generator/templates/c_types.mako
@@ -0,0 +1,6 @@
+/* Types */
+% for type in types:
+typedef struct ${type['name']} {
+${ "\n".join([ " {};".format(member) for member in type['members'] ]) }
+} ${type['name']};
+% endfor