blob: 5afd61a722ed96a7ec91b028901613fa7b6597ee [file] [log] [blame]
Maxwell Henderson80bec322024-01-09 15:48:44 -08001#!/usr/bin/env python3
2
James Kuszmaulcf324122023-01-14 14:07:17 -08003import glob
4import os
5import sys
6from jinja2 import Environment, FileSystemLoader
7import json
8
9
10def Output(outPath, outfn, contents):
11 if not os.path.exists(outPath):
12 os.makedirs(outPath)
13
14 outpathname = f"{outPath}/{outfn}"
15
16 if os.path.exists(outpathname):
17 with open(outpathname, "r") as f:
18 if f.read() == contents:
19 return
20
21 # File either doesn't exist or has different contents
Maxwell Henderson80bec322024-01-09 15:48:44 -080022 with open(outpathname, "w", newline="\n") as f:
James Kuszmaulcf324122023-01-14 14:07:17 -080023 f.write(contents)
24
25
26def main():
27 dirname, _ = os.path.split(os.path.abspath(__file__))
James Kuszmaulcf324122023-01-14 14:07:17 -080028
29 with open(f"{dirname}/src/generate/types.json") as f:
30 types = json.load(f)
31
32 # Java files
33 env = Environment(
Maxwell Henderson80bec322024-01-09 15:48:44 -080034 loader=FileSystemLoader(f"{dirname}/src/generate/main/java"), autoescape=False
James Kuszmaulcf324122023-01-14 14:07:17 -080035 )
Maxwell Henderson80bec322024-01-09 15:48:44 -080036 rootPath = f"{dirname}/src/generated/main/java/edu/wpi/first/networktables"
37 for fn in glob.glob(f"{dirname}/src/generate/main/java/*.jinja"):
James Kuszmaulcf324122023-01-14 14:07:17 -080038 template = env.get_template(os.path.basename(fn))
39 outfn = os.path.basename(fn)[:-6] # drop ".jinja"
40 if os.path.basename(fn).startswith("NetworkTable") or os.path.basename(
41 fn
42 ).startswith("Generic"):
43 output = template.render(types=types)
44 Output(rootPath, outfn, output)
45 else:
46 for replacements in types:
47 output = template.render(replacements)
48 if outfn == "Timestamped.java":
49 outfn2 = f"Timestamped{replacements['TypeName']}.java"
50 else:
51 outfn2 = f"{replacements['TypeName']}{outfn}"
52 Output(rootPath, outfn2, output)
53
54 # C++ classes
55 env = Environment(
Maxwell Henderson80bec322024-01-09 15:48:44 -080056 loader=FileSystemLoader(
57 f"{dirname}/src/generate/main/native/include/networktables"
58 ),
James Kuszmaulcf324122023-01-14 14:07:17 -080059 autoescape=False,
60 )
Maxwell Henderson80bec322024-01-09 15:48:44 -080061 rootPath = f"{dirname}/src/generated/main/native/include/networktables"
62 for fn in glob.glob(
63 f"{dirname}/src/generate/main/native/include/networktables/*.jinja"
64 ):
James Kuszmaulcf324122023-01-14 14:07:17 -080065 template = env.get_template(os.path.basename(fn))
66 outfn = os.path.basename(fn)[:-6] # drop ".jinja"
67 for replacements in types:
68 output = template.render(replacements)
69 outfn2 = f"{replacements['TypeName']}{outfn}"
70 Output(rootPath, outfn2, output)
71
72 # C++ handle API (header)
73 env = Environment(
Maxwell Henderson80bec322024-01-09 15:48:44 -080074 loader=FileSystemLoader(f"{dirname}/src/generate/main/native/include"),
75 autoescape=False,
James Kuszmaulcf324122023-01-14 14:07:17 -080076 )
77 template = env.get_template("ntcore_cpp_types.h.jinja")
78 output = template.render(types=types)
79 Output(
Maxwell Henderson80bec322024-01-09 15:48:44 -080080 f"{dirname}/src/generated/main/native/include",
James Kuszmaulcf324122023-01-14 14:07:17 -080081 "ntcore_cpp_types.h",
82 output,
83 )
84
85 # C++ handle API (source)
86 env = Environment(
Maxwell Henderson80bec322024-01-09 15:48:44 -080087 loader=FileSystemLoader(f"{dirname}/src/generate/main/native/cpp"),
88 autoescape=False,
James Kuszmaulcf324122023-01-14 14:07:17 -080089 )
90 template = env.get_template("ntcore_cpp_types.cpp.jinja")
91 output = template.render(types=types)
Maxwell Henderson80bec322024-01-09 15:48:44 -080092 Output(f"{dirname}/src/generated/main/native/cpp", "ntcore_cpp_types.cpp", output)
James Kuszmaulcf324122023-01-14 14:07:17 -080093
94 # C handle API (header)
95 env = Environment(
Maxwell Henderson80bec322024-01-09 15:48:44 -080096 loader=FileSystemLoader(f"{dirname}/src/generate/main/native/include"),
97 autoescape=False,
James Kuszmaulcf324122023-01-14 14:07:17 -080098 )
99 template = env.get_template("ntcore_c_types.h.jinja")
100 output = template.render(types=types)
101 Output(
Maxwell Henderson80bec322024-01-09 15:48:44 -0800102 f"{dirname}/src/generated/main/native/include",
James Kuszmaulcf324122023-01-14 14:07:17 -0800103 "ntcore_c_types.h",
104 output,
105 )
106
107 # C handle API (source)
108 env = Environment(
Maxwell Henderson80bec322024-01-09 15:48:44 -0800109 loader=FileSystemLoader(f"{dirname}/src/generate/main/native/cpp"),
110 autoescape=False,
James Kuszmaulcf324122023-01-14 14:07:17 -0800111 )
112 template = env.get_template("ntcore_c_types.cpp.jinja")
113 output = template.render(types=types)
Maxwell Henderson80bec322024-01-09 15:48:44 -0800114 Output(f"{dirname}/src/generated/main/native/cpp", "ntcore_c_types.cpp", output)
James Kuszmaulcf324122023-01-14 14:07:17 -0800115
116 # JNI
117 env = Environment(
Maxwell Henderson80bec322024-01-09 15:48:44 -0800118 loader=FileSystemLoader(f"{dirname}/src/generate/main/native/cpp/jni"),
119 autoescape=False,
James Kuszmaulcf324122023-01-14 14:07:17 -0800120 )
121 template = env.get_template("types_jni.cpp.jinja")
122 output = template.render(types=types)
Maxwell Henderson80bec322024-01-09 15:48:44 -0800123 Output(f"{dirname}/src/generated/main/native/cpp/jni", "types_jni.cpp", output)
James Kuszmaulcf324122023-01-14 14:07:17 -0800124
125
126if __name__ == "__main__":
127 main()