Bug 1386876 - Move visibility flag handling to computed compile flags with templates.
MozReview-Commit-ID: 9hwiCQv8WKU
--- a/build/templates.mozbuild
+++ b/build/templates.mozbuild
@@ -145,11 +145,15 @@ def HostRustLibrary(name, features=None)
if features:
HOST_RUST_LIBRARY_FEATURES = features
@template
def DisableStlWrapping():
COMPILE_FLAGS['STL'] = []
+@template
+def NoVisibilityFlags():
+ COMPILE_FLAGS['VISIBILITY'] = []
+
include('gecko_templates.mozbuild')
include('test_templates.mozbuild')
--- a/config/config.mk
+++ b/config/config.mk
@@ -323,18 +323,18 @@ endif # CLANG_CL
# Use warnings-as-errors if ALLOW_COMPILER_WARNINGS is not set to 1 (which
# includes the case where it's undefined).
ifneq (1,$(ALLOW_COMPILER_WARNINGS))
CXXFLAGS += $(WARNINGS_AS_ERRORS)
CFLAGS += $(WARNINGS_AS_ERRORS)
endif # ALLOW_COMPILER_WARNINGS
-COMPILE_CFLAGS = $(VISIBILITY_FLAGS) $(DEFINES) $(INCLUDES) $(OS_INCLUDES) $(DSO_CFLAGS) $(DSO_PIC_CFLAGS) $(RTL_FLAGS) $(OS_COMPILE_CFLAGS) $(_DEPEND_CFLAGS) $(CFLAGS) $(MOZBUILD_CFLAGS) $(MK_COMPILE_DEFINES)
-COMPILE_CXXFLAGS = $(COMPUTED_CXXFLAGS) $(VISIBILITY_FLAGS) $(DEFINES) $(INCLUDES) $(OS_INCLUDES) $(DSO_CFLAGS) $(DSO_PIC_CFLAGS) $(RTL_FLAGS) $(OS_COMPILE_CXXFLAGS) $(_DEPEND_CFLAGS) $(CXXFLAGS) $(MOZBUILD_CXXFLAGS) $(MK_COMPILE_DEFINES)
+COMPILE_CFLAGS = $(COMPUTED_CFLAGS) $(DEFINES) $(INCLUDES) $(OS_INCLUDES) $(DSO_CFLAGS) $(DSO_PIC_CFLAGS) $(RTL_FLAGS) $(OS_COMPILE_CFLAGS) $(_DEPEND_CFLAGS) $(CFLAGS) $(MOZBUILD_CFLAGS) $(MK_COMPILE_DEFINES)
+COMPILE_CXXFLAGS = $(COMPUTED_CXXFLAGS) $(DEFINES) $(INCLUDES) $(OS_INCLUDES) $(DSO_CFLAGS) $(DSO_PIC_CFLAGS) $(RTL_FLAGS) $(OS_COMPILE_CXXFLAGS) $(_DEPEND_CFLAGS) $(CXXFLAGS) $(MOZBUILD_CXXFLAGS) $(MK_COMPILE_DEFINES)
COMPILE_CMFLAGS = $(OS_COMPILE_CMFLAGS) $(MOZBUILD_CMFLAGS)
COMPILE_CMMFLAGS = $(OS_COMPILE_CMMFLAGS) $(MOZBUILD_CMMFLAGS)
ASFLAGS += $(MOZBUILD_ASFLAGS)
ifndef CROSS_COMPILE
HOST_CFLAGS += $(RTL_FLAGS)
endif
--- a/python/mozbuild/mozbuild/compilation/database.py
+++ b/python/mozbuild/mozbuild/compilation/database.py
@@ -66,17 +66,17 @@ class CompileDBBackend(CommonBackend):
consumed = CommonBackend.consume_object(self, obj)
if consumed:
return True
if isinstance(obj, DirectoryTraversal):
self._envs[obj.objdir] = obj.config
- for var in ('VISIBILITY_FLAGS', 'WARNINGS_AS_ERRORS'):
+ for var in ('WARNINGS_AS_ERRORS',):
value = obj.config.substs.get(var)
if value:
self._local_flags[obj.objdir][var] = value
elif isinstance(obj, (Sources, GeneratedSources)):
# For other sources, include each source file.
for f in obj.files:
self._build_db_line(obj.objdir, obj.relativedir, obj.config, f,
@@ -98,17 +98,17 @@ class CompileDBBackend(CommonBackend):
self._extra_includes[obj.objdir].append(
self._dist_include_testing)
elif isinstance(obj, VariablePassthru):
if obj.variables.get('IS_GYP_DIR'):
self._gyp_dirs.add(obj.objdir)
for var in ('MOZBUILD_CFLAGS', 'MOZBUILD_CXXFLAGS',
'MOZBUILD_CMFLAGS', 'MOZBUILD_CMMFLAGS',
- 'RTL_FLAGS', 'VISIBILITY_FLAGS'):
+ 'RTL_FLAGS'):
if var in obj.variables:
self._local_flags[obj.objdir][var] = obj.variables[var]
if (obj.variables.get('ALLOW_COMPILER_WARNINGS') and
'WARNINGS_AS_ERRORS' in self._local_flags[obj.objdir]):
del self._local_flags[obj.objdir]['WARNINGS_AS_ERRORS']
elif isinstance(obj, PerSourceFlag):
self._per_source_flags[obj.file_name].extend(obj.flags)
@@ -231,21 +231,19 @@ class CompileDBBackend(CommonBackend):
def append_var(name):
value = cenv.substs.get(name)
if not value:
return
if isinstance(value, types.StringTypes):
value = value.split()
db.extend(value)
- if canonical_suffix in ('.mm', '.cpp'):
- db.append('$(COMPUTED_CXXFLAGS)')
+ db.append('$(COMPUTED_%s)' % self.CFLAGS[canonical_suffix])
db.extend((
- '$(VISIBILITY_FLAGS)',
'$(DEFINES)',
'-I%s' % mozpath.join(cenv.topsrcdir, reldir),
'-I%s' % objdir,
'$(LOCAL_INCLUDES)',
'-I%s/dist/include' % cenv.topobjdir,
'$(EXTRA_INCLUDES)',
))
append_var('DSO_CFLAGS')
--- a/python/mozbuild/mozbuild/frontend/context.py
+++ b/python/mozbuild/mozbuild/frontend/context.py
@@ -296,16 +296,18 @@ class InitializedDefines(ContextDerivedV
if value:
self.update(value)
class CompileFlags(ContextDerivedValue, dict):
def __init__(self, context):
self.flag_variables = (
('STL', context.config.substs.get('STL_FLAGS'), ('CXXFLAGS',)),
+ ('VISIBILITY', context.config.substs.get('VISIBILITY_FLAGS'),
+ ('CXXFLAGS', 'CFLAGS')),
)
self._known_keys = set(k for k, v, _ in self.flag_variables)
dict.__init__(self,
((k, TypedList(unicode)(v)) for k, v, _ in self.flag_variables))
def __setitem__(self, key, value):
if key not in self._known_keys:
--- a/python/mozbuild/mozbuild/frontend/emitter.py
+++ b/python/mozbuild/mozbuild/frontend/emitter.py
@@ -930,20 +930,16 @@ class TreeMetadataEmitter(LoggingMixin):
for dll in context['DELAYLOAD_DLLS']])
context['OS_LIBS'].append('delayimp')
for v in ['CFLAGS', 'CXXFLAGS', 'CMFLAGS', 'CMMFLAGS', 'ASFLAGS',
'LDFLAGS', 'HOST_CFLAGS', 'HOST_CXXFLAGS']:
if v in context and context[v]:
passthru.variables['MOZBUILD_' + v] = context[v]
- # NO_VISIBILITY_FLAGS is slightly different
- if context['NO_VISIBILITY_FLAGS']:
- passthru.variables['VISIBILITY_FLAGS'] = ''
-
if isinstance(context, TemplateContext) and context.template == 'Gyp':
passthru.variables['IS_GYP_DIR'] = True
dist_install = context['DIST_INSTALL']
if dist_install is True:
passthru.variables['DIST_INSTALL'] = True
elif dist_install is False:
passthru.variables['NO_DIST_INSTALL'] = True
--- a/python/mozbuild/mozbuild/test/backend/data/variable_passthru/moz.build
+++ b/python/mozbuild/mozbuild/test/backend/data/variable_passthru/moz.build
@@ -1,14 +1,12 @@
# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
# Any copyright is dedicated to the Public Domain.
# http://creativecommons.org/publicdomain/zero/1.0/
-NO_VISIBILITY_FLAGS = True
-
DELAYLOAD_DLLS = ['foo.dll', 'bar.dll']
RCFILE = 'foo.rc'
RESFILE = 'bar.res'
RCINCLUDE = 'bar.rc'
DEFFILE = 'baz.def'
CFLAGS += ['-fno-exceptions', '-w']
--- a/python/mozbuild/mozbuild/test/backend/test_recursivemake.py
+++ b/python/mozbuild/mozbuild/test/backend/test_recursivemake.py
@@ -314,19 +314,16 @@ class TestRecursiveMakeBackend(BackendTe
backend_path = mozpath.join(env.topobjdir, 'backend.mk')
lines = [l.strip() for l in open(backend_path, 'rt').readlines()[2:]]
expected = {
'ALLOW_COMPILER_WARNINGS': [
'ALLOW_COMPILER_WARNINGS := 1',
],
- 'VISIBILITY_FLAGS': [
- 'VISIBILITY_FLAGS :=',
- ],
'RCFILE': [
'RCFILE := foo.rc',
],
'RESFILE': [
'RESFILE := bar.res',
],
'RCINCLUDE': [
'RCINCLUDE := bar.rc',
--- a/python/mozbuild/mozbuild/test/frontend/data/variable-passthru/moz.build
+++ b/python/mozbuild/mozbuild/test/frontend/data/variable-passthru/moz.build
@@ -1,16 +1,14 @@
# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
# Any copyright is dedicated to the Public Domain.
# http://creativecommons.org/publicdomain/zero/1.0/
DIST_INSTALL = False
-NO_VISIBILITY_FLAGS = True
-
DELAYLOAD_DLLS = ['foo.dll', 'bar.dll']
RCFILE = 'foo.rc'
RESFILE = 'bar.res'
RCINCLUDE = 'bar.rc'
DEFFILE = 'baz.def'
CFLAGS += ['-fno-exceptions', '-w']
new file mode 100644
--- /dev/null
+++ b/python/mozbuild/mozbuild/test/frontend/data/visibility-flags/moz.build
@@ -0,0 +1,17 @@
+# Any copyright is dedicated to the Public Domain.
+# http://creativecommons.org/publicdomain/zero/1.0/
+
+@template
+def Library(name):
+ '''Template for libraries.'''
+ LIBRARY_NAME = name
+
+Library('dummy')
+
+@template
+def NoVisibilityFlags():
+ COMPILE_FLAGS['VISIBILITY'] = []
+
+UNIFIED_SOURCES += ['test1.c']
+
+NoVisibilityFlags()
--- a/python/mozbuild/mozbuild/test/frontend/test_emitter.py
+++ b/python/mozbuild/mozbuild/test/frontend/test_emitter.py
@@ -72,16 +72,19 @@ class TestEmitterBasic(unittest.TestCase
os.environ.update(self._old_env)
def reader(self, name, enable_tests=False, extra_substs=None):
substs = dict(
ENABLE_TESTS='1' if enable_tests else '',
BIN_SUFFIX='.prog',
OS_TARGET='WINNT',
COMPILE_ENVIRONMENT='1',
+ STL_FLAGS=['-I/path/to/topobjdir/dist/stl_wrappers'],
+ VISIBILITY_FLAGS=['-include',
+ '$(topsrcdir)/config/gcc_hidden.h'],
)
if extra_substs:
substs.update(extra_substs)
config = MockConfig(mozpath.join(data_path, name), extra_substs=substs)
return BuildReader(config)
def read_topsrcdir(self, reader, filter_common=True):
@@ -177,17 +180,16 @@ class TestEmitterBasic(unittest.TestCase
objs = self.read_topsrcdir(reader)
self.assertEqual(len(objs), 1)
self.assertIsInstance(objs[0], VariablePassthru)
wanted = {
'ALLOW_COMPILER_WARNINGS': True,
'NO_DIST_INSTALL': True,
- 'VISIBILITY_FLAGS': '',
'RCFILE': 'foo.rc',
'RESFILE': 'bar.res',
'RCINCLUDE': 'bar.rc',
'DEFFILE': 'baz.def',
'MOZBUILD_CFLAGS': ['-fno-exceptions', '-w'],
'MOZBUILD_CXXFLAGS': ['-fcxx-exceptions', '-include foo.h'],
'MOZBUILD_LDFLAGS': ['-framework Foo', '-x', '-DELAYLOAD:foo.dll',
'-DELAYLOAD:bar.dll'],
@@ -199,41 +201,45 @@ class TestEmitterBasic(unittest.TestCase
variables = objs[0].variables
maxDiff = self.maxDiff
self.maxDiff = None
self.assertEqual(wanted, variables)
self.maxDiff = maxDiff
def test_compile_flags(self):
- reader = self.reader('compile-flags',
- extra_substs={'STL_FLAGS': ['-I/path/to/objdir/dist/stl_wrappers']})
+ reader = self.reader('compile-flags')
sources, flags, lib = self.read_topsrcdir(reader)
self.assertIsInstance(flags, ComputedFlags)
self.assertEqual(flags.flags['STL'], reader.config.substs['STL_FLAGS'])
+ self.assertEqual(flags.flags['VISIBILITY'], reader.config.substs['VISIBILITY_FLAGS'])
def test_compile_flags_validation(self):
reader = self.reader('compile-flags-field-validation')
with self.assertRaisesRegexp(BuildReaderError, 'Invalid value.'):
self.read_topsrcdir(reader)
reader = self.reader('compile-flags-type-validation')
with self.assertRaisesRegexp(BuildReaderError,
'A list of strings must be provided'):
self.read_topsrcdir(reader)
-
def test_disable_stl_wrapping(self):
- reader = self.reader('disable-stl-wrapping',
- extra_substs={'STL_FLAGS': ['-I/path/to/objdir/dist/stl_wrappers']})
+ reader = self.reader('disable-stl-wrapping')
sources, flags, lib = self.read_topsrcdir(reader)
self.assertIsInstance(flags, ComputedFlags)
self.assertEqual(flags.flags['STL'], [])
+ def test_visibility_flags(self):
+ reader = self.reader('visibility-flags')
+ sources, flags, lib = self.read_topsrcdir(reader)
+ self.assertIsInstance(flags, ComputedFlags)
+ self.assertEqual(flags.flags['VISIBILITY'], [])
+
def test_use_yasm(self):
# When yasm is not available, this should raise.
reader = self.reader('use-yasm')
with self.assertRaisesRegexp(SandboxValidationError,
'yasm is not available'):
self.read_topsrcdir(reader)
# When yasm is available, this should work.