--[[ The upb compiler. Unlike the proto2 compiler, this does not output any parsing code or generated classes or anything specific to the protobuf binary format at all. At the moment it only dumps C initializers for upb_defs, so that a .proto file can be represented in a .o file. --]] local dump_cinit = require "dump_cinit" local upb = require "upb" local src = arg[1] if not src then print("Usage: upbc ") 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()) 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)) 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 defs dump_cinit.dump_defs(file, happend, cappend) hfile:close() cfile:close() end