mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
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:
parent
7a931815b6
commit
2729dd8212
@ -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):
|
||||
|
@ -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):
|
||||
|
@ -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
|
@ -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()
|
||||
|
Loading…
Reference in New Issue
Block a user