зеркало из https://github.com/mozilla/gecko-dev.git
bug 525172: from IPDL specs generate .cpp files with method definitions instead of everything in .h files. r=bsmedberg
This commit is contained in:
Родитель
9bcd9f1ab6
Коммит
677d4b14f9
|
@ -41,7 +41,11 @@ VPATH = @srcdir@
|
||||||
|
|
||||||
include $(DEPTH)/config/autoconf.mk
|
include $(DEPTH)/config/autoconf.mk
|
||||||
|
|
||||||
DIRS += testshell
|
# NB: chromium/ and glue/ are in tier_xpcom
|
||||||
|
|
||||||
|
# tier_gecko:
|
||||||
|
DIRS += ipdl testshell
|
||||||
|
|
||||||
TOOL_DIRS = app
|
TOOL_DIRS = app
|
||||||
|
|
||||||
include $(topsrcdir)/config/rules.mk
|
include $(topsrcdir)/config/rules.mk
|
||||||
|
|
|
@ -45,10 +45,6 @@
|
||||||
#include "nsStringGlue.h"
|
#include "nsStringGlue.h"
|
||||||
#include "nsTArray.h"
|
#include "nsTArray.h"
|
||||||
|
|
||||||
#include "IPCMessageStart.h"
|
|
||||||
|
|
||||||
COMPILE_ASSERT(LastMsgIndex <= 64, need_to_update_IPC_MESSAGE_MACRO);
|
|
||||||
|
|
||||||
namespace IPC {
|
namespace IPC {
|
||||||
|
|
||||||
template <>
|
template <>
|
||||||
|
|
|
@ -44,8 +44,15 @@ include $(DEPTH)/config/autoconf.mk
|
||||||
GARBAGE_DIRS += _ipdlheaders
|
GARBAGE_DIRS += _ipdlheaders
|
||||||
GARBAGE += ipdl_lextab.py ipdl_yacctab.py
|
GARBAGE += ipdl_lextab.py ipdl_yacctab.py
|
||||||
|
|
||||||
include $(topsrcdir)/config/rules.mk
|
MODULE = ipdlgen
|
||||||
|
LIBRARY_NAME = mozipdlgen_s
|
||||||
|
FORCE_STATIC_LIB = 1
|
||||||
|
LIBXUL_LIBRARY = 1
|
||||||
|
EXPORT_LIBRARY = 1
|
||||||
|
|
||||||
|
##-----------------------------------------------------------------------------
|
||||||
|
## When you add IPDL files to a source directory, list the directory here.
|
||||||
|
##
|
||||||
IPDLDIRS = \
|
IPDLDIRS = \
|
||||||
dom/plugins \
|
dom/plugins \
|
||||||
dom/ipc \
|
dom/ipc \
|
||||||
|
@ -54,22 +61,46 @@ IPDLDIRS = \
|
||||||
ipc/ipdl/test/cxx \
|
ipc/ipdl/test/cxx \
|
||||||
ipc/testshell \
|
ipc/testshell \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
##-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
ifdef MOZ_IPDL_TESTS
|
||||||
|
DIRS += test
|
||||||
|
endif
|
||||||
|
|
||||||
vpath %.ipdl $(topsrcdir)
|
vpath %.ipdl $(topsrcdir)
|
||||||
|
|
||||||
define ADD_IPDLDIR
|
define ADD_IPDLDIR
|
||||||
include $(topsrcdir)/$(IPDLDIR)/ipdl.mk
|
include $(topsrcdir)/$(IPDLDIR)/ipdl.mk
|
||||||
ALL_IPDLSRCS += $$(IPDLSRCS:%=$(IPDLDIR)/%)
|
ALL_IPDLSRCS += $$(IPDLSRCS:%=$(IPDLDIR)/%)
|
||||||
|
PROTOCOLS += $$(IPDLSRCS)
|
||||||
endef
|
endef
|
||||||
|
|
||||||
ALL_IPDLSRCS :=
|
ALL_IPDLSRCS :=
|
||||||
|
PROTOCOLS :=
|
||||||
|
|
||||||
$(foreach IPDLDIR,$(IPDLDIRS),$(eval $(ADD_IPDLDIR)))
|
$(foreach IPDLDIR,$(IPDLDIRS),$(eval $(ADD_IPDLDIR)))
|
||||||
|
|
||||||
|
|
||||||
|
CPPSRCS = \
|
||||||
|
$(PROTOCOLS:%.ipdl=%Parent.cpp) \
|
||||||
|
$(PROTOCOLS:%.ipdl=%Child.cpp) \
|
||||||
|
$(NULL)
|
||||||
|
|
||||||
|
LOCAL_INCLUDES += -I$(DEPTH)/ipc/ipdl/_ipdlheaders
|
||||||
|
|
||||||
|
|
||||||
|
include $(topsrcdir)/config/config.mk
|
||||||
|
include $(topsrcdir)/ipc/chromium/chromium-config.mk
|
||||||
|
include $(topsrcdir)/config/rules.mk
|
||||||
|
|
||||||
|
|
||||||
|
# NB: the IPDL compiler manages .ipdl-->.h/.cpp dependencies itself,
|
||||||
|
# which is why we don't have explicit .h/.cpp targets here
|
||||||
export:: $(ALL_IPDLSRCS)
|
export:: $(ALL_IPDLSRCS)
|
||||||
$(PYTHON) $(topsrcdir)/config/pythonpath.py \
|
$(PYTHON) $(topsrcdir)/config/pythonpath.py \
|
||||||
-I$(topsrcdir)/other-licenses/ply \
|
-I$(topsrcdir)/other-licenses/ply \
|
||||||
$(srcdir)/ipdl.py \
|
$(srcdir)/ipdl.py \
|
||||||
-d _ipdlheaders \
|
--outheaders-dir=_ipdlheaders \
|
||||||
|
--outcpp-dir=. \
|
||||||
$(IPDLDIRS:%=-I$(topsrcdir)/%) \
|
$(IPDLDIRS:%=-I$(topsrcdir)/%) \
|
||||||
$^
|
$^
|
||||||
|
|
|
@ -42,8 +42,6 @@ def log(minv, fmt, *args):
|
||||||
# process command line
|
# process command line
|
||||||
|
|
||||||
op = optparse.OptionParser(usage='ipdl.py [options] IPDLfiles...')
|
op = optparse.OptionParser(usage='ipdl.py [options] IPDLfiles...')
|
||||||
op.add_option('-d', '--output-dir', dest='outputdir', default='.',
|
|
||||||
help='Directory in which to put generated headers')
|
|
||||||
op.add_option('-I', '--include', dest='includedirs', default=[ ],
|
op.add_option('-I', '--include', dest='includedirs', default=[ ],
|
||||||
action='append',
|
action='append',
|
||||||
help='Additional directory to search for included protocol specifications')
|
help='Additional directory to search for included protocol specifications')
|
||||||
|
@ -51,16 +49,29 @@ op.add_option('-v', '--verbose', dest='verbosity', default=1, action='count',
|
||||||
help='Verbose logging (specify -vv or -vvv for very verbose logging)')
|
help='Verbose logging (specify -vv or -vvv for very verbose logging)')
|
||||||
op.add_option('-q', '--quiet', dest='verbosity', action='store_const', const=0,
|
op.add_option('-q', '--quiet', dest='verbosity', action='store_const', const=0,
|
||||||
help="Suppress logging output")
|
help="Suppress logging output")
|
||||||
|
op.add_option('-d', '--outheaders-dir', dest='headersdir', default='.',
|
||||||
|
help="""Director into which C++ headers will be generated.
|
||||||
|
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='.',
|
||||||
|
help="""Director into which C++ sources will be generated
|
||||||
|
A protocol Foo in the namespace bar will cause the sources
|
||||||
|
cppdir/FooParent.cpp, cppdir/FooChild.cpp
|
||||||
|
to be generated""")
|
||||||
|
|
||||||
|
|
||||||
options, files = op.parse_args()
|
options, files = op.parse_args()
|
||||||
_verbosity = options.verbosity
|
_verbosity = options.verbosity
|
||||||
codedir = options.outputdir
|
headersdir = options.headersdir
|
||||||
|
cppdir = options.cppdir
|
||||||
includedirs = [ os.path.abspath(incdir) for incdir in options.includedirs ]
|
includedirs = [ os.path.abspath(incdir) for incdir in options.includedirs ]
|
||||||
|
|
||||||
if not len(files):
|
if not len(files):
|
||||||
op.error("No IPDL files specified")
|
op.error("No IPDL files specified")
|
||||||
|
|
||||||
log(1, 'Generated headers will be placed in "%s"', codedir)
|
log(1, 'Generated C++ headers will be generated relative to "%s"', headersdir)
|
||||||
|
log(1, 'Generated C++ sources will be generated relative to "%s"', cppdir)
|
||||||
|
|
||||||
allprotocols = []
|
allprotocols = []
|
||||||
|
|
||||||
|
@ -92,7 +103,7 @@ for f in files:
|
||||||
log(3, ' pretty printed code:')
|
log(3, ' pretty printed code:')
|
||||||
ipdl.genipdl(ast, codedir)
|
ipdl.genipdl(ast, codedir)
|
||||||
|
|
||||||
ipdl.gencxx(ast, codedir)
|
ipdl.gencxx(filename, ast, headersdir, cppdir)
|
||||||
|
|
||||||
allprotocols.sort()
|
allprotocols.sort()
|
||||||
|
|
||||||
|
@ -101,6 +112,9 @@ ipcmsgstart = StringIO()
|
||||||
print >>ipcmsgstart, """
|
print >>ipcmsgstart, """
|
||||||
// CODE GENERATED by ipdl.py. Do not edit.
|
// CODE GENERATED by ipdl.py. Do not edit.
|
||||||
|
|
||||||
|
#ifndef IPCMessageStart_h
|
||||||
|
#define IPCMessageStart_h
|
||||||
|
|
||||||
enum IPCMessageStart {
|
enum IPCMessageStart {
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
@ -110,7 +124,11 @@ for name in allprotocols:
|
||||||
print >>ipcmsgstart, """
|
print >>ipcmsgstart, """
|
||||||
LastMsgIndex
|
LastMsgIndex
|
||||||
};
|
};
|
||||||
|
|
||||||
|
COMPILE_ASSERT(LastMsgIndex <= 64, need_to_update_IPC_MESSAGE_MACRO);
|
||||||
|
|
||||||
|
#endif // ifndef IPCMessageStart_h
|
||||||
"""
|
"""
|
||||||
|
|
||||||
ipdl.writeifmodified(ipcmsgstart.getvalue(),
|
ipdl.writeifmodified(ipcmsgstart.getvalue(),
|
||||||
os.path.join(codedir, 'IPCMessageStart.h'))
|
os.path.join(headersdir, 'IPCMessageStart.h'))
|
||||||
|
|
|
@ -42,29 +42,43 @@ from ipdl.type import TypeCheck
|
||||||
|
|
||||||
from ipdl.cxx.cgen import CxxCodeGen
|
from ipdl.cxx.cgen import CxxCodeGen
|
||||||
|
|
||||||
|
|
||||||
def parse(specstring, filename='/stdin', includedirs=[ ], errout=sys.stderr):
|
def parse(specstring, filename='/stdin', includedirs=[ ], errout=sys.stderr):
|
||||||
'''Return an IPDL AST if parsing was successful. Print errors to |errout|
|
'''Return an IPDL AST if parsing was successful. Print errors to |errout|
|
||||||
if it is not.'''
|
if it is not.'''
|
||||||
return Parser().parse(specstring, os.path.abspath(filename), includedirs, errout)
|
return Parser().parse(specstring, os.path.abspath(filename), includedirs, errout)
|
||||||
|
|
||||||
|
|
||||||
def typecheck(ast, errout=sys.stderr):
|
def typecheck(ast, errout=sys.stderr):
|
||||||
'''Return True iff |ast| is well typed. Print errors to |errout| if
|
'''Return True iff |ast| is well typed. Print errors to |errout| if
|
||||||
it is not.'''
|
it is not.'''
|
||||||
return TypeCheck().check(ast, errout)
|
return TypeCheck().check(ast, errout)
|
||||||
|
|
||||||
def gencxx(ast, outdir):
|
|
||||||
for hdr in LowerToCxx().lower(ast):
|
|
||||||
file = os.path.join(
|
|
||||||
outdir,
|
|
||||||
*([ns.name for ns in ast.protocol.namespaces] + [hdr.name]))
|
|
||||||
|
|
||||||
|
def gencxx(ipdlfilename, ast, outheadersdir, outcppdir):
|
||||||
|
headers, cpps = LowerToCxx().lower(ast)
|
||||||
|
|
||||||
|
def resolveHeader(hdr):
|
||||||
|
return [
|
||||||
|
hdr,
|
||||||
|
os.path.join(
|
||||||
|
outheadersdir,
|
||||||
|
*([ns.name for ns in ast.protocol.namespaces] + [hdr.name]))
|
||||||
|
]
|
||||||
|
def resolveCpp(cpp):
|
||||||
|
return [ cpp, os.path.join(outcppdir, cpp.name) ]
|
||||||
|
|
||||||
|
for ast, filename in ([ resolveHeader(hdr) for hdr in headers ]
|
||||||
|
+ [ resolveCpp(cpp) for cpp in cpps ]):
|
||||||
tempfile = StringIO()
|
tempfile = StringIO()
|
||||||
CxxCodeGen(tempfile).cgen(hdr)
|
CxxCodeGen(tempfile).cgen(ast)
|
||||||
writeifmodified(tempfile.getvalue(), file)
|
writeifmodified(tempfile.getvalue(), filename)
|
||||||
|
|
||||||
|
|
||||||
def genipdl(ast, outdir):
|
def genipdl(ast, outdir):
|
||||||
return IPDLCodeGen().cgen(ast)
|
return IPDLCodeGen().cgen(ast)
|
||||||
|
|
||||||
|
|
||||||
def writeifmodified(contents, file):
|
def writeifmodified(contents, file):
|
||||||
dir = os.path.dirname(file)
|
dir = os.path.dirname(file)
|
||||||
os.path.exists(dir) or os.makedirs(dir)
|
os.path.exists(dir) or os.makedirs(dir)
|
||||||
|
|
|
@ -67,6 +67,7 @@ Includes = (
|
||||||
'base/basictypes.h',
|
'base/basictypes.h',
|
||||||
'prtime.h',
|
'prtime.h',
|
||||||
'nscore.h',
|
'nscore.h',
|
||||||
|
'IPCMessageStart.h',
|
||||||
'IPC/IPCMessageUtils.h',
|
'IPC/IPCMessageUtils.h',
|
||||||
'nsStringGlue.h',
|
'nsStringGlue.h',
|
||||||
'nsTArray.h',
|
'nsTArray.h',
|
||||||
|
|
|
@ -77,6 +77,11 @@ class Visitor:
|
||||||
def visitDecl(self, decl):
|
def visitDecl(self, decl):
|
||||||
decl.type.accept(self)
|
decl.type.accept(self)
|
||||||
|
|
||||||
|
def visitParam(self, param):
|
||||||
|
self.visitDecl(param)
|
||||||
|
if param.default is not None:
|
||||||
|
param.default.accept(self)
|
||||||
|
|
||||||
def visitClass(self, cls):
|
def visitClass(self, cls):
|
||||||
for inherit in cls.inherits:
|
for inherit in cls.inherits:
|
||||||
inherit.accept(self)
|
inherit.accept(self)
|
||||||
|
@ -398,6 +403,14 @@ class Decl(Node):
|
||||||
def __deepcopy__(self, memo):
|
def __deepcopy__(self, memo):
|
||||||
return Decl(copy.deepcopy(self.type, memo), self.name)
|
return Decl(copy.deepcopy(self.type, memo), self.name)
|
||||||
|
|
||||||
|
class Param(Decl):
|
||||||
|
def __init__(self, type, name, default=None):
|
||||||
|
Decl.__init__(self, type, name)
|
||||||
|
self.default = default
|
||||||
|
def __deepcopy__(self, memo):
|
||||||
|
return Param(copy.deepcopy(self.type, memo), self.name,
|
||||||
|
copy.deepcopy(self.default, memo))
|
||||||
|
|
||||||
##------------------------------
|
##------------------------------
|
||||||
# class stuff
|
# class stuff
|
||||||
class Class(Block):
|
class Class(Block):
|
||||||
|
@ -486,6 +499,11 @@ class DestructorDecl(MethodDecl):
|
||||||
def __init__(self, name, virtual=0):
|
def __init__(self, name, virtual=0):
|
||||||
MethodDecl.__init__(self, name, params=[ ], ret=None,
|
MethodDecl.__init__(self, name, params=[ ], ret=None,
|
||||||
virtual=virtual)
|
virtual=virtual)
|
||||||
|
|
||||||
|
def __deepcopy__(self, memo):
|
||||||
|
return DestructorDecl(self.name, self.virtual)
|
||||||
|
|
||||||
|
|
||||||
class DestructorDefn(MethodDefn):
|
class DestructorDefn(MethodDefn):
|
||||||
def __init__(self, decl): MethodDefn.__init__(self, decl)
|
def __init__(self, decl): MethodDefn.__init__(self, decl)
|
||||||
|
|
||||||
|
|
|
@ -136,6 +136,12 @@ class CxxCodeGen(CodePrinter, Visitor):
|
||||||
d.type.nmemb.accept(self)
|
d.type.nmemb.accept(self)
|
||||||
self.write(']')
|
self.write(']')
|
||||||
|
|
||||||
|
def visitParam(self, p):
|
||||||
|
self.visitDecl(p)
|
||||||
|
if p.default is not None:
|
||||||
|
self.write(' = ')
|
||||||
|
p.default.accept(self)
|
||||||
|
|
||||||
def visitClass(self, c):
|
def visitClass(self, c):
|
||||||
if c.specializes is not None:
|
if c.specializes is not None:
|
||||||
self.printdentln('template<>')
|
self.printdentln('template<>')
|
||||||
|
@ -258,7 +264,12 @@ class CxxCodeGen(CodePrinter, Visitor):
|
||||||
def visitDestructorDecl(self, dd):
|
def visitDestructorDecl(self, dd):
|
||||||
if dd.virtual:
|
if dd.virtual:
|
||||||
self.write('virtual ')
|
self.write('virtual ')
|
||||||
self.write('~'+ dd.name +'()')
|
|
||||||
|
# hack alert
|
||||||
|
parts = dd.name.split('::')
|
||||||
|
parts[-1] = '~'+ parts[-1]
|
||||||
|
|
||||||
|
self.write('::'.join(parts) +'()')
|
||||||
|
|
||||||
def visitDestructorDefn(self, dd):
|
def visitDestructorDefn(self, dd):
|
||||||
self.printdent()
|
self.printdent()
|
||||||
|
|
|
@ -48,7 +48,8 @@ EMIT_LOGGING_CODE = ('win32' == sys.platform)
|
||||||
##
|
##
|
||||||
class LowerToCxx:
|
class LowerToCxx:
|
||||||
def lower(self, tu):
|
def lower(self, tu):
|
||||||
'''returns a list of File representing the lowered form of |tu|'''
|
'''returns |[ header: File ], [ cpp : File ]| representing the
|
||||||
|
lowered form of |tu|'''
|
||||||
# annotate the AST with IPDL/C++ IR-type stuff used later
|
# annotate the AST with IPDL/C++ IR-type stuff used later
|
||||||
tu.accept(_DecorateWithCxxStuff())
|
tu.accept(_DecorateWithCxxStuff())
|
||||||
|
|
||||||
|
@ -57,13 +58,15 @@ class LowerToCxx:
|
||||||
pheader = File(pname +'.h')
|
pheader = File(pname +'.h')
|
||||||
_GenerateProtocolHeader().lower(tu, pheader)
|
_GenerateProtocolHeader().lower(tu, pheader)
|
||||||
|
|
||||||
parentheader = File(pname +'Parent.h')
|
parentheader, parentcpp = File(pname +'Parent.h'), File(pname +'Parent.cpp')
|
||||||
_GenerateProtocolParentHeader().lower(tu, pname+'Parent', parentheader)
|
_GenerateProtocolParentCode().lower(
|
||||||
|
tu, pname+'Parent', parentheader, parentcpp)
|
||||||
|
|
||||||
childheader = File(pname +'Child.h')
|
childheader, childcpp = File(pname +'Child.h'), File(pname +'Child.cpp')
|
||||||
_GenerateProtocolChildHeader().lower(tu, pname+'Child', childheader)
|
_GenerateProtocolChildCode().lower(
|
||||||
|
tu, pname+'Child', childheader, childcpp)
|
||||||
|
|
||||||
return pheader, parentheader, childheader
|
return [ pheader, parentheader, childheader ], [ parentcpp, childcpp ]
|
||||||
|
|
||||||
|
|
||||||
##-----------------------------------------------------------------------------
|
##-----------------------------------------------------------------------------
|
||||||
|
@ -75,10 +78,14 @@ _FREED_ACTOR_ID = ExprLiteral.ONE
|
||||||
|
|
||||||
class _struct: pass
|
class _struct: pass
|
||||||
|
|
||||||
def _protocolHeaderBaseFilename(p):
|
def _protocolHeaderName(p, side=''):
|
||||||
|
if side: side = side.title()
|
||||||
|
base = p.name + side
|
||||||
|
|
||||||
|
|
||||||
pfx = '/'.join([ ns.name for ns in p.namespaces ])
|
pfx = '/'.join([ ns.name for ns in p.namespaces ])
|
||||||
if pfx: return pfx +'/'+ p.name
|
if pfx: return pfx +'/'+ base
|
||||||
else: return p.name
|
else: return base
|
||||||
|
|
||||||
def _includeGuardMacroName(headerfile):
|
def _includeGuardMacroName(headerfile):
|
||||||
return re.sub(r'[./]', '_', headerfile.name)
|
return re.sub(r'[./]', '_', headerfile.name)
|
||||||
|
@ -356,7 +363,9 @@ def _killProcess(pid):
|
||||||
# Results that IPDL-generated code returns back to *Channel code.
|
# Results that IPDL-generated code returns back to *Channel code.
|
||||||
# Users never see these
|
# Users never see these
|
||||||
class _Result:
|
class _Result:
|
||||||
Type = Type('Result')
|
@staticmethod
|
||||||
|
def Type():
|
||||||
|
return Type('Result')
|
||||||
|
|
||||||
Processed = ExprVar('MsgProcessed')
|
Processed = ExprVar('MsgProcessed')
|
||||||
NotKnown = ExprVar('MsgNotKnown')
|
NotKnown = ExprVar('MsgNotKnown')
|
||||||
|
@ -2270,58 +2279,138 @@ class _FindFriends(ipdl.ast.Visitor):
|
||||||
yield actor
|
yield actor
|
||||||
|
|
||||||
|
|
||||||
class _GenerateProtocolActorHeader(ipdl.ast.Visitor):
|
class _GenerateProtocolActorCode(ipdl.ast.Visitor):
|
||||||
def __init__(self, myside):
|
def __init__(self, myside):
|
||||||
self.side = myside # "parent" or "child"
|
self.side = myside # "parent" or "child"
|
||||||
self.prettyside = myside.title()
|
self.prettyside = myside.title()
|
||||||
self.clsname = None
|
self.clsname = None
|
||||||
self.protocol = None
|
self.protocol = None
|
||||||
self.file = None
|
self.hdrfile = None
|
||||||
|
self.cppfile = None
|
||||||
self.ns = None
|
self.ns = None
|
||||||
self.cls = None
|
self.cls = None
|
||||||
self.includedActorTypedefs = [ ]
|
self.includedActorTypedefs = [ ]
|
||||||
|
self.protocolCxxIncludes = [ ]
|
||||||
|
|
||||||
def lower(self, tu, clsname, cxxHeaderFile):
|
def lower(self, tu, clsname, cxxHeaderFile, cxxFile):
|
||||||
self.clsname = clsname
|
self.clsname = clsname
|
||||||
self.file = cxxHeaderFile
|
self.hdrfile = cxxHeaderFile
|
||||||
|
self.cppfile = cxxFile
|
||||||
tu.accept(self)
|
tu.accept(self)
|
||||||
|
|
||||||
def visitTranslationUnit(self, tu):
|
def standardTypedefs(self):
|
||||||
f = self.file
|
return [
|
||||||
|
Typedef(Type('IPC::Message'), 'Message'),
|
||||||
|
Typedef(Type(self.protocol.channelName()), 'Channel'),
|
||||||
|
Typedef(Type(self.protocol.fqListenerName()), 'ChannelListener'),
|
||||||
|
Typedef(Type('base::ProcessHandle'), 'ProcessHandle')
|
||||||
|
]
|
||||||
|
|
||||||
f.addthing(Whitespace('''//
|
|
||||||
|
def visitTranslationUnit(self, tu):
|
||||||
|
self.protocol = tu.protocol
|
||||||
|
|
||||||
|
hf = self.hdrfile
|
||||||
|
cf = self.cppfile
|
||||||
|
|
||||||
|
disclaimer = Whitespace('''//
|
||||||
// Automatically generated by ipdlc.
|
// Automatically generated by ipdlc.
|
||||||
// Edit at your own risk
|
// Edit at your own risk
|
||||||
//
|
//
|
||||||
|
|
||||||
'''))
|
''')
|
||||||
f.addthings(_includeGuardStart(f))
|
# make the C++ header
|
||||||
f.addthings([
|
hf.addthings(
|
||||||
|
[ disclaimer ]
|
||||||
|
+ _includeGuardStart(hf)
|
||||||
|
+[
|
||||||
Whitespace.NL,
|
Whitespace.NL,
|
||||||
CppDirective(
|
CppDirective(
|
||||||
'include',
|
'include',
|
||||||
'"'+ _protocolHeaderBaseFilename(tu.protocol) +'.h"') ])
|
'"'+ _protocolHeaderName(tu.protocol) +'.h"')
|
||||||
|
])
|
||||||
self.protocol = tu.protocol
|
|
||||||
|
|
||||||
for pinc in tu.protocolIncludes:
|
for pinc in tu.protocolIncludes:
|
||||||
pinc.accept(self)
|
pinc.accept(self)
|
||||||
|
|
||||||
|
# this generates the actor's full impl in self.cls
|
||||||
tu.protocol.accept(self)
|
tu.protocol.accept(self)
|
||||||
|
|
||||||
f.addthing(Whitespace.NL)
|
clsdecl, clsdefn = _ClassDeclDefn().split(self.cls)
|
||||||
f.addthings(_includeGuardEnd(f))
|
|
||||||
|
# XXX damn C++ ... return types in the method defn aren't in
|
||||||
|
# class scope
|
||||||
|
for stmt in clsdefn.stmts:
|
||||||
|
if isinstance(stmt, MethodDefn):
|
||||||
|
if stmt.decl.ret and stmt.decl.ret.name == 'Result':
|
||||||
|
stmt.decl.ret.name = clsdecl.name +'::'+ stmt.decl.ret.name
|
||||||
|
|
||||||
|
def makeNamespace(p, file):
|
||||||
|
if 0 == len(p.namespaces):
|
||||||
|
return file
|
||||||
|
ns = Namespace(p.namespaces[-1].name)
|
||||||
|
outerns = _putInNamespaces(ns, p.namespaces[:-1])
|
||||||
|
file.addthing(outerns)
|
||||||
|
return ns
|
||||||
|
|
||||||
|
hdrns = makeNamespace(self.protocol, self.hdrfile)
|
||||||
|
hdrns.addstmts([
|
||||||
|
Whitespace.NL,
|
||||||
|
Whitespace.NL,
|
||||||
|
clsdecl,
|
||||||
|
Whitespace.NL,
|
||||||
|
Whitespace.NL
|
||||||
|
])
|
||||||
|
|
||||||
|
self.hdrfile.addthings(
|
||||||
|
([
|
||||||
|
Whitespace.NL,
|
||||||
|
CppDirective('if', '0') ])
|
||||||
|
+ _GenerateSkeletonImpl(
|
||||||
|
_actorName(self.protocol.name, self.side)[1:],
|
||||||
|
self.protocol.namespaces).fromclass(self.cls)
|
||||||
|
+([
|
||||||
|
CppDirective('endif', '// if 0'),
|
||||||
|
Whitespace.NL ])
|
||||||
|
+ _includeGuardEnd(hf))
|
||||||
|
|
||||||
|
# make the .cpp file
|
||||||
|
cf.addthings((
|
||||||
|
[ disclaimer,
|
||||||
|
Whitespace.NL,
|
||||||
|
CppDirective(
|
||||||
|
'include',
|
||||||
|
'"'+ _protocolHeaderName(self.protocol, self.side) +'.h"'),
|
||||||
|
Whitespace.NL
|
||||||
|
]
|
||||||
|
+ self.protocolCxxIncludes
|
||||||
|
+ [ Whitespace.NL ]
|
||||||
|
+ self.standardTypedefs()
|
||||||
|
+ self.includedActorTypedefs
|
||||||
|
+ tu.protocol.decl.cxxtypedefs
|
||||||
|
+ [ Whitespace.NL ]))
|
||||||
|
|
||||||
|
cppns = makeNamespace(self.protocol, cf)
|
||||||
|
cppns.addstmts([
|
||||||
|
Whitespace.NL,
|
||||||
|
Whitespace.NL,
|
||||||
|
clsdefn,
|
||||||
|
Whitespace.NL,
|
||||||
|
Whitespace.NL
|
||||||
|
])
|
||||||
|
|
||||||
|
|
||||||
def visitProtocolInclude(self, pi):
|
def visitProtocolInclude(self, pi):
|
||||||
ip = pi.tu.protocol
|
ip = pi.tu.protocol
|
||||||
|
|
||||||
if self.protocol.decl.type.isManagerOf(ip.decl.type):
|
self.hdrfile.addthings([
|
||||||
self.file.addthing(
|
_makeForwardDecl(ip.decl.type, self.side),
|
||||||
|
Whitespace.NL
|
||||||
|
])
|
||||||
|
self.protocolCxxIncludes.append(
|
||||||
CppDirective(
|
CppDirective(
|
||||||
'include',
|
'include',
|
||||||
'"%s%s.h"'% (_protocolHeaderBaseFilename(ip),
|
'"%s.h"'% (_protocolHeaderName(ip, self.side))))
|
||||||
self.prettyside)))
|
|
||||||
|
|
||||||
if ip.decl.fullname is not None:
|
if ip.decl.fullname is not None:
|
||||||
self.includedActorTypedefs.append(Typedef(
|
self.includedActorTypedefs.append(Typedef(
|
||||||
|
@ -2330,7 +2419,7 @@ class _GenerateProtocolActorHeader(ipdl.ast.Visitor):
|
||||||
|
|
||||||
|
|
||||||
def visitProtocol(self, p):
|
def visitProtocol(self, p):
|
||||||
self.file.addthings([
|
self.hdrfile.addthings([
|
||||||
CppDirective('ifdef', 'DEBUG'),
|
CppDirective('ifdef', 'DEBUG'),
|
||||||
CppDirective('include', '"prenv.h"'),
|
CppDirective('include', '"prenv.h"'),
|
||||||
CppDirective('endif', '// DEBUG')
|
CppDirective('endif', '// DEBUG')
|
||||||
|
@ -2340,9 +2429,9 @@ class _GenerateProtocolActorHeader(ipdl.ast.Visitor):
|
||||||
|
|
||||||
# FIXME: all actors impl Iface for now
|
# FIXME: all actors impl Iface for now
|
||||||
if p.decl.type.isManager() or 1:
|
if p.decl.type.isManager() or 1:
|
||||||
self.file.addthing(CppDirective('include', '"base/id_map.h"'))
|
self.hdrfile.addthing(CppDirective('include', '"base/id_map.h"'))
|
||||||
|
|
||||||
self.file.addthings([
|
self.hdrfile.addthings([
|
||||||
CppDirective('include', '"'+ p.channelHeaderFile() +'"'),
|
CppDirective('include', '"'+ p.channelHeaderFile() +'"'),
|
||||||
Whitespace.NL ])
|
Whitespace.NL ])
|
||||||
|
|
||||||
|
@ -2356,7 +2445,7 @@ class _GenerateProtocolActorHeader(ipdl.ast.Visitor):
|
||||||
friends.add(p.decl.type.manager)
|
friends.add(p.decl.type.manager)
|
||||||
|
|
||||||
for friend in friends:
|
for friend in friends:
|
||||||
self.file.addthings([
|
self.hdrfile.addthings([
|
||||||
Whitespace.NL,
|
Whitespace.NL,
|
||||||
_makeForwardDecl(friend, self.prettyside),
|
_makeForwardDecl(friend, self.prettyside),
|
||||||
Whitespace.NL
|
Whitespace.NL
|
||||||
|
@ -2366,15 +2455,6 @@ class _GenerateProtocolActorHeader(ipdl.ast.Visitor):
|
||||||
self.prettyside)),
|
self.prettyside)),
|
||||||
Whitespace.NL ])
|
Whitespace.NL ])
|
||||||
|
|
||||||
# construct the namespace into which we'll stick all our decls
|
|
||||||
if 0 == len(p.namespaces):
|
|
||||||
self.ns = self.file
|
|
||||||
else:
|
|
||||||
self.ns = Namespace(p.namespaces[-1].name)
|
|
||||||
outerns = _putInNamespaces(self.ns, p.namespaces[:-1])
|
|
||||||
self.file.addthing(outerns)
|
|
||||||
self.ns.addstmts([ Whitespace.NL, Whitespace.NL ])
|
|
||||||
|
|
||||||
self.cls.addstmt(Label.PROTECTED)
|
self.cls.addstmt(Label.PROTECTED)
|
||||||
for typedef in p.cxxTypedefs():
|
for typedef in p.cxxTypedefs():
|
||||||
self.cls.addstmt(typedef)
|
self.cls.addstmt(typedef)
|
||||||
|
@ -2420,14 +2500,11 @@ class _GenerateProtocolActorHeader(ipdl.ast.Visitor):
|
||||||
|
|
||||||
self.cls.addstmt(Whitespace.NL)
|
self.cls.addstmt(Whitespace.NL)
|
||||||
|
|
||||||
self.cls.addstmts([
|
self.cls.addstmts((
|
||||||
Label.PRIVATE,
|
[ Label.PRIVATE ]
|
||||||
Typedef(Type('IPC::Message'), 'Message'),
|
+ self.standardTypedefs()
|
||||||
Typedef(Type(p.channelName()), 'Channel'),
|
+ [ Whitespace.NL ]
|
||||||
Typedef(Type(p.fqListenerName()), 'ChannelListener'),
|
))
|
||||||
Typedef(Type('base::ProcessHandle'), 'ProcessHandle'),
|
|
||||||
Whitespace.NL,
|
|
||||||
])
|
|
||||||
|
|
||||||
self.cls.addstmt(Label.PUBLIC)
|
self.cls.addstmt(Label.PUBLIC)
|
||||||
# Actor()
|
# Actor()
|
||||||
|
@ -2467,8 +2544,9 @@ class _GenerateProtocolActorHeader(ipdl.ast.Visitor):
|
||||||
params=[ Decl(Type('Channel::Transport', ptr=True),
|
params=[ Decl(Type('Channel::Transport', ptr=True),
|
||||||
aTransportVar.name),
|
aTransportVar.name),
|
||||||
Decl(Type('ProcessHandle'), processvar.name),
|
Decl(Type('ProcessHandle'), processvar.name),
|
||||||
Decl(Type('MessageLoop', ptr=True),
|
Param(Type('MessageLoop', ptr=True),
|
||||||
aThreadVar.name +' = 0') ],
|
aThreadVar.name,
|
||||||
|
default=ExprLiteral.NULL) ],
|
||||||
ret=Type.BOOL))
|
ret=Type.BOOL))
|
||||||
|
|
||||||
openmeth.addstmts([
|
openmeth.addstmts([
|
||||||
|
@ -2530,7 +2608,7 @@ class _GenerateProtocolActorHeader(ipdl.ast.Visitor):
|
||||||
replyvar.name))
|
replyvar.name))
|
||||||
|
|
||||||
method = MethodDefn(MethodDecl(name, virtual=True,
|
method = MethodDefn(MethodDecl(name, virtual=True,
|
||||||
params=params, ret=_Result.Type))
|
params=params, ret=_Result.Type()))
|
||||||
if dispatches:
|
if dispatches:
|
||||||
routevar = ExprVar('__route')
|
routevar = ExprVar('__route')
|
||||||
routedecl = StmtDecl(
|
routedecl = StmtDecl(
|
||||||
|
@ -2649,17 +2727,6 @@ class _GenerateProtocolActorHeader(ipdl.ast.Visitor):
|
||||||
StmtDecl(Decl(_shmemIdType(), p.lastShmemIdVar().name))
|
StmtDecl(Decl(_shmemIdType(), p.lastShmemIdVar().name))
|
||||||
])
|
])
|
||||||
|
|
||||||
self.ns.addstmts([ self.cls, Whitespace.NL, Whitespace.NL ])
|
|
||||||
|
|
||||||
# generate skeleton implementation of abstract actor class
|
|
||||||
self.file.addthing(CppDirective('if', '0'))
|
|
||||||
|
|
||||||
genskeleton = _GenerateSkeletonImpl()
|
|
||||||
genskeleton.fromclass(self.cls)
|
|
||||||
self.file.addthings(genskeleton.stuff)
|
|
||||||
|
|
||||||
self.file.addthing(CppDirective('endif', '// if 0'))
|
|
||||||
|
|
||||||
|
|
||||||
def implementManagerIface(self):
|
def implementManagerIface(self):
|
||||||
p = self.protocol
|
p = self.protocol
|
||||||
|
@ -3438,9 +3505,9 @@ class _GenerateProtocolActorHeader(ipdl.ast.Visitor):
|
||||||
ExprVar('stderr') ])) ])
|
ExprVar('stderr') ])) ])
|
||||||
|
|
||||||
|
|
||||||
class _GenerateProtocolParentHeader(_GenerateProtocolActorHeader):
|
class _GenerateProtocolParentCode(_GenerateProtocolActorCode):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
_GenerateProtocolActorHeader.__init__(self, 'parent')
|
_GenerateProtocolActorCode.__init__(self, 'parent')
|
||||||
|
|
||||||
def sendsMessage(self, md):
|
def sendsMessage(self, md):
|
||||||
return not md.decl.type.isIn()
|
return not md.decl.type.isIn()
|
||||||
|
@ -3448,9 +3515,9 @@ class _GenerateProtocolParentHeader(_GenerateProtocolActorHeader):
|
||||||
def receivesMessage(self, md):
|
def receivesMessage(self, md):
|
||||||
return md.decl.type.isInout() or md.decl.type.isIn()
|
return md.decl.type.isInout() or md.decl.type.isIn()
|
||||||
|
|
||||||
class _GenerateProtocolChildHeader(_GenerateProtocolActorHeader):
|
class _GenerateProtocolChildCode(_GenerateProtocolActorCode):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
_GenerateProtocolActorHeader.__init__(self, 'child')
|
_GenerateProtocolActorCode.__init__(self, 'child')
|
||||||
|
|
||||||
def sendsMessage(self, md):
|
def sendsMessage(self, md):
|
||||||
return not md.decl.type.isOut()
|
return not md.decl.type.isOut()
|
||||||
|
@ -3460,29 +3527,62 @@ class _GenerateProtocolChildHeader(_GenerateProtocolActorHeader):
|
||||||
|
|
||||||
|
|
||||||
##-----------------------------------------------------------------------------
|
##-----------------------------------------------------------------------------
|
||||||
## Bonus (inessential) passes
|
## Utility passes
|
||||||
##
|
##
|
||||||
|
|
||||||
|
class _ClassDeclDefn:
|
||||||
|
def split(self, cls):
|
||||||
|
"""Warning: destructively splits |cls|!"""
|
||||||
|
defns = Block()
|
||||||
|
|
||||||
|
for i, stmt in enumerate(cls.stmts):
|
||||||
|
if isinstance(stmt, MethodDefn):
|
||||||
|
decl, defn = self.splitMethodDefn(stmt, cls.name)
|
||||||
|
cls.stmts[i] = StmtDecl(decl)
|
||||||
|
defns.addstmts([ defn, Whitespace.NL ])
|
||||||
|
|
||||||
|
return cls, defns
|
||||||
|
|
||||||
|
def splitMethodDefn(self, md, clsname):
|
||||||
|
saveddecl = deepcopy(md.decl)
|
||||||
|
md.decl.name = (clsname +'::'+ md.decl.name)
|
||||||
|
md.decl.virtual = 0
|
||||||
|
md.decl.static = 0
|
||||||
|
for param in md.decl.params:
|
||||||
|
if isinstance(param, Param):
|
||||||
|
param.default = None
|
||||||
|
return saveddecl, md
|
||||||
|
|
||||||
|
|
||||||
|
# XXX this is tantalizingly similar to _SplitDeclDefn, but just
|
||||||
|
# different enough that I don't see the need to define
|
||||||
|
# _GenerateSkeleton in terms of that
|
||||||
class _GenerateSkeletonImpl(Visitor):
|
class _GenerateSkeletonImpl(Visitor):
|
||||||
def __init__(self, name='ActorImpl'):
|
def __init__(self, name, namespaces):
|
||||||
self.name = name
|
self.name = name
|
||||||
self.stuff = [ ]
|
|
||||||
self.cls = None
|
self.cls = None
|
||||||
self.methodimpls = [ ]
|
self.namespaces = namespaces
|
||||||
|
self.methodimpls = Block()
|
||||||
|
|
||||||
def fromclass(self, cls):
|
def fromclass(self, cls):
|
||||||
cls.accept(self)
|
cls.accept(self)
|
||||||
self.stuff.append(Whitespace('''
|
|
||||||
|
nsclass = _putInNamespaces(self.cls, self.namespaces)
|
||||||
|
nsmethodimpls = _putInNamespaces(self.methodimpls, self.namespaces)
|
||||||
|
|
||||||
|
return [
|
||||||
|
Whitespace('''
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Skeleton implementation of abstract actor class
|
// Skeleton implementation of abstract actor class
|
||||||
|
|
||||||
'''))
|
'''),
|
||||||
self.stuff.append(Whitespace('// Header file contents\n'))
|
Whitespace('// Header file contents\n'),
|
||||||
self.stuff.append(self.cls)
|
nsclass,
|
||||||
|
Whitespace.NL,
|
||||||
|
Whitespace('\n// C++ file contents\n'),
|
||||||
|
nsmethodimpls
|
||||||
|
]
|
||||||
|
|
||||||
self.stuff.append(Whitespace.NL)
|
|
||||||
self.stuff.append(Whitespace('\n// C++ file contents\n'))
|
|
||||||
self.stuff.extend(self.methodimpls)
|
|
||||||
|
|
||||||
def visitClass(self, cls):
|
def visitClass(self, cls):
|
||||||
self.cls = Class(self.name, inherits=[ Inherit(Type(cls.name)) ])
|
self.cls = Class(self.name, inherits=[ Inherit(Type(cls.name)) ])
|
||||||
|
@ -3521,8 +3621,7 @@ class _GenerateSkeletonImpl(Visitor):
|
||||||
self.addmethodimpl(dtor)
|
self.addmethodimpl(dtor)
|
||||||
|
|
||||||
def addmethodimpl(self, impl):
|
def addmethodimpl(self, impl):
|
||||||
self.methodimpls.append(impl)
|
self.methodimpls.addstmts([ impl, Whitespace.NL ])
|
||||||
self.methodimpls.append(Whitespace.NL)
|
|
||||||
|
|
||||||
def implname(self, method):
|
def implname(self, method):
|
||||||
return self.name +'::'+ method
|
return self.name +'::'+ method
|
||||||
|
|
|
@ -0,0 +1,76 @@
|
||||||
|
/* -*- Mode: C++; c-basic-offset: 2; indent-tabs-mode: nil; tab-width: 8 -*- */
|
||||||
|
/* ***** 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 IPC.
|
||||||
|
*
|
||||||
|
* The Initial Developer of the Original Code is
|
||||||
|
* The Mozilla Foundation
|
||||||
|
* Portions created by the Initial Developer are Copyright (C) 2009
|
||||||
|
* the Initial Developer. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
* Chris Jones <jones.chris.g@gmail.com>.
|
||||||
|
*
|
||||||
|
* Alternatively, the contents of this file may be used under the terms of
|
||||||
|
* either 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 ***** */
|
||||||
|
|
||||||
|
#ifndef mozilla__ipdltest_IPDLUnitTestTypes_h
|
||||||
|
#define mozilla__ipdltest_IPDLUnitTestTypes_h
|
||||||
|
|
||||||
|
|
||||||
|
namespace mozilla {
|
||||||
|
namespace _ipdltest {
|
||||||
|
|
||||||
|
struct DirtyRect
|
||||||
|
{
|
||||||
|
int x; int y; int w; int h;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace IPC {
|
||||||
|
template<>
|
||||||
|
struct ParamTraits<mozilla::_ipdltest::DirtyRect>
|
||||||
|
{
|
||||||
|
typedef mozilla::_ipdltest::DirtyRect paramType;
|
||||||
|
static void Write(Message* aMsg, const paramType& aParam) {
|
||||||
|
WriteParam(aMsg, aParam.x);
|
||||||
|
WriteParam(aMsg, aParam.y);
|
||||||
|
WriteParam(aMsg, aParam.w);
|
||||||
|
WriteParam(aMsg, aParam.h);
|
||||||
|
}
|
||||||
|
static bool Read(const Message* aMsg, void** aIter, paramType* aResult)
|
||||||
|
{
|
||||||
|
return (ReadParam(aMsg, aIter, &aResult->x) &&
|
||||||
|
ReadParam(aMsg, aIter, &aResult->y) &&
|
||||||
|
ReadParam(aMsg, aIter, &aResult->w) &&
|
||||||
|
ReadParam(aMsg, aIter, &aResult->h));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif // ifndef mozilla__ipdltest_IPDLUnitTestTypes_h
|
|
@ -49,6 +49,7 @@ EXPORTS_NAMESPACES = mozilla/_ipdltest
|
||||||
EXPORTS_mozilla/_ipdltest = \
|
EXPORTS_mozilla/_ipdltest = \
|
||||||
IPDLUnitTests.h \
|
IPDLUnitTests.h \
|
||||||
IPDLUnitTestThreadChild.h \
|
IPDLUnitTestThreadChild.h \
|
||||||
|
IPDLUnitTestTypes.h \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
||||||
LIBRARY_NAME = $(MODULE)_s
|
LIBRARY_NAME = $(MODULE)_s
|
||||||
|
@ -78,7 +79,6 @@ CPPSRCS = \
|
||||||
$(IPDLTESTSRCS) \
|
$(IPDLTESTSRCS) \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
||||||
|
|
||||||
include $(topsrcdir)/config/config.mk
|
include $(topsrcdir)/config/config.mk
|
||||||
include $(topsrcdir)/ipc/chromium/chromium-config.mk
|
include $(topsrcdir)/ipc/chromium/chromium-config.mk
|
||||||
include $(topsrcdir)/config/rules.mk
|
include $(topsrcdir)/config/rules.mk
|
||||||
|
|
|
@ -96,6 +96,7 @@ STATIC_LIBS += \
|
||||||
domipc_s \
|
domipc_s \
|
||||||
domplugins_s \
|
domplugins_s \
|
||||||
mozipc_s \
|
mozipc_s \
|
||||||
|
mozipdlgen_s \
|
||||||
chromium_s \
|
chromium_s \
|
||||||
ipcshell_s \
|
ipcshell_s \
|
||||||
gfxipc_s \
|
gfxipc_s \
|
||||||
|
|
|
@ -174,10 +174,6 @@ ifdef ACCESSIBILITY
|
||||||
tier_gecko_dirs += accessible
|
tier_gecko_dirs += accessible
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifdef MOZ_IPDL_TESTS
|
|
||||||
tier_gecko_dirs += ipc/ipdl/test
|
|
||||||
endif
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# tier "toolkit" - xpfe & toolkit
|
# tier "toolkit" - xpfe & toolkit
|
||||||
#
|
#
|
||||||
|
|
|
@ -44,5 +44,5 @@ endif
|
||||||
tier_xpcom_dirs += xpcom
|
tier_xpcom_dirs += xpcom
|
||||||
|
|
||||||
ifdef MOZ_IPC
|
ifdef MOZ_IPC
|
||||||
tier_xpcom_dirs += ipc/ipdl ipc/chromium ipc/glue
|
tier_xpcom_dirs += ipc/chromium ipc/glue
|
||||||
endif
|
endif
|
||||||
|
|
Загрузка…
Ссылка в новой задаче