2009-07-08 00:52:10 +04:00
|
|
|
# ***** BEGIN LICENSE BLOCK *****
|
|
|
|
# Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
|
|
|
#
|
|
|
|
# The contents of this file are subject to the Mozilla Public License Version
|
|
|
|
# 1.1 (the "License"); you may not use this file except in compliance with
|
|
|
|
# the License. You may obtain a copy of the License at
|
|
|
|
# http://www.mozilla.org/MPL/
|
|
|
|
#
|
|
|
|
# Software distributed under the License is distributed on an "AS IS" basis,
|
|
|
|
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
|
|
|
# for the specific language governing rights and limitations under the
|
|
|
|
# License.
|
|
|
|
#
|
|
|
|
# The Original Code is mozilla.org code.
|
|
|
|
#
|
|
|
|
# Contributor(s):
|
|
|
|
# Chris Jones <jones.chris.g@gmail.com>
|
|
|
|
#
|
|
|
|
# Alternatively, the contents of this file may be used under the terms of
|
|
|
|
# either of the GNU General Public License Version 2 or later (the "GPL"),
|
|
|
|
# or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
|
|
|
# in which case the provisions of the GPL or the LGPL are applicable instead
|
|
|
|
# of those above. If you wish to allow use of your version of this file only
|
|
|
|
# under the terms of either the GPL or the LGPL, and not to allow others to
|
|
|
|
# use your version of this file under the terms of the MPL, indicate your
|
|
|
|
# decision by deleting the provisions above and replace them with the notice
|
|
|
|
# and other provisions required by the GPL or the LGPL. If you do not delete
|
|
|
|
# the provisions above, a recipient may use your version of this file under
|
|
|
|
# the terms of any one of the MPL, the GPL or the LGPL.
|
|
|
|
#
|
|
|
|
# ***** END LICENSE BLOCK *****
|
|
|
|
|
|
|
|
import optparse, os, re, sys
|
|
|
|
from cStringIO import StringIO
|
|
|
|
|
|
|
|
import ipdl
|
|
|
|
|
|
|
|
def log(minv, fmt, *args):
|
|
|
|
if _verbosity >= minv:
|
2010-05-14 02:25:20 +04:00
|
|
|
print fmt % args
|
2009-07-08 00:52:10 +04:00
|
|
|
|
|
|
|
# process command line
|
|
|
|
|
|
|
|
op = optparse.OptionParser(usage='ipdl.py [options] IPDLfiles...')
|
2009-07-08 19:37:32 +04:00
|
|
|
op.add_option('-I', '--include', dest='includedirs', default=[ ],
|
|
|
|
action='append',
|
2009-07-08 02:52:38 +04:00
|
|
|
help='Additional directory to search for included protocol specifications')
|
2009-07-08 00:52:10 +04:00
|
|
|
op.add_option('-v', '--verbose', dest='verbosity', default=1, action='count',
|
|
|
|
help='Verbose logging (specify -vv or -vvv for very verbose logging)')
|
|
|
|
op.add_option('-q', '--quiet', dest='verbosity', action='store_const', const=0,
|
|
|
|
help="Suppress logging output")
|
2009-12-03 11:16:09 +03:00
|
|
|
op.add_option('-d', '--outheaders-dir', dest='headersdir', default='.',
|
2009-12-03 11:16:28 +03:00
|
|
|
help="""Directory into which C++ headers will be generated.
|
2009-12-03 11:16:09 +03:00
|
|
|
A protocol Foo in the namespace bar will cause the headers
|
|
|
|
dir/bar/Foo.h, dir/bar/FooParent.h, and dir/bar/FooParent.h
|
|
|
|
to be generated""")
|
|
|
|
op.add_option('-o', '--outcpp-dir', dest='cppdir', default='.',
|
2009-12-03 11:16:28 +03:00
|
|
|
help="""Directory into which C++ sources will be generated
|
2009-12-03 11:16:09 +03:00
|
|
|
A protocol Foo in the namespace bar will cause the sources
|
|
|
|
cppdir/FooParent.cpp, cppdir/FooChild.cpp
|
|
|
|
to be generated""")
|
2011-12-15 19:10:35 +04:00
|
|
|
op.add_option('-m', '--dependencies', dest='emitdependencies', default=False, action='store_true',
|
|
|
|
help="Emit Makefile dependencies for incremental rebuilds")
|
2009-12-03 11:16:09 +03:00
|
|
|
|
2009-07-08 00:52:10 +04:00
|
|
|
|
|
|
|
options, files = op.parse_args()
|
|
|
|
_verbosity = options.verbosity
|
2009-12-03 11:16:09 +03:00
|
|
|
headersdir = options.headersdir
|
|
|
|
cppdir = options.cppdir
|
2011-12-15 19:10:35 +04:00
|
|
|
emitdependencies = options.emitdependencies
|
2009-07-08 02:52:38 +04:00
|
|
|
includedirs = [ os.path.abspath(incdir) for incdir in options.includedirs ]
|
2009-07-08 00:52:10 +04:00
|
|
|
|
|
|
|
if not len(files):
|
|
|
|
op.error("No IPDL files specified")
|
|
|
|
|
2010-05-14 02:25:20 +04:00
|
|
|
log(2, 'Generated C++ headers will be generated relative to "%s"', headersdir)
|
|
|
|
log(2, 'Generated C++ sources will be generated in "%s"', cppdir)
|
2009-07-08 00:52:10 +04:00
|
|
|
|
|
|
|
allprotocols = []
|
|
|
|
|
2011-06-03 22:33:55 +04:00
|
|
|
def normalizedFilename(f):
|
|
|
|
if f == '-':
|
|
|
|
return '<stdin>'
|
|
|
|
return f
|
|
|
|
|
|
|
|
# First pass: parse and type-check all protocols
|
2009-07-08 00:52:10 +04:00
|
|
|
for f in files:
|
2011-09-13 23:40:27 +04:00
|
|
|
log(2, os.path.basename(f))
|
2011-06-03 22:33:55 +04:00
|
|
|
filename = normalizedFilename(f)
|
2009-07-08 00:52:10 +04:00
|
|
|
if f == '-':
|
|
|
|
fd = sys.stdin
|
|
|
|
else:
|
|
|
|
fd = open(f)
|
|
|
|
|
|
|
|
specstring = fd.read()
|
|
|
|
fd.close()
|
|
|
|
|
2009-07-08 02:52:38 +04:00
|
|
|
ast = ipdl.parse(specstring, filename, includedirs=includedirs)
|
2009-07-13 20:12:08 +04:00
|
|
|
if ast is None:
|
|
|
|
print >>sys.stderr, 'Specification could not be parsed.'
|
|
|
|
sys.exit(1)
|
2009-07-08 00:52:10 +04:00
|
|
|
|
|
|
|
log(2, 'checking types')
|
|
|
|
if not ipdl.typecheck(ast):
|
|
|
|
print >>sys.stderr, 'Specification is not well typed.'
|
|
|
|
sys.exit(1)
|
|
|
|
|
|
|
|
if _verbosity > 2:
|
|
|
|
log(3, ' pretty printed code:')
|
|
|
|
ipdl.genipdl(ast, codedir)
|
|
|
|
|
2011-12-15 19:10:35 +04:00
|
|
|
if emitdependencies == 1:
|
|
|
|
ipdl.genm(ast, cppdir, normalizedFilename(f))
|
|
|
|
|
2011-06-03 22:33:55 +04:00
|
|
|
# Second pass: generate code
|
|
|
|
for f in files:
|
|
|
|
# Read from parser cache
|
|
|
|
filename = normalizedFilename(f)
|
|
|
|
ast = ipdl.parse(None, filename, includedirs=includedirs)
|
2009-12-03 11:16:09 +03:00
|
|
|
ipdl.gencxx(filename, ast, headersdir, cppdir)
|
2011-12-15 19:10:35 +04:00
|
|
|
|
2011-06-03 22:33:55 +04:00
|
|
|
allprotocols.append('%sMsgStart' % ast.protocol.name)
|
2009-07-08 00:52:10 +04:00
|
|
|
|
|
|
|
allprotocols.sort()
|
|
|
|
|
|
|
|
ipcmsgstart = StringIO()
|
|
|
|
|
|
|
|
print >>ipcmsgstart, """
|
|
|
|
// CODE GENERATED by ipdl.py. Do not edit.
|
|
|
|
|
2009-12-03 11:16:09 +03:00
|
|
|
#ifndef IPCMessageStart_h
|
|
|
|
#define IPCMessageStart_h
|
|
|
|
|
2009-07-08 00:52:10 +04:00
|
|
|
enum IPCMessageStart {
|
|
|
|
"""
|
|
|
|
|
|
|
|
for name in allprotocols:
|
|
|
|
print >>ipcmsgstart, " %s," % name
|
|
|
|
|
|
|
|
print >>ipcmsgstart, """
|
|
|
|
LastMsgIndex
|
|
|
|
};
|
2009-12-03 11:16:09 +03:00
|
|
|
|
2010-11-05 10:17:06 +03:00
|
|
|
COMPILE_ASSERT(LastMsgIndex <= 65536, need_to_update_IPC_MESSAGE_MACRO);
|
2009-12-03 11:16:09 +03:00
|
|
|
|
|
|
|
#endif // ifndef IPCMessageStart_h
|
2009-07-08 00:52:10 +04:00
|
|
|
"""
|
|
|
|
|
2011-12-15 19:10:35 +04:00
|
|
|
ipdl.writetofile(ipcmsgstart.getvalue(),
|
2009-12-03 11:16:09 +03:00
|
|
|
os.path.join(headersdir, 'IPCMessageStart.h'))
|