1*523fa7a6SAndroid Build Coastguard Worker /*
2*523fa7a6SAndroid Build Coastguard Worker * Copyright (c) Meta Platforms, Inc. and affiliates.
3*523fa7a6SAndroid Build Coastguard Worker * All rights reserved.
4*523fa7a6SAndroid Build Coastguard Worker *
5*523fa7a6SAndroid Build Coastguard Worker * This source code is licensed under the BSD-style license found in the
6*523fa7a6SAndroid Build Coastguard Worker * LICENSE file in the root directory of this source tree.
7*523fa7a6SAndroid Build Coastguard Worker */
8*523fa7a6SAndroid Build Coastguard Worker
9*523fa7a6SAndroid Build Coastguard Worker #include <flatbuffers/flatc.h> // @manual=fbsource//third-party/flatbuffers:flatc_library
10*523fa7a6SAndroid Build Coastguard Worker #include <flatbuffers/idl.h> // @manual=fbsource//third-party/flatbuffers:flatc_library
11*523fa7a6SAndroid Build Coastguard Worker #include <pybind11/pybind11.h> // @manual=fbsource//third-party/pybind11:pybind11
12*523fa7a6SAndroid Build Coastguard Worker #include <pybind11/stl.h> // @manual=fbsource//third-party/pybind11:pybind11
13*523fa7a6SAndroid Build Coastguard Worker
14*523fa7a6SAndroid Build Coastguard Worker namespace exir {
15*523fa7a6SAndroid Build Coastguard Worker namespace {
Warn(const flatbuffers::FlatCompiler *,const std::string & warn,bool)16*523fa7a6SAndroid Build Coastguard Worker void Warn(
17*523fa7a6SAndroid Build Coastguard Worker const flatbuffers::FlatCompiler* /* flatc */,
18*523fa7a6SAndroid Build Coastguard Worker const std::string& warn,
19*523fa7a6SAndroid Build Coastguard Worker bool /* show_exe_name */) {
20*523fa7a6SAndroid Build Coastguard Worker printf("flatc compiler warning: %s\n", warn.c_str());
21*523fa7a6SAndroid Build Coastguard Worker }
22*523fa7a6SAndroid Build Coastguard Worker
Error(const flatbuffers::FlatCompiler *,const std::string & err,bool,bool)23*523fa7a6SAndroid Build Coastguard Worker void Error(
24*523fa7a6SAndroid Build Coastguard Worker const flatbuffers::FlatCompiler* /* flatc */,
25*523fa7a6SAndroid Build Coastguard Worker const std::string& err,
26*523fa7a6SAndroid Build Coastguard Worker bool /* usage */,
27*523fa7a6SAndroid Build Coastguard Worker bool /* show_exe_name */) {
28*523fa7a6SAndroid Build Coastguard Worker throw std::runtime_error("Caught error in flatc compiler: " + err);
29*523fa7a6SAndroid Build Coastguard Worker }
30*523fa7a6SAndroid Build Coastguard Worker
31*523fa7a6SAndroid Build Coastguard Worker } // namespace
32*523fa7a6SAndroid Build Coastguard Worker
PYBIND11_MODULE(_bindings,m)33*523fa7a6SAndroid Build Coastguard Worker PYBIND11_MODULE(_bindings, m) {
34*523fa7a6SAndroid Build Coastguard Worker m.def(
35*523fa7a6SAndroid Build Coastguard Worker "flatc_compile",
36*523fa7a6SAndroid Build Coastguard Worker [&](const std::string& outputPath,
37*523fa7a6SAndroid Build Coastguard Worker const std::string& schemaPath,
38*523fa7a6SAndroid Build Coastguard Worker const std::string& jsonPath) {
39*523fa7a6SAndroid Build Coastguard Worker static const flatbuffers::FlatCompiler::Generator generators[] = {
40*523fa7a6SAndroid Build Coastguard Worker {flatbuffers::GenerateBinary,
41*523fa7a6SAndroid Build Coastguard Worker "-b",
42*523fa7a6SAndroid Build Coastguard Worker "--binary",
43*523fa7a6SAndroid Build Coastguard Worker "binary",
44*523fa7a6SAndroid Build Coastguard Worker false,
45*523fa7a6SAndroid Build Coastguard Worker nullptr,
46*523fa7a6SAndroid Build Coastguard Worker flatbuffers::IDLOptions::kBinary,
47*523fa7a6SAndroid Build Coastguard Worker "Generate wire format binaries for any data definitions",
48*523fa7a6SAndroid Build Coastguard Worker flatbuffers::BinaryMakeRule}};
49*523fa7a6SAndroid Build Coastguard Worker
50*523fa7a6SAndroid Build Coastguard Worker flatbuffers::FlatCompiler::InitParams params;
51*523fa7a6SAndroid Build Coastguard Worker params.generators = generators;
52*523fa7a6SAndroid Build Coastguard Worker params.num_generators = sizeof(generators) / sizeof(generators[0]);
53*523fa7a6SAndroid Build Coastguard Worker params.warn_fn = Warn;
54*523fa7a6SAndroid Build Coastguard Worker params.error_fn = Error;
55*523fa7a6SAndroid Build Coastguard Worker
56*523fa7a6SAndroid Build Coastguard Worker flatbuffers::FlatCompiler flatc(params);
57*523fa7a6SAndroid Build Coastguard Worker std::array<const char*, 5> argv = {
58*523fa7a6SAndroid Build Coastguard Worker "--binary",
59*523fa7a6SAndroid Build Coastguard Worker "-o",
60*523fa7a6SAndroid Build Coastguard Worker outputPath.c_str(),
61*523fa7a6SAndroid Build Coastguard Worker schemaPath.c_str(),
62*523fa7a6SAndroid Build Coastguard Worker jsonPath.c_str()};
63*523fa7a6SAndroid Build Coastguard Worker return flatc.Compile(argv.size(), argv.data());
64*523fa7a6SAndroid Build Coastguard Worker })
65*523fa7a6SAndroid Build Coastguard Worker .def(
66*523fa7a6SAndroid Build Coastguard Worker "flatc_decompile",
67*523fa7a6SAndroid Build Coastguard Worker [&](const std::string& outputPath,
68*523fa7a6SAndroid Build Coastguard Worker const std::string& schemaPath,
69*523fa7a6SAndroid Build Coastguard Worker const std::string& binPath) {
70*523fa7a6SAndroid Build Coastguard Worker static const flatbuffers::FlatCompiler::Generator generators[] = {
71*523fa7a6SAndroid Build Coastguard Worker {flatbuffers::GenerateTextFile,
72*523fa7a6SAndroid Build Coastguard Worker "-t",
73*523fa7a6SAndroid Build Coastguard Worker "--json",
74*523fa7a6SAndroid Build Coastguard Worker "text",
75*523fa7a6SAndroid Build Coastguard Worker false,
76*523fa7a6SAndroid Build Coastguard Worker nullptr,
77*523fa7a6SAndroid Build Coastguard Worker flatbuffers::IDLOptions::kJson,
78*523fa7a6SAndroid Build Coastguard Worker "Generate text output for any data definitions",
79*523fa7a6SAndroid Build Coastguard Worker flatbuffers::TextMakeRule}};
80*523fa7a6SAndroid Build Coastguard Worker
81*523fa7a6SAndroid Build Coastguard Worker flatbuffers::FlatCompiler::InitParams params;
82*523fa7a6SAndroid Build Coastguard Worker params.generators = generators;
83*523fa7a6SAndroid Build Coastguard Worker params.num_generators = sizeof(generators) / sizeof(generators[0]);
84*523fa7a6SAndroid Build Coastguard Worker params.warn_fn = Warn;
85*523fa7a6SAndroid Build Coastguard Worker params.error_fn = Error;
86*523fa7a6SAndroid Build Coastguard Worker
87*523fa7a6SAndroid Build Coastguard Worker flatbuffers::FlatCompiler flatc(params);
88*523fa7a6SAndroid Build Coastguard Worker
89*523fa7a6SAndroid Build Coastguard Worker std::array<const char*, 8> argv = {
90*523fa7a6SAndroid Build Coastguard Worker "--json",
91*523fa7a6SAndroid Build Coastguard Worker "--defaults-json",
92*523fa7a6SAndroid Build Coastguard Worker "--strict-json",
93*523fa7a6SAndroid Build Coastguard Worker "-o",
94*523fa7a6SAndroid Build Coastguard Worker outputPath.c_str(),
95*523fa7a6SAndroid Build Coastguard Worker schemaPath.c_str(),
96*523fa7a6SAndroid Build Coastguard Worker "--",
97*523fa7a6SAndroid Build Coastguard Worker binPath.c_str()};
98*523fa7a6SAndroid Build Coastguard Worker return flatc.Compile(argv.size(), argv.data());
99*523fa7a6SAndroid Build Coastguard Worker });
100*523fa7a6SAndroid Build Coastguard Worker }
101*523fa7a6SAndroid Build Coastguard Worker
102*523fa7a6SAndroid Build Coastguard Worker } // namespace exir
103