Protocol Buffers - Google's data interchange format (grpc依赖)
https://developers.google.com/protocol-buffers/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
95 lines
2.5 KiB
95 lines
2.5 KiB
--[[ |
|
|
|
The upb compiler. It can write two different kinds of output |
|
files: |
|
|
|
- generated code for a C API (foo.upb.h, foo.upb.c) |
|
- (obsolete): definitions of upb defs. (foo.upbdefs.h, foo.upbdefs.c) |
|
|
|
--]] |
|
|
|
local dump_cinit = require "dump_cinit" |
|
local make_c_api = require "make_c_api" |
|
local upb = require "upb" |
|
|
|
local generate_upbdefs = false |
|
|
|
for _, argument in ipairs(arg) do |
|
if argument == "--generate-upbdefs" then |
|
generate_upbdefs = true |
|
else |
|
src = argument |
|
end |
|
end |
|
|
|
if not src then |
|
print("Usage: upbc [--generate-upbdefs] <binary descriptor>") |
|
return 1 |
|
end |
|
|
|
function strip_proto(filename) |
|
return string.gsub(filename, '%.proto$','') |
|
end |
|
|
|
-- Open input/output files. |
|
local f = assert(io.open(src, "r"), "couldn't open input file " .. src) |
|
local descriptor = f:read("*all") |
|
local files = upb.load_descriptor(descriptor) |
|
local symtab = upb.SymbolTable() |
|
|
|
for _, file in ipairs(files) do |
|
symtab:add_file(file) |
|
local outbase = strip_proto(file:name()) |
|
|
|
-- Write upbdefs. |
|
|
|
local hfilename = outbase .. ".upbdefs.h" |
|
local cfilename = outbase .. ".upbdefs.c" |
|
|
|
if os.getenv("UPBC_VERBOSE") then |
|
print("upbc:") |
|
print(string.format(" source file=%s", src)) |
|
print(string.format(" output file base=%s", outbase)) |
|
print(string.format(" hfilename=%s", hfilename)) |
|
print(string.format(" cfilename=%s", cfilename)) |
|
end |
|
|
|
os.execute(string.format("mkdir -p `dirname %s`", outbase)) |
|
|
|
if generate_upbdefs then |
|
-- Legacy generated defs. |
|
local hfile = assert(io.open(hfilename, "w"), "couldn't open " .. hfilename) |
|
local cfile = assert(io.open(cfilename, "w"), "couldn't open " .. cfilename) |
|
|
|
local happend = dump_cinit.file_appender(hfile) |
|
local cappend = dump_cinit.file_appender(cfile) |
|
|
|
dump_cinit.dump_defs(file, happend, cappend) |
|
|
|
hfile:close() |
|
cfile:close() |
|
end |
|
|
|
-- Write C API. |
|
hfilename = outbase .. ".upb.h" |
|
cfilename = outbase .. ".upb.c" |
|
|
|
if os.getenv("UPBC_VERBOSE") then |
|
print("upbc:") |
|
print(string.format(" source file=%s", src)) |
|
print(string.format(" output file base=%s", outbase)) |
|
print(string.format(" hfilename=%s", hfilename)) |
|
print(string.format(" cfilename=%s", cfilename)) |
|
end |
|
|
|
local hfile = assert(io.open(hfilename, "w"), "couldn't open " .. hfilename) |
|
local cfile = assert(io.open(cfilename, "w"), "couldn't open " .. cfilename) |
|
|
|
local happend = dump_cinit.file_appender(hfile) |
|
local cappend = dump_cinit.file_appender(cfile) |
|
|
|
make_c_api.write_gencode(file, hfilename, happend, cappend) |
|
|
|
hfile:close() |
|
cfile:close() |
|
end
|
|
|