зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1437182 - Take IPDL/WebIDL generated sources into account when associating object files with linkables in the emitter. r=gps
MozReview-Commit-ID: BHABdAk3Esm --HG-- extra : rebase_source : 83e344b3b5ab792731ebc137acf24ec2b40059ee
This commit is contained in:
Родитель
d0d19d5199
Коммит
d9c25ac16f
|
@ -231,16 +231,9 @@ class CommonBackend(BuildBackend):
|
||||||
mozpath.join(self.environment.topobjdir, 'dist')
|
mozpath.join(self.environment.topobjdir, 'dist')
|
||||||
)
|
)
|
||||||
self._handle_generated_sources(manager.expected_build_output_files())
|
self._handle_generated_sources(manager.expected_build_output_files())
|
||||||
# Bindings are compiled in unified mode to speed up compilation and
|
self._write_unified_files(webidls.unified_source_mapping, bindings_dir,
|
||||||
# to reduce linker memory size. Note that test bindings are separated
|
|
||||||
# from regular ones so tests bindings aren't shipped.
|
|
||||||
unified_source_mapping = list(group_unified_files(webidls.all_regular_cpp_basenames(),
|
|
||||||
unified_prefix='UnifiedBindings',
|
|
||||||
unified_suffix='cpp',
|
|
||||||
files_per_unified_file=32))
|
|
||||||
self._write_unified_files(unified_source_mapping, bindings_dir,
|
|
||||||
poison_windows_h=True)
|
poison_windows_h=True)
|
||||||
self._handle_webidl_build(bindings_dir, unified_source_mapping,
|
self._handle_webidl_build(bindings_dir, webidls.unified_source_mapping,
|
||||||
webidls,
|
webidls,
|
||||||
manager.expected_build_output_files(),
|
manager.expected_build_output_files(),
|
||||||
manager.GLOBAL_DEFINE_FILES)
|
manager.GLOBAL_DEFINE_FILES)
|
||||||
|
|
|
@ -277,7 +277,7 @@ class WebIDLCollection(ContextDerived):
|
||||||
return [mozpath.splitext(b)[0] for b in self.all_test_basenames()]
|
return [mozpath.splitext(b)[0] for b in self.all_test_basenames()]
|
||||||
|
|
||||||
def all_test_cpp_basenames(self):
|
def all_test_cpp_basenames(self):
|
||||||
return ['%sBinding.cpp' % s for s in self.all_test_stems()]
|
return sorted('%sBinding.cpp' % s for s in self.all_test_stems())
|
||||||
|
|
||||||
def all_static_sources(self):
|
def all_static_sources(self):
|
||||||
return self.sources | self.generated_events_sources | \
|
return self.sources | self.generated_events_sources | \
|
||||||
|
@ -307,6 +307,21 @@ class WebIDLCollection(ContextDerived):
|
||||||
def generated_events_stems(self):
|
def generated_events_stems(self):
|
||||||
return [mozpath.splitext(b)[0] for b in self.generated_events_basenames()]
|
return [mozpath.splitext(b)[0] for b in self.generated_events_basenames()]
|
||||||
|
|
||||||
|
@property
|
||||||
|
def unified_source_mapping(self):
|
||||||
|
# Bindings are compiled in unified mode to speed up compilation and
|
||||||
|
# to reduce linker memory size. Note that test bindings are separated
|
||||||
|
# from regular ones so tests bindings aren't shipped.
|
||||||
|
return list(group_unified_files(self.all_regular_cpp_basenames(),
|
||||||
|
unified_prefix='UnifiedBindings',
|
||||||
|
unified_suffix='cpp',
|
||||||
|
files_per_unified_file=32))
|
||||||
|
|
||||||
|
def all_source_files(self):
|
||||||
|
from mozwebidlcodegen import WebIDLCodegenManager
|
||||||
|
return (sorted(list(WebIDLCodegenManager.GLOBAL_DEFINE_FILES)) +
|
||||||
|
sorted(set(p for p, _ in self.unified_source_mapping)))
|
||||||
|
|
||||||
|
|
||||||
class IPDLCollection(ContextDerived):
|
class IPDLCollection(ContextDerived):
|
||||||
"""Collects IPDL files during the build."""
|
"""Collects IPDL files during the build."""
|
||||||
|
@ -349,6 +364,9 @@ class IPDLCollection(ContextDerived):
|
||||||
unified_suffix='cpp',
|
unified_suffix='cpp',
|
||||||
files_per_unified_file=16))
|
files_per_unified_file=16))
|
||||||
|
|
||||||
|
def all_source_files(self):
|
||||||
|
return sorted(set(p for p, _ in self.unified_source_mapping))
|
||||||
|
|
||||||
|
|
||||||
class LinkageWrongKindError(Exception):
|
class LinkageWrongKindError(Exception):
|
||||||
"""Error thrown when trying to link objects of the wrong kind"""
|
"""Error thrown when trying to link objects of the wrong kind"""
|
||||||
|
|
|
@ -202,7 +202,42 @@ class TreeMetadataEmitter(LoggingMixin):
|
||||||
for o in emit_objs(objs): yield o
|
for o in emit_objs(objs): yield o
|
||||||
|
|
||||||
def _emit_libs_derived(self, contexts):
|
def _emit_libs_derived(self, contexts):
|
||||||
# First do FINAL_LIBRARY linkage.
|
|
||||||
|
# First aggregate idl sources.
|
||||||
|
webidl_attrs = [
|
||||||
|
('GENERATED_EVENTS_WEBIDL_FILES', lambda c: c.generated_events_sources),
|
||||||
|
('GENERATED_WEBIDL_FILES', lambda c: c.generated_sources),
|
||||||
|
('PREPROCESSED_TEST_WEBIDL_FILES', lambda c: c.preprocessed_test_sources),
|
||||||
|
('PREPROCESSED_WEBIDL_FILES', lambda c: c.preprocessed_sources),
|
||||||
|
('TEST_WEBIDL_FILES', lambda c: c.test_sources),
|
||||||
|
('WEBIDL_FILES', lambda c: c.sources),
|
||||||
|
('WEBIDL_EXAMPLE_INTERFACES', lambda c: c.example_interfaces),
|
||||||
|
]
|
||||||
|
ipdl_attrs = [
|
||||||
|
('IPDL_SOURCES', lambda c: c.sources),
|
||||||
|
('PREPROCESSED_IPDL_SOURCES', lambda c: c.preprocessed_sources),
|
||||||
|
]
|
||||||
|
|
||||||
|
idl_sources = {}
|
||||||
|
for root, cls, attrs in ((self.config.substs.get('WEBIDL_ROOT'),
|
||||||
|
WebIDLCollection, webidl_attrs),
|
||||||
|
(self.config.substs.get('IPDL_ROOT'),
|
||||||
|
IPDLCollection, ipdl_attrs)):
|
||||||
|
if root:
|
||||||
|
collection = cls(contexts[root])
|
||||||
|
for var, src_getter in attrs:
|
||||||
|
src_getter(collection).update(self._idls[var])
|
||||||
|
|
||||||
|
idl_sources[root] = collection.all_source_files()
|
||||||
|
if isinstance(collection, WebIDLCollection):
|
||||||
|
# Test webidl sources are added here as a somewhat special
|
||||||
|
# case.
|
||||||
|
idl_sources[mozpath.join(root, 'test')] = [s for s in collection.all_test_cpp_basenames()]
|
||||||
|
|
||||||
|
yield collection
|
||||||
|
|
||||||
|
|
||||||
|
# Next do FINAL_LIBRARY linkage.
|
||||||
for lib in (l for libs in self._libs.values() for l in libs):
|
for lib in (l for libs in self._libs.values() for l in libs):
|
||||||
if not isinstance(lib, (StaticLibrary, RustLibrary)) or not lib.link_into:
|
if not isinstance(lib, (StaticLibrary, RustLibrary)) or not lib.link_into:
|
||||||
continue
|
continue
|
||||||
|
@ -228,9 +263,9 @@ class TreeMetadataEmitter(LoggingMixin):
|
||||||
'\n '.join(l.objdir for l in candidates)),
|
'\n '.join(l.objdir for l in candidates)),
|
||||||
contexts[lib.objdir])
|
contexts[lib.objdir])
|
||||||
|
|
||||||
# Next, USE_LIBS linkage.
|
# ...and USE_LIBS linkage.
|
||||||
for context, obj, variable in self._linkage:
|
for context, obj, variable in self._linkage:
|
||||||
self._link_libraries(context, obj, variable)
|
self._link_libraries(context, obj, variable, idl_sources)
|
||||||
|
|
||||||
def recurse_refs(lib):
|
def recurse_refs(lib):
|
||||||
for o in lib.refs:
|
for o in lib.refs:
|
||||||
|
@ -288,31 +323,6 @@ class TreeMetadataEmitter(LoggingMixin):
|
||||||
for obj in self._binaries.values():
|
for obj in self._binaries.values():
|
||||||
yield obj
|
yield obj
|
||||||
|
|
||||||
webidl_attrs = [
|
|
||||||
('GENERATED_EVENTS_WEBIDL_FILES', lambda c: c.generated_events_sources),
|
|
||||||
('GENERATED_WEBIDL_FILES', lambda c: c.generated_sources),
|
|
||||||
('PREPROCESSED_TEST_WEBIDL_FILES', lambda c: c.preprocessed_test_sources),
|
|
||||||
('PREPROCESSED_WEBIDL_FILES', lambda c: c.preprocessed_sources),
|
|
||||||
('TEST_WEBIDL_FILES', lambda c: c.test_sources),
|
|
||||||
('WEBIDL_FILES', lambda c: c.sources),
|
|
||||||
('WEBIDL_EXAMPLE_INTERFACES', lambda c: c.example_interfaces),
|
|
||||||
]
|
|
||||||
ipdl_attrs = [
|
|
||||||
('IPDL_SOURCES', lambda c: c.sources),
|
|
||||||
('PREPROCESSED_IPDL_SOURCES', lambda c: c.preprocessed_sources),
|
|
||||||
]
|
|
||||||
|
|
||||||
for root, cls, attrs in ((self.config.substs.get('WEBIDL_ROOT'),
|
|
||||||
WebIDLCollection, webidl_attrs),
|
|
||||||
(self.config.substs.get('IPDL_ROOT'),
|
|
||||||
IPDLCollection, ipdl_attrs)):
|
|
||||||
if root:
|
|
||||||
collection = cls(contexts[root])
|
|
||||||
for var, src_getter in attrs:
|
|
||||||
src_getter(collection).update(self._idls[var])
|
|
||||||
|
|
||||||
yield collection
|
|
||||||
|
|
||||||
|
|
||||||
LIBRARY_NAME_VAR = {
|
LIBRARY_NAME_VAR = {
|
||||||
'host': 'HOST_LIBRARY_NAME',
|
'host': 'HOST_LIBRARY_NAME',
|
||||||
|
@ -329,10 +339,15 @@ class TreeMetadataEmitter(LoggingMixin):
|
||||||
'target': 'stdc++compat',
|
'target': 'stdc++compat',
|
||||||
}
|
}
|
||||||
|
|
||||||
def _link_libraries(self, context, obj, variable):
|
def _link_libraries(self, context, obj, variable, extra_sources):
|
||||||
"""Add linkage declarations to a given object."""
|
"""Add linkage declarations to a given object."""
|
||||||
assert isinstance(obj, Linkable)
|
assert isinstance(obj, Linkable)
|
||||||
|
|
||||||
|
if context.objdir in extra_sources:
|
||||||
|
# All "extra sources" are .cpp for the moment, and happen to come
|
||||||
|
# first in order.
|
||||||
|
obj.sources['.cpp'] = extra_sources[context.objdir] + obj.sources['.cpp']
|
||||||
|
|
||||||
for path in context.get(variable, []):
|
for path in context.get(variable, []):
|
||||||
self._link_library(context, obj, variable, path)
|
self._link_library(context, obj, variable, path)
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче