Bug 1122812 - part 1 - move unified file grouping to UnifiedSources's constructor; r=mshal

UnifiedSources, not the recursivemake backend, should be responsible for
figuring out what unified files to generate, and what those unified
files should contain.
This commit is contained in:
Nathan Froyd 2015-02-05 14:05:36 -05:00
parent 7a931815b6
commit 2729dd8212
11 changed files with 75 additions and 26 deletions

View File

@ -65,7 +65,6 @@ from ..frontend.data import (
from ..util import (
ensureParentDir,
FileAvoidWrite,
group_unified_files,
)
from ..makeutil import Makefile
@ -395,33 +394,17 @@ class RecursiveMakeBackend(CommonBackend):
var = suffix_map[obj.canonical_suffix]
non_unified_var = var[len('UNIFIED_'):]
files_per_unification = obj.files_per_unified_file
do_unify = files_per_unification > 1
# Sorted so output is consistent and we don't bump mtimes.
source_files = list(sorted(obj.files))
if do_unify:
# On Windows, path names have a maximum length of 255 characters,
# so avoid creating extremely long path names.
unified_prefix = mozpath.relpath(backend_file.objdir,
backend_file.environment.topobjdir)
if len(unified_prefix) > 20:
unified_prefix = unified_prefix[-20:].split('/', 1)[-1]
unified_prefix = unified_prefix.replace('/', '_')
suffix = obj.canonical_suffix[1:]
unified_prefix='Unified_%s_%s' % (suffix, unified_prefix)
unified_source_mapping = list(group_unified_files(source_files,
unified_prefix=unified_prefix,
unified_suffix=suffix,
files_per_unified_file=files_per_unification))
self._write_unified_files(unified_source_mapping, backend_file.objdir)
if obj.have_unified_mapping:
self._write_unified_files(obj.unified_source_mapping, backend_file.objdir)
self._add_unified_build_rules(backend_file,
unified_source_mapping,
obj.unified_source_mapping,
unified_files_makefile_variable=var,
include_curdir_build_rules=False)
backend_file.write('%s += $(%s)\n' % (non_unified_var, var))
else:
# Sorted so output is consistent and we don't bump mtimes.
source_files = list(sorted(obj.files))
backend_file.write('%s += %s\n' % (
non_unified_var, ' '.join(source_files)))
elif isinstance(obj, VariablePassthru):

View File

@ -27,6 +27,10 @@ from mozbuild.util import (
import mozpack.path as mozpath
from .context import FinalTargetValue
from ..util import (
group_unified_files,
)
class TreeMetadata(object):
"""Base class for all data being captured."""
@ -778,13 +782,32 @@ class UnifiedSources(BaseSources):
"""Represents files to be compiled in a unified fashion during the build."""
__slots__ = (
'files_per_unified_file',
'have_unified_mapping',
'unified_source_mapping'
)
def __init__(self, context, files, canonical_suffix, files_per_unified_file=16):
BaseSources.__init__(self, context, files, canonical_suffix)
self.files_per_unified_file = files_per_unified_file
self.have_unified_mapping = files_per_unified_file > 1
if self.have_unified_mapping:
# Sorted so output is consistent and we don't bump mtimes.
source_files = list(sorted(self.files))
# On Windows, path names have a maximum length of 255 characters,
# so avoid creating extremely long path names.
unified_prefix = context.relsrcdir
if len(unified_prefix) > 20:
unified_prefix = unified_prefix[-20:].split('/', 1)[-1]
unified_prefix = unified_prefix.replace('/', '_')
suffix = self.canonical_suffix[1:]
unified_prefix='Unified_%s_%s' % (suffix, unified_prefix)
self.unified_source_mapping = list(group_unified_files(source_files,
unified_prefix=unified_prefix,
unified_suffix=suffix,
files_per_unified_file=files_per_unified_file))
class InstallationTarget(ContextDerived):

View File

@ -0,0 +1,21 @@
# -*- Mode: python; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40 -*-
# Any copyright is dedicated to the Public Domain.
# http://creativecommons.org/publicdomain/zero/1.0/
UNIFIED_SOURCES += [
'bar.cxx',
'foo.cpp',
'quux.cc',
]
UNIFIED_SOURCES += [
'objc1.mm',
'objc2.mm',
]
UNIFIED_SOURCES += [
'c1.c',
'c2.c',
]
FILES_PER_UNIFIED_FILE = 1

View File

@ -725,7 +725,29 @@ class TestEmitterBasic(unittest.TestCase):
for suffix, files in expected.items():
sources = suffix_map[suffix]
self.assertEqual(sources.files, files)
self.assertEqual(sources.files_per_unified_file, 32)
self.assertTrue(sources.have_unified_mapping)
def test_unified_sources_non_unified(self):
"""Test that UNIFIED_SOURCES with FILES_PER_UNIFIED_FILE=1 works properly."""
reader = self.reader('unified-sources-non-unified')
objs = self.read_topsrcdir(reader)
self.assertEqual(len(objs), 3)
for o in objs:
self.assertIsInstance(o, UnifiedSources)
suffix_map = {obj.canonical_suffix: obj for obj in objs}
self.assertEqual(len(suffix_map), 3)
expected = {
'.cpp': ['bar.cxx', 'foo.cpp', 'quux.cc'],
'.mm': ['objc1.mm', 'objc2.mm'],
'.c': ['c1.c', 'c2.c'],
}
for suffix, files in expected.items():
sources = suffix_map[suffix]
self.assertEqual(sources.files, files)
self.assertFalse(sources.have_unified_mapping)
if __name__ == '__main__':
main()