xref: /aosp_15_r20/external/executorch/exir/_serialize/bindings.cpp (revision 523fa7a60841cd1ecfb9cc4201f1ca8b03ed023a)
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