xref: /aosp_15_r20/external/flatbuffers/scripts/generate_code.py (revision 890232f25432b36107d06881e0a25aaa6b473652)
1*890232f2SAndroid Build Coastguard Worker#!/usr/bin/env python3
2*890232f2SAndroid Build Coastguard Worker#
3*890232f2SAndroid Build Coastguard Worker# Copyright 2021 Google Inc. All rights reserved.
4*890232f2SAndroid Build Coastguard Worker#
5*890232f2SAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License");
6*890232f2SAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
7*890232f2SAndroid Build Coastguard Worker# You may obtain a copy of the License at
8*890232f2SAndroid Build Coastguard Worker#
9*890232f2SAndroid Build Coastguard Worker#     http://www.apache.org/licenses/LICENSE-2.0
10*890232f2SAndroid Build Coastguard Worker#
11*890232f2SAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
12*890232f2SAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS,
13*890232f2SAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*890232f2SAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
15*890232f2SAndroid Build Coastguard Worker# limitations under the License.
16*890232f2SAndroid Build Coastguard Worker
17*890232f2SAndroid Build Coastguard Workerimport argparse
18*890232f2SAndroid Build Coastguard Workerimport filecmp
19*890232f2SAndroid Build Coastguard Workerimport glob
20*890232f2SAndroid Build Coastguard Workerimport platform
21*890232f2SAndroid Build Coastguard Workerimport shutil
22*890232f2SAndroid Build Coastguard Workerimport subprocess
23*890232f2SAndroid Build Coastguard Workerimport generate_grpc_examples
24*890232f2SAndroid Build Coastguard Workerfrom pathlib import Path
25*890232f2SAndroid Build Coastguard Worker
26*890232f2SAndroid Build Coastguard Workerparser = argparse.ArgumentParser()
27*890232f2SAndroid Build Coastguard Workerparser.add_argument(
28*890232f2SAndroid Build Coastguard Worker    "--flatc",
29*890232f2SAndroid Build Coastguard Worker    help="path of the Flat C compiler relative to the root directory",
30*890232f2SAndroid Build Coastguard Worker)
31*890232f2SAndroid Build Coastguard Workerparser.add_argument("--cpp-0x", action="store_true", help="use --cpp-std c++ox")
32*890232f2SAndroid Build Coastguard Workerparser.add_argument(
33*890232f2SAndroid Build Coastguard Worker    "--skip-monster-extra",
34*890232f2SAndroid Build Coastguard Worker    action="store_true",
35*890232f2SAndroid Build Coastguard Worker    help="skip generating tests involving monster_extra.fbs",
36*890232f2SAndroid Build Coastguard Worker)
37*890232f2SAndroid Build Coastguard Workerparser.add_argument(
38*890232f2SAndroid Build Coastguard Worker    "--skip-gen-reflection",
39*890232f2SAndroid Build Coastguard Worker    action="store_true",
40*890232f2SAndroid Build Coastguard Worker    help="skip generating the reflection.fbs files",
41*890232f2SAndroid Build Coastguard Worker)
42*890232f2SAndroid Build Coastguard Workerargs = parser.parse_args()
43*890232f2SAndroid Build Coastguard Worker
44*890232f2SAndroid Build Coastguard Worker# Get the path where this script is located so we can invoke the script from
45*890232f2SAndroid Build Coastguard Worker# any directory and have the paths work correctly.
46*890232f2SAndroid Build Coastguard Workerscript_path = Path(__file__).parent.resolve()
47*890232f2SAndroid Build Coastguard Worker
48*890232f2SAndroid Build Coastguard Worker# Get the root path as an absolute path, so all derived paths are absolute.
49*890232f2SAndroid Build Coastguard Workerroot_path = script_path.parent.absolute()
50*890232f2SAndroid Build Coastguard Worker
51*890232f2SAndroid Build Coastguard Worker# Get the location of the flatc executable, reading from the first command line
52*890232f2SAndroid Build Coastguard Worker# argument or defaulting to default names.
53*890232f2SAndroid Build Coastguard Workerflatc_exe = Path(
54*890232f2SAndroid Build Coastguard Worker    ("flatc" if not platform.system() == "Windows" else "flatc.exe")
55*890232f2SAndroid Build Coastguard Worker    if not args.flatc
56*890232f2SAndroid Build Coastguard Worker    else args.flatc
57*890232f2SAndroid Build Coastguard Worker)
58*890232f2SAndroid Build Coastguard Worker
59*890232f2SAndroid Build Coastguard Worker# Find and assert flatc compiler is present.
60*890232f2SAndroid Build Coastguard Workerif root_path in flatc_exe.parents:
61*890232f2SAndroid Build Coastguard Worker    flatc_exe = flatc_exe.relative_to(root_path)
62*890232f2SAndroid Build Coastguard Workerflatc_path = Path(root_path, flatc_exe)
63*890232f2SAndroid Build Coastguard Workerassert flatc_path.exists(), "Cannot find the flatc compiler " + str(flatc_path)
64*890232f2SAndroid Build Coastguard Worker
65*890232f2SAndroid Build Coastguard Worker# Specify the other paths that will be referenced
66*890232f2SAndroid Build Coastguard Workertests_path = Path(root_path, "tests")
67*890232f2SAndroid Build Coastguard Workerswift_code_gen = Path(root_path, "tests/FlatBuffers.Test.Swift/CodeGenerationTests")
68*890232f2SAndroid Build Coastguard Workersamples_path = Path(root_path, "samples")
69*890232f2SAndroid Build Coastguard Workerreflection_path = Path(root_path, "reflection")
70*890232f2SAndroid Build Coastguard Worker
71*890232f2SAndroid Build Coastguard Worker# Execute the flatc compiler with the specified parameters
72*890232f2SAndroid Build Coastguard Workerdef flatc(options, schema, prefix=None, include=None, data=None, cwd=tests_path):
73*890232f2SAndroid Build Coastguard Worker    cmd = [str(flatc_path)] + options
74*890232f2SAndroid Build Coastguard Worker    if prefix:
75*890232f2SAndroid Build Coastguard Worker        cmd += ["-o"] + [prefix]
76*890232f2SAndroid Build Coastguard Worker    if include:
77*890232f2SAndroid Build Coastguard Worker        cmd += ["-I"] + [include]
78*890232f2SAndroid Build Coastguard Worker    cmd += [schema] if isinstance(schema, str) else schema
79*890232f2SAndroid Build Coastguard Worker    if data:
80*890232f2SAndroid Build Coastguard Worker        cmd += [data] if isinstance(data, str) else data
81*890232f2SAndroid Build Coastguard Worker    result = subprocess.run(cmd, cwd=str(cwd), check=True)
82*890232f2SAndroid Build Coastguard Worker
83*890232f2SAndroid Build Coastguard Worker
84*890232f2SAndroid Build Coastguard Worker# Generate the code for flatbuffers reflection schema
85*890232f2SAndroid Build Coastguard Workerdef flatc_reflection(options, location, target):
86*890232f2SAndroid Build Coastguard Worker    full_options = ["--no-prefix"] + options
87*890232f2SAndroid Build Coastguard Worker    temp_dir = ".tmp"
88*890232f2SAndroid Build Coastguard Worker    flatc(
89*890232f2SAndroid Build Coastguard Worker        full_options,
90*890232f2SAndroid Build Coastguard Worker        prefix=temp_dir,
91*890232f2SAndroid Build Coastguard Worker        schema="reflection.fbs",
92*890232f2SAndroid Build Coastguard Worker        cwd=reflection_path,
93*890232f2SAndroid Build Coastguard Worker    )
94*890232f2SAndroid Build Coastguard Worker    new_reflection_path = Path(reflection_path, temp_dir, target)
95*890232f2SAndroid Build Coastguard Worker    original_reflection_path = Path(root_path, location, target)
96*890232f2SAndroid Build Coastguard Worker    if not filecmp.cmp(str(new_reflection_path), str(original_reflection_path)):
97*890232f2SAndroid Build Coastguard Worker        shutil.rmtree(str(original_reflection_path), ignore_errors=True)
98*890232f2SAndroid Build Coastguard Worker        shutil.move(str(new_reflection_path), str(original_reflection_path))
99*890232f2SAndroid Build Coastguard Worker    shutil.rmtree(str(Path(reflection_path, temp_dir)))
100*890232f2SAndroid Build Coastguard Worker
101*890232f2SAndroid Build Coastguard Workerdef flatc_annotate(schema, file, include=None, cwd=tests_path):
102*890232f2SAndroid Build Coastguard Worker    cmd = [str(flatc_path)]
103*890232f2SAndroid Build Coastguard Worker    if include:
104*890232f2SAndroid Build Coastguard Worker        cmd += ["-I"] + [include]
105*890232f2SAndroid Build Coastguard Worker    cmd += ["--annotate", schema, file]
106*890232f2SAndroid Build Coastguard Worker    result = subprocess.run(cmd, cwd=str(cwd), check=True)
107*890232f2SAndroid Build Coastguard Worker
108*890232f2SAndroid Build Coastguard Worker# Glob a pattern relative to file path
109*890232f2SAndroid Build Coastguard Workerdef glob(path, pattern):
110*890232f2SAndroid Build Coastguard Worker    return [str(p) for p in path.glob(pattern)]
111*890232f2SAndroid Build Coastguard Worker
112*890232f2SAndroid Build Coastguard Worker
113*890232f2SAndroid Build Coastguard Worker# flatc options that are shared
114*890232f2SAndroid Build Coastguard WorkerBASE_OPTS = ["--reflect-names", "--gen-mutable", "--gen-object-api"]
115*890232f2SAndroid Build Coastguard WorkerNO_INCL_OPTS = BASE_OPTS + ["--no-includes"]
116*890232f2SAndroid Build Coastguard Worker
117*890232f2SAndroid Build Coastguard Worker# Language specific options
118*890232f2SAndroid Build Coastguard WorkerCS_OPTS = ["--csharp", "--cs-gen-json-serializer"]
119*890232f2SAndroid Build Coastguard WorkerCPP_OPTS = [
120*890232f2SAndroid Build Coastguard Worker    "--cpp",
121*890232f2SAndroid Build Coastguard Worker    "--gen-compare",
122*890232f2SAndroid Build Coastguard Worker    "--cpp-ptr-type",
123*890232f2SAndroid Build Coastguard Worker    "flatbuffers::unique_ptr",
124*890232f2SAndroid Build Coastguard Worker] + (["--cpp-std", "c++0x"] if args.cpp_0x else [])
125*890232f2SAndroid Build Coastguard Worker
126*890232f2SAndroid Build Coastguard WorkerCPP_17_OPTS = NO_INCL_OPTS + [
127*890232f2SAndroid Build Coastguard Worker    "--cpp",
128*890232f2SAndroid Build Coastguard Worker    "--cpp-std",
129*890232f2SAndroid Build Coastguard Worker    "c++17",
130*890232f2SAndroid Build Coastguard Worker    "--cpp-static-reflection",
131*890232f2SAndroid Build Coastguard Worker    "--gen-object-api",
132*890232f2SAndroid Build Coastguard Worker]
133*890232f2SAndroid Build Coastguard WorkerRUST_OPTS = BASE_OPTS + [
134*890232f2SAndroid Build Coastguard Worker    "--rust",
135*890232f2SAndroid Build Coastguard Worker    "--gen-all",
136*890232f2SAndroid Build Coastguard Worker    "--gen-name-strings",
137*890232f2SAndroid Build Coastguard Worker    "--rust-module-root-file",
138*890232f2SAndroid Build Coastguard Worker]
139*890232f2SAndroid Build Coastguard WorkerRUST_SERIALIZE_OPTS = BASE_OPTS + [
140*890232f2SAndroid Build Coastguard Worker    "--rust",
141*890232f2SAndroid Build Coastguard Worker    "--gen-all",
142*890232f2SAndroid Build Coastguard Worker    "--gen-name-strings",
143*890232f2SAndroid Build Coastguard Worker    "--rust-serialize",
144*890232f2SAndroid Build Coastguard Worker    "--rust-module-root-file",
145*890232f2SAndroid Build Coastguard Worker]
146*890232f2SAndroid Build Coastguard WorkerTS_OPTS = ["--ts", "--gen-name-strings"]
147*890232f2SAndroid Build Coastguard WorkerLOBSTER_OPTS = ["--lobster"]
148*890232f2SAndroid Build Coastguard WorkerSWIFT_OPTS = ["--swift", "--gen-json-emit", "--bfbs-filenames", str(tests_path)]
149*890232f2SAndroid Build Coastguard WorkerSWIFT_OPTS_CODE_GEN = [
150*890232f2SAndroid Build Coastguard Worker    "--swift",
151*890232f2SAndroid Build Coastguard Worker    "--gen-json-emit",
152*890232f2SAndroid Build Coastguard Worker    "--bfbs-filenames",
153*890232f2SAndroid Build Coastguard Worker    swift_code_gen
154*890232f2SAndroid Build Coastguard Worker]
155*890232f2SAndroid Build Coastguard WorkerJAVA_OPTS = ["--java"]
156*890232f2SAndroid Build Coastguard WorkerKOTLIN_OPTS = ["--kotlin"]
157*890232f2SAndroid Build Coastguard WorkerPHP_OPTS = ["--php"]
158*890232f2SAndroid Build Coastguard WorkerDART_OPTS = ["--dart"]
159*890232f2SAndroid Build Coastguard WorkerPYTHON_OPTS = ["--python"]
160*890232f2SAndroid Build Coastguard WorkerBINARY_OPTS = ["-b", "--schema", "--bfbs-comments", "--bfbs-builtins"]
161*890232f2SAndroid Build Coastguard Worker
162*890232f2SAndroid Build Coastguard Worker# Basic Usage
163*890232f2SAndroid Build Coastguard Worker
164*890232f2SAndroid Build Coastguard Workerflatc(
165*890232f2SAndroid Build Coastguard Worker    NO_INCL_OPTS
166*890232f2SAndroid Build Coastguard Worker    + CPP_OPTS
167*890232f2SAndroid Build Coastguard Worker    + CS_OPTS
168*890232f2SAndroid Build Coastguard Worker    + TS_OPTS
169*890232f2SAndroid Build Coastguard Worker    + [
170*890232f2SAndroid Build Coastguard Worker        "--binary",
171*890232f2SAndroid Build Coastguard Worker        "--java",
172*890232f2SAndroid Build Coastguard Worker        "--kotlin",
173*890232f2SAndroid Build Coastguard Worker        "--dart",
174*890232f2SAndroid Build Coastguard Worker        "--go",
175*890232f2SAndroid Build Coastguard Worker        "--lobster",
176*890232f2SAndroid Build Coastguard Worker        "--php",
177*890232f2SAndroid Build Coastguard Worker    ],
178*890232f2SAndroid Build Coastguard Worker    schema="monster_test.fbs",
179*890232f2SAndroid Build Coastguard Worker    include="include_test",
180*890232f2SAndroid Build Coastguard Worker    data="monsterdata_test.json",
181*890232f2SAndroid Build Coastguard Worker)
182*890232f2SAndroid Build Coastguard Worker
183*890232f2SAndroid Build Coastguard Workerflatc(
184*890232f2SAndroid Build Coastguard Worker    ["--lua", "--bfbs-filenames", str(tests_path)],
185*890232f2SAndroid Build Coastguard Worker    schema="monster_test.fbs",
186*890232f2SAndroid Build Coastguard Worker    include="include_test",
187*890232f2SAndroid Build Coastguard Worker)
188*890232f2SAndroid Build Coastguard Worker
189*890232f2SAndroid Build Coastguard Workerflatc(
190*890232f2SAndroid Build Coastguard Worker    NO_INCL_OPTS + CPP_OPTS + ["--grpc"],
191*890232f2SAndroid Build Coastguard Worker    schema="monster_test.fbs",
192*890232f2SAndroid Build Coastguard Worker    include="include_test",
193*890232f2SAndroid Build Coastguard Worker    data="monsterdata_test.json",
194*890232f2SAndroid Build Coastguard Worker)
195*890232f2SAndroid Build Coastguard Worker
196*890232f2SAndroid Build Coastguard Workerflatc(
197*890232f2SAndroid Build Coastguard Worker    RUST_OPTS,
198*890232f2SAndroid Build Coastguard Worker    schema="monster_test.fbs",
199*890232f2SAndroid Build Coastguard Worker    include="include_test",
200*890232f2SAndroid Build Coastguard Worker    prefix="monster_test",
201*890232f2SAndroid Build Coastguard Worker    data="monsterdata_test.json",
202*890232f2SAndroid Build Coastguard Worker)
203*890232f2SAndroid Build Coastguard Worker
204*890232f2SAndroid Build Coastguard Workerflatc(
205*890232f2SAndroid Build Coastguard Worker    RUST_SERIALIZE_OPTS,
206*890232f2SAndroid Build Coastguard Worker    schema="monster_test.fbs",
207*890232f2SAndroid Build Coastguard Worker    include="include_test",
208*890232f2SAndroid Build Coastguard Worker    prefix="monster_test_serialize",
209*890232f2SAndroid Build Coastguard Worker    data="monsterdata_test.json",
210*890232f2SAndroid Build Coastguard Worker)
211*890232f2SAndroid Build Coastguard Worker
212*890232f2SAndroid Build Coastguard Workerflatc(
213*890232f2SAndroid Build Coastguard Worker    options=BASE_OPTS + ["--python"],
214*890232f2SAndroid Build Coastguard Worker    schema="monster_test.fbs",
215*890232f2SAndroid Build Coastguard Worker    include="include_test",
216*890232f2SAndroid Build Coastguard Worker    data="monsterdata_test.json",
217*890232f2SAndroid Build Coastguard Worker)
218*890232f2SAndroid Build Coastguard Worker
219*890232f2SAndroid Build Coastguard Workerflatc(
220*890232f2SAndroid Build Coastguard Worker    options=BASE_OPTS + ["--python", "--gen-onefile"],
221*890232f2SAndroid Build Coastguard Worker    schema="monster_test.fbs",
222*890232f2SAndroid Build Coastguard Worker    include="include_test",
223*890232f2SAndroid Build Coastguard Worker    data="monsterdata_test.json",
224*890232f2SAndroid Build Coastguard Worker)
225*890232f2SAndroid Build Coastguard Worker
226*890232f2SAndroid Build Coastguard Worker# For Rust we currently generate two independent schemas, with namespace_test2
227*890232f2SAndroid Build Coastguard Worker# duplicating the types in namespace_test1
228*890232f2SAndroid Build Coastguard Workerflatc(
229*890232f2SAndroid Build Coastguard Worker    RUST_OPTS,
230*890232f2SAndroid Build Coastguard Worker    prefix="namespace_test",
231*890232f2SAndroid Build Coastguard Worker    schema=[
232*890232f2SAndroid Build Coastguard Worker        "namespace_test/namespace_test1.fbs",
233*890232f2SAndroid Build Coastguard Worker        "namespace_test/namespace_test2.fbs",
234*890232f2SAndroid Build Coastguard Worker    ],
235*890232f2SAndroid Build Coastguard Worker)
236*890232f2SAndroid Build Coastguard Worker
237*890232f2SAndroid Build Coastguard Workerflatc(
238*890232f2SAndroid Build Coastguard Worker    BASE_OPTS + CPP_OPTS + CS_OPTS + TS_OPTS + JAVA_OPTS + KOTLIN_OPTS + PHP_OPTS,
239*890232f2SAndroid Build Coastguard Worker    prefix="union_vector",
240*890232f2SAndroid Build Coastguard Worker    schema="union_vector/union_vector.fbs",
241*890232f2SAndroid Build Coastguard Worker)
242*890232f2SAndroid Build Coastguard Worker
243*890232f2SAndroid Build Coastguard Workerflatc(
244*890232f2SAndroid Build Coastguard Worker    BASE_OPTS + TS_OPTS + ["--gen-name-strings", "--gen-mutable"],
245*890232f2SAndroid Build Coastguard Worker    include="include_test",
246*890232f2SAndroid Build Coastguard Worker    schema="monster_test.fbs",
247*890232f2SAndroid Build Coastguard Worker)
248*890232f2SAndroid Build Coastguard Worker
249*890232f2SAndroid Build Coastguard Worker# Generate the complete flat file TS of monster.
250*890232f2SAndroid Build Coastguard Workerflatc(
251*890232f2SAndroid Build Coastguard Worker    ["--ts", "--gen-all", "--ts-flat-files"],
252*890232f2SAndroid Build Coastguard Worker    include="include_test",
253*890232f2SAndroid Build Coastguard Worker    schema="monster_test.fbs",
254*890232f2SAndroid Build Coastguard Worker    prefix="ts/ts-flat-files"
255*890232f2SAndroid Build Coastguard Worker)
256*890232f2SAndroid Build Coastguard Worker
257*890232f2SAndroid Build Coastguard Workerflatc(
258*890232f2SAndroid Build Coastguard Worker    BASE_OPTS + TS_OPTS + ["-b"],
259*890232f2SAndroid Build Coastguard Worker    include="include_test",
260*890232f2SAndroid Build Coastguard Worker    schema="monster_test.fbs",
261*890232f2SAndroid Build Coastguard Worker    data="unicode_test.json",
262*890232f2SAndroid Build Coastguard Worker)
263*890232f2SAndroid Build Coastguard Worker
264*890232f2SAndroid Build Coastguard Workerflatc(
265*890232f2SAndroid Build Coastguard Worker    BASE_OPTS + TS_OPTS + ["--gen-name-strings"],
266*890232f2SAndroid Build Coastguard Worker    prefix="union_vector",
267*890232f2SAndroid Build Coastguard Worker    schema="union_vector/union_vector.fbs",
268*890232f2SAndroid Build Coastguard Worker)
269*890232f2SAndroid Build Coastguard Worker
270*890232f2SAndroid Build Coastguard Workerflatc(
271*890232f2SAndroid Build Coastguard Worker    RUST_OPTS,
272*890232f2SAndroid Build Coastguard Worker    prefix="include_test1",
273*890232f2SAndroid Build Coastguard Worker    include="include_test",
274*890232f2SAndroid Build Coastguard Worker    schema="include_test/include_test1.fbs",
275*890232f2SAndroid Build Coastguard Worker)
276*890232f2SAndroid Build Coastguard Worker
277*890232f2SAndroid Build Coastguard Workerflatc(
278*890232f2SAndroid Build Coastguard Worker    RUST_OPTS,
279*890232f2SAndroid Build Coastguard Worker    prefix="include_test2",
280*890232f2SAndroid Build Coastguard Worker    include="include_test",
281*890232f2SAndroid Build Coastguard Worker    schema="include_test/sub/include_test2.fbs",
282*890232f2SAndroid Build Coastguard Worker)
283*890232f2SAndroid Build Coastguard Worker
284*890232f2SAndroid Build Coastguard Workerflatc(
285*890232f2SAndroid Build Coastguard Worker    BINARY_OPTS + ["--bfbs-filenames", str(tests_path)],
286*890232f2SAndroid Build Coastguard Worker    include="include_test",
287*890232f2SAndroid Build Coastguard Worker    schema="monster_test.fbs",
288*890232f2SAndroid Build Coastguard Worker)
289*890232f2SAndroid Build Coastguard Worker
290*890232f2SAndroid Build Coastguard Worker# Generate the annotated binary of the monster_test binary schema.
291*890232f2SAndroid Build Coastguard Workerflatc_annotate(
292*890232f2SAndroid Build Coastguard Worker    schema="../reflection/reflection.fbs",
293*890232f2SAndroid Build Coastguard Worker    file="monster_test.bfbs",
294*890232f2SAndroid Build Coastguard Worker    include="include_test"
295*890232f2SAndroid Build Coastguard Worker)
296*890232f2SAndroid Build Coastguard Worker
297*890232f2SAndroid Build Coastguard Workerflatc_annotate(
298*890232f2SAndroid Build Coastguard Worker    schema="monster_test.fbs",
299*890232f2SAndroid Build Coastguard Worker    file="monsterdata_test.mon",
300*890232f2SAndroid Build Coastguard Worker    include="include_test"
301*890232f2SAndroid Build Coastguard Worker)
302*890232f2SAndroid Build Coastguard Worker
303*890232f2SAndroid Build Coastguard Workerflatc(
304*890232f2SAndroid Build Coastguard Worker    CPP_OPTS
305*890232f2SAndroid Build Coastguard Worker    + NO_INCL_OPTS
306*890232f2SAndroid Build Coastguard Worker    + [
307*890232f2SAndroid Build Coastguard Worker        "--bfbs-comments",
308*890232f2SAndroid Build Coastguard Worker        "--bfbs-builtins",
309*890232f2SAndroid Build Coastguard Worker        "--bfbs-gen-embed",
310*890232f2SAndroid Build Coastguard Worker        "--bfbs-filenames",
311*890232f2SAndroid Build Coastguard Worker        str(tests_path),
312*890232f2SAndroid Build Coastguard Worker    ],
313*890232f2SAndroid Build Coastguard Worker    include="include_test",
314*890232f2SAndroid Build Coastguard Worker    schema="monster_test.fbs",
315*890232f2SAndroid Build Coastguard Worker)
316*890232f2SAndroid Build Coastguard Worker
317*890232f2SAndroid Build Coastguard Workerflatc(
318*890232f2SAndroid Build Coastguard Worker    BINARY_OPTS + ["--bfbs-filenames", str(tests_path)],
319*890232f2SAndroid Build Coastguard Worker    include="include_test",
320*890232f2SAndroid Build Coastguard Worker    schema="arrays_test.fbs",
321*890232f2SAndroid Build Coastguard Worker)
322*890232f2SAndroid Build Coastguard Worker
323*890232f2SAndroid Build Coastguard Workerflatc(
324*890232f2SAndroid Build Coastguard Worker    ["--jsonschema", "--schema"],
325*890232f2SAndroid Build Coastguard Worker    include="include_test",
326*890232f2SAndroid Build Coastguard Worker    schema="monster_test.fbs",
327*890232f2SAndroid Build Coastguard Worker)
328*890232f2SAndroid Build Coastguard Worker
329*890232f2SAndroid Build Coastguard Workerif not args.skip_monster_extra:
330*890232f2SAndroid Build Coastguard Worker    flatc(
331*890232f2SAndroid Build Coastguard Worker        CPP_OPTS + CS_OPTS + NO_INCL_OPTS + JAVA_OPTS + KOTLIN_OPTS + PYTHON_OPTS,
332*890232f2SAndroid Build Coastguard Worker        schema="monster_extra.fbs",
333*890232f2SAndroid Build Coastguard Worker        data="monsterdata_extra.json",
334*890232f2SAndroid Build Coastguard Worker    )
335*890232f2SAndroid Build Coastguard Worker
336*890232f2SAndroid Build Coastguard Worker    flatc(
337*890232f2SAndroid Build Coastguard Worker        DART_OPTS + ["--gen-object-api"],
338*890232f2SAndroid Build Coastguard Worker        schema="monster_extra.fbs",
339*890232f2SAndroid Build Coastguard Worker    )
340*890232f2SAndroid Build Coastguard Worker
341*890232f2SAndroid Build Coastguard Workerflatc(
342*890232f2SAndroid Build Coastguard Worker    CPP_OPTS + CS_OPTS + NO_INCL_OPTS + JAVA_OPTS + ["--jsonschema", "--scoped-enums"],
343*890232f2SAndroid Build Coastguard Worker    schema="arrays_test.fbs",
344*890232f2SAndroid Build Coastguard Worker)
345*890232f2SAndroid Build Coastguard Worker
346*890232f2SAndroid Build Coastguard Workerflatc(
347*890232f2SAndroid Build Coastguard Worker    RUST_OPTS,
348*890232f2SAndroid Build Coastguard Worker    prefix="arrays_test",
349*890232f2SAndroid Build Coastguard Worker    schema="arrays_test.fbs",
350*890232f2SAndroid Build Coastguard Worker)
351*890232f2SAndroid Build Coastguard Worker
352*890232f2SAndroid Build Coastguard Workerflatc(
353*890232f2SAndroid Build Coastguard Worker    BASE_OPTS + PYTHON_OPTS,
354*890232f2SAndroid Build Coastguard Worker    schema="arrays_test.fbs",
355*890232f2SAndroid Build Coastguard Worker)
356*890232f2SAndroid Build Coastguard Worker
357*890232f2SAndroid Build Coastguard Worker
358*890232f2SAndroid Build Coastguard Worker# Optional Scalars
359*890232f2SAndroid Build Coastguard Workeroptional_scalars_schema = "optional_scalars.fbs"
360*890232f2SAndroid Build Coastguard Workerflatc(["--java", "--kotlin", "--lobster", "--ts"], schema=optional_scalars_schema)
361*890232f2SAndroid Build Coastguard Worker
362*890232f2SAndroid Build Coastguard Workerflatc(["--csharp", "--python", "--gen-object-api"], schema=optional_scalars_schema)
363*890232f2SAndroid Build Coastguard Worker
364*890232f2SAndroid Build Coastguard Workerflatc(RUST_OPTS, prefix="optional_scalars", schema=optional_scalars_schema)
365*890232f2SAndroid Build Coastguard Worker
366*890232f2SAndroid Build Coastguard Workerflatc(NO_INCL_OPTS + CPP_OPTS, schema=optional_scalars_schema)
367*890232f2SAndroid Build Coastguard Worker
368*890232f2SAndroid Build Coastguard Worker# Type / field collsion
369*890232f2SAndroid Build Coastguard Workertype_field_collsion_schema = "type_field_collsion.fbs"
370*890232f2SAndroid Build Coastguard Worker
371*890232f2SAndroid Build Coastguard Workerflatc(["--csharp", "--gen-object-api"], schema=type_field_collsion_schema)
372*890232f2SAndroid Build Coastguard Worker
373*890232f2SAndroid Build Coastguard Worker# Generate string/vector default code for tests
374*890232f2SAndroid Build Coastguard Workerflatc(RUST_OPTS, prefix="more_defaults", schema="more_defaults.fbs")
375*890232f2SAndroid Build Coastguard Worker
376*890232f2SAndroid Build Coastguard Worker# Generate the schema evolution tests
377*890232f2SAndroid Build Coastguard Workerflatc(
378*890232f2SAndroid Build Coastguard Worker    CPP_OPTS + ["--scoped-enums"],
379*890232f2SAndroid Build Coastguard Worker    prefix="evolution_test",
380*890232f2SAndroid Build Coastguard Worker    schema=glob(tests_path, "evolution_test/evolution_v*.fbs"),
381*890232f2SAndroid Build Coastguard Worker)
382*890232f2SAndroid Build Coastguard Worker
383*890232f2SAndroid Build Coastguard Worker# Generate the keywords tests
384*890232f2SAndroid Build Coastguard Workerflatc(BASE_OPTS + CS_OPTS, schema="keyword_test.fbs")
385*890232f2SAndroid Build Coastguard Workerflatc(RUST_OPTS, prefix="keyword_test", schema="keyword_test.fbs")
386*890232f2SAndroid Build Coastguard Workerflatc(
387*890232f2SAndroid Build Coastguard Worker    BASE_OPTS + CS_OPTS + ["--cs-global-alias", "--gen-onefile"],
388*890232f2SAndroid Build Coastguard Worker    prefix="nested_namespace_test",
389*890232f2SAndroid Build Coastguard Worker    schema=glob(tests_path, "nested_namespace_test/nested_namespace_test*.fbs"),
390*890232f2SAndroid Build Coastguard Worker)
391*890232f2SAndroid Build Coastguard Workerflatc(BASE_OPTS + DART_OPTS, prefix="../dart/test/", schema="keyword_test.fbs")
392*890232f2SAndroid Build Coastguard Worker
393*890232f2SAndroid Build Coastguard Worker# Field key lookup with default value test
394*890232f2SAndroid Build Coastguard Workerdictionary_lookup_schema = "dictionary_lookup.fbs"
395*890232f2SAndroid Build Coastguard Workerflatc(["--java", "--kotlin"], schema=dictionary_lookup_schema)
396*890232f2SAndroid Build Coastguard Worker
397*890232f2SAndroid Build Coastguard Worker# Swift Tests
398*890232f2SAndroid Build Coastguard Workerswift_prefix = "FlatBuffers.Test.Swift/Tests/FlatBuffers.Test.SwiftTests"
399*890232f2SAndroid Build Coastguard Workerflatc(
400*890232f2SAndroid Build Coastguard Worker    SWIFT_OPTS + BASE_OPTS + ["--grpc"],
401*890232f2SAndroid Build Coastguard Worker    schema="monster_test.fbs",
402*890232f2SAndroid Build Coastguard Worker    include="include_test",
403*890232f2SAndroid Build Coastguard Worker    prefix=swift_prefix,
404*890232f2SAndroid Build Coastguard Worker)
405*890232f2SAndroid Build Coastguard Workerflatc(
406*890232f2SAndroid Build Coastguard Worker    SWIFT_OPTS + BASE_OPTS,
407*890232f2SAndroid Build Coastguard Worker    schema="union_vector/union_vector.fbs",
408*890232f2SAndroid Build Coastguard Worker    prefix=swift_prefix,
409*890232f2SAndroid Build Coastguard Worker)
410*890232f2SAndroid Build Coastguard Workerflatc(SWIFT_OPTS, schema="optional_scalars.fbs", prefix=swift_prefix)
411*890232f2SAndroid Build Coastguard Workerflatc(SWIFT_OPTS, schema="vector_has_test.fbs", prefix=swift_prefix)
412*890232f2SAndroid Build Coastguard Workerflatc(
413*890232f2SAndroid Build Coastguard Worker    SWIFT_OPTS + ["--gen-object-api"],
414*890232f2SAndroid Build Coastguard Worker    schema="more_defaults.fbs",
415*890232f2SAndroid Build Coastguard Worker    prefix=swift_prefix,
416*890232f2SAndroid Build Coastguard Worker)
417*890232f2SAndroid Build Coastguard Workerflatc(
418*890232f2SAndroid Build Coastguard Worker    SWIFT_OPTS + BASE_OPTS,
419*890232f2SAndroid Build Coastguard Worker    schema="MutatingBool.fbs",
420*890232f2SAndroid Build Coastguard Worker    prefix=swift_prefix,
421*890232f2SAndroid Build Coastguard Worker)
422*890232f2SAndroid Build Coastguard Worker
423*890232f2SAndroid Build Coastguard Workerflatc(
424*890232f2SAndroid Build Coastguard Worker    SWIFT_OPTS_CODE_GEN + BASE_OPTS + ["--grpc", "--swift-implementation-only"],
425*890232f2SAndroid Build Coastguard Worker    schema="test_import.fbs",
426*890232f2SAndroid Build Coastguard Worker    cwd=swift_code_gen
427*890232f2SAndroid Build Coastguard Worker)
428*890232f2SAndroid Build Coastguard Worker
429*890232f2SAndroid Build Coastguard Workerflatc(
430*890232f2SAndroid Build Coastguard Worker    SWIFT_OPTS_CODE_GEN + NO_INCL_OPTS + ["--grpc"],
431*890232f2SAndroid Build Coastguard Worker    schema="test_no_include.fbs",
432*890232f2SAndroid Build Coastguard Worker    cwd=swift_code_gen
433*890232f2SAndroid Build Coastguard Worker)
434*890232f2SAndroid Build Coastguard Worker
435*890232f2SAndroid Build Coastguard Worker# --filename-suffix and --filename-ext tests
436*890232f2SAndroid Build Coastguard Workerflatc(
437*890232f2SAndroid Build Coastguard Worker    CPP_OPTS + NO_INCL_OPTS + ["--grpc", "--filename-ext", "hpp"],
438*890232f2SAndroid Build Coastguard Worker    include="include_test",
439*890232f2SAndroid Build Coastguard Worker    prefix="monster_test_suffix/ext_only",
440*890232f2SAndroid Build Coastguard Worker    schema="monster_test.fbs",
441*890232f2SAndroid Build Coastguard Worker)
442*890232f2SAndroid Build Coastguard Workerflatc(
443*890232f2SAndroid Build Coastguard Worker    CPP_OPTS + NO_INCL_OPTS + ["--grpc", "--filename-suffix", "_suffix"],
444*890232f2SAndroid Build Coastguard Worker    include="include_test",
445*890232f2SAndroid Build Coastguard Worker    prefix="monster_test_suffix/filesuffix_only",
446*890232f2SAndroid Build Coastguard Worker    schema="monster_test.fbs",
447*890232f2SAndroid Build Coastguard Worker)
448*890232f2SAndroid Build Coastguard Workerflatc(
449*890232f2SAndroid Build Coastguard Worker    CPP_OPTS + NO_INCL_OPTS + ["--grpc", "--filename-suffix", "_suffix", "--filename-ext", "hpp"],
450*890232f2SAndroid Build Coastguard Worker    include="include_test",
451*890232f2SAndroid Build Coastguard Worker    prefix="monster_test_suffix",
452*890232f2SAndroid Build Coastguard Worker    schema="monster_test.fbs",
453*890232f2SAndroid Build Coastguard Worker)
454*890232f2SAndroid Build Coastguard Worker
455*890232f2SAndroid Build Coastguard Worker# Flag c++17 requires Clang6, GCC7, MSVC2017 (_MSC_VER >= 1914) or higher.
456*890232f2SAndroid Build Coastguard Workercpp_17_prefix = "cpp17/generated_cpp17"
457*890232f2SAndroid Build Coastguard Workerflatc(
458*890232f2SAndroid Build Coastguard Worker    CPP_17_OPTS,
459*890232f2SAndroid Build Coastguard Worker    schema="monster_test.fbs",
460*890232f2SAndroid Build Coastguard Worker    include="include_test",
461*890232f2SAndroid Build Coastguard Worker    prefix=cpp_17_prefix,
462*890232f2SAndroid Build Coastguard Worker)
463*890232f2SAndroid Build Coastguard Workerflatc(
464*890232f2SAndroid Build Coastguard Worker    CPP_17_OPTS,
465*890232f2SAndroid Build Coastguard Worker    schema="optional_scalars.fbs",
466*890232f2SAndroid Build Coastguard Worker    prefix=cpp_17_prefix,
467*890232f2SAndroid Build Coastguard Worker)
468*890232f2SAndroid Build Coastguard Workerflatc(
469*890232f2SAndroid Build Coastguard Worker    CPP_17_OPTS,
470*890232f2SAndroid Build Coastguard Worker    schema="union_vector/union_vector.fbs",
471*890232f2SAndroid Build Coastguard Worker    prefix=cpp_17_prefix,
472*890232f2SAndroid Build Coastguard Worker)
473*890232f2SAndroid Build Coastguard Worker
474*890232f2SAndroid Build Coastguard Worker# Private annotations
475*890232f2SAndroid Build Coastguard Workerannotations_test_schema = "private_annotation_test.fbs"
476*890232f2SAndroid Build Coastguard Worker
477*890232f2SAndroid Build Coastguard Workerflatc(RUST_OPTS + ["--no-leak-private-annotation", "--gen-object-api"], prefix="private_annotation_test", schema=annotations_test_schema)
478*890232f2SAndroid Build Coastguard Worker
479*890232f2SAndroid Build Coastguard Worker# Sample files
480*890232f2SAndroid Build Coastguard Workersamples_schema = "monster.fbs"
481*890232f2SAndroid Build Coastguard Workerflatc(BASE_OPTS + CPP_OPTS + LOBSTER_OPTS, schema=samples_schema, cwd=samples_path)
482*890232f2SAndroid Build Coastguard Workerflatc(RUST_OPTS, prefix="rust_generated", schema=samples_schema, cwd=samples_path)
483*890232f2SAndroid Build Coastguard Workerflatc(
484*890232f2SAndroid Build Coastguard Worker    BINARY_OPTS + ["--bfbs-filenames", str(samples_path)],
485*890232f2SAndroid Build Coastguard Worker    schema=samples_schema,
486*890232f2SAndroid Build Coastguard Worker    cwd=samples_path,
487*890232f2SAndroid Build Coastguard Worker)
488*890232f2SAndroid Build Coastguard Worker
489*890232f2SAndroid Build Coastguard Worker# Reflection
490*890232f2SAndroid Build Coastguard Worker
491*890232f2SAndroid Build Coastguard Worker# Skip generating the reflection if told too, as we run this script after
492*890232f2SAndroid Build Coastguard Worker# building flatc which uses the reflection_generated.h itself.
493*890232f2SAndroid Build Coastguard Workerif not args.skip_gen_reflection:
494*890232f2SAndroid Build Coastguard Worker    # C++ Reflection
495*890232f2SAndroid Build Coastguard Worker    flatc_reflection(
496*890232f2SAndroid Build Coastguard Worker        ["-c", "--cpp-std", "c++0x"], "include/flatbuffers", "reflection_generated.h"
497*890232f2SAndroid Build Coastguard Worker    )
498*890232f2SAndroid Build Coastguard Worker
499*890232f2SAndroid Build Coastguard Worker# Python Reflection
500*890232f2SAndroid Build Coastguard Workerflatc_reflection(["-p"], "python/flatbuffers", "reflection")
501*890232f2SAndroid Build Coastguard Worker
502*890232f2SAndroid Build Coastguard Worker# Annotation
503*890232f2SAndroid Build Coastguard Worker
504*890232f2SAndroid Build Coastguard Worker
505*890232f2SAndroid Build Coastguard Workerdef flatc_annotate(schema, include=None, data=None, cwd=tests_path):
506*890232f2SAndroid Build Coastguard Worker    cmd = [str(flatc_path)]
507*890232f2SAndroid Build Coastguard Worker    if include:
508*890232f2SAndroid Build Coastguard Worker        cmd += ["-I"] + [include]
509*890232f2SAndroid Build Coastguard Worker    cmd += ["--annotate", schema]
510*890232f2SAndroid Build Coastguard Worker    if data:
511*890232f2SAndroid Build Coastguard Worker        cmd += [data] if isinstance(data, str) else data
512*890232f2SAndroid Build Coastguard Worker    subprocess.run(cmd, cwd=str(cwd), check=True)
513*890232f2SAndroid Build Coastguard Worker
514*890232f2SAndroid Build Coastguard Worker
515*890232f2SAndroid Build Coastguard Workerflatc_annotate(
516*890232f2SAndroid Build Coastguard Worker    schema="monster_test.fbs", include="include_test", data="monsterdata_test.mon"
517*890232f2SAndroid Build Coastguard Worker)
518*890232f2SAndroid Build Coastguard Worker
519*890232f2SAndroid Build Coastguard Worker# Run the generate_grpc_examples script
520*890232f2SAndroid Build Coastguard Workergenerate_grpc_examples.GenerateGRPCExamples()
521