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.
91 lines
2.1 KiB
91 lines
2.1 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 upb = require "upb" |
|
|
|
local generate_upbdefs = false |
|
local outdir = "." |
|
|
|
i = 1 |
|
while i <= #arg do |
|
argument = arg[i] |
|
if argument.sub(argument, 1, 2) == "--" then |
|
if argument == "--generate-upbdefs" then |
|
generate_upbdefs = true |
|
elseif argument == "--outdir" then |
|
i = i + 1 |
|
outdir = arg[i] |
|
else |
|
print("Unknown flag: " .. argument) |
|
return 1 |
|
end |
|
else |
|
if src then |
|
print("upbc can only handle one input file at a time.") |
|
return 1 |
|
end |
|
src = argument |
|
end |
|
i = i + 1 |
|
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 |
|
|
|
local function open(filename) |
|
local full_name = outdir .. "/" .. filename |
|
return assert(io.open(full_name, "w"), "couldn't open " .. full_name) |
|
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)) |
|
|
|
assert(generate_upbdefs) |
|
-- Legacy generated defs. |
|
local hfile = open(hfilename) |
|
local cfile = 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
|
|
|