summaryrefslogtreecommitdiffstats
path: root/build/templates.mozbuild
diff options
context:
space:
mode:
Diffstat (limited to 'build/templates.mozbuild')
-rw-r--r--build/templates.mozbuild220
1 files changed, 220 insertions, 0 deletions
diff --git a/build/templates.mozbuild b/build/templates.mozbuild
new file mode 100644
index 0000000000..8bf5a8bbc0
--- /dev/null
+++ b/build/templates.mozbuild
@@ -0,0 +1,220 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+@template
+def Binary():
+ '''Generic template for target binaries. Meant to be used by other
+ templates.'''
+
+ # Add -llog by default, since we use it all over the place.
+ if CONFIG['OS_TARGET'] == 'Android':
+ OS_LIBS += ['log']
+
+
+@template
+def Program(name):
+ '''Template for program executables.'''
+ PROGRAM = name
+
+ Binary()
+
+
+@template
+def SimplePrograms(names, ext='.cpp'):
+ '''Template for simple program executables.
+
+ Those have a single source with the same base name as the executable.
+ '''
+ SIMPLE_PROGRAMS += names
+ SOURCES += ['%s%s' % (name, ext) for name in names]
+
+ Binary()
+
+
+@template
+def CppUnitTests(names, ext='.cpp'):
+ '''Template for C++ unit tests.
+
+ Those have a single source with the same base name as the executable.
+ '''
+ COMPILE_FLAGS['EXTRA_INCLUDES'] = ['-I%s/dist/include' % TOPOBJDIR,
+ '-I%s/dist/include/testing' % TOPOBJDIR]
+ CPP_UNIT_TESTS += names
+ SOURCES += ['%s%s' % (name, ext) for name in names]
+
+ Binary()
+
+
+@template
+def Library(name):
+ '''Template for libraries.'''
+ LIBRARY_NAME = name
+
+@template
+def AllowCompilerWarnings():
+ COMPILE_FLAGS['WARNINGS_AS_ERRORS'] = []
+ WASM_FLAGS['WARNINGS_AS_ERRORS'] = []
+
+@template
+def DisableCompilerWarnings():
+ # Keep the -Wno-* flags to disable warnings that may be enabled through other means.
+ def filter(flags):
+ return [f for f in flags or [] if f.startswith('-Wno-')]
+ COMPILE_FLAGS['WARNINGS_CFLAGS'] = filter(CONFIG['WARNINGS_CFLAGS'])
+ COMPILE_FLAGS['WARNINGS_CXXFLAGS'] = filter(CONFIG['WARNINGS_CXXFLAGS'])
+ HOST_COMPILE_FLAGS['WARNINGS_CFLAGS'] = filter(CONFIG['WARNINGS_HOST_CFLAGS'])
+ HOST_COMPILE_FLAGS['WARNINGS_CXXFLAGS'] = filter(CONFIG['WARNINGS_HOST_CXXFLAGS'])
+
+@template
+def RustLibrary(name, features=None, output_category=None, is_gkrust=False):
+ '''Template for Rust libraries.'''
+ Library(name)
+
+ IS_RUST_LIBRARY = True
+ # Some Rust build scripts compile C/C++ sources, don't error on warnings for them.
+ AllowCompilerWarnings()
+
+ # And furthermore, don't even show warnings for them, so they don't regress
+ # the Compiler Warnings build metric
+ # <https://developer.mozilla.org/en-US/docs/Mozilla/Performance/Automated_Performance_Testing_and_Sheriffing/Build_Metrics#compiler_warnings>.
+ DisableCompilerWarnings()
+
+ if features:
+ RUST_LIBRARY_FEATURES = features
+
+ if output_category:
+ RUST_LIBRARY_OUTPUT_CATEGORY = output_category
+
+ if is_gkrust:
+ IS_GKRUST = True
+
+
+@template
+def SharedLibrary(name, output_category=None):
+ '''Template for shared libraries.'''
+ Library(name)
+
+ FORCE_SHARED_LIB = True
+
+ if output_category:
+ SHARED_LIBRARY_OUTPUT_CATEGORY = output_category
+
+ Binary()
+
+
+@template
+def Framework(name, output_category=None):
+ '''Template for OSX Frameworks.'''
+ SharedLibrary(name, output_category)
+
+ IS_FRAMEWORK = True
+
+
+@template
+def HostProgram(name):
+ '''Template for build tools executables.'''
+ HOST_PROGRAM = name
+
+
+@template
+def HostSimplePrograms(names, ext='.cpp'):
+ '''Template for simple build tools executables.
+
+ Those have a single source with the same base name as the executable.
+ '''
+ HOST_SIMPLE_PROGRAMS += names
+ HOST_SOURCES += ['%s%s' % (name.replace('host_', ''), ext)
+ for name in names]
+
+
+@template
+def HostSharedLibrary(name):
+ '''Template for build tools libraries.'''
+ if name != 'clang-plugin':
+ error('Please make sure host shared library support is complete '
+ 'before using for something else than the clang plugin')
+
+ HOST_LIBRARY_NAME = name
+
+ FORCE_SHARED_LIB = True
+
+@template
+def HostLibrary(name):
+ '''Template for build tools libraries.'''
+ HOST_LIBRARY_NAME = name
+
+@template
+def HostRustLibrary(name, features=None):
+ '''Template for host Rust libraries.'''
+ HostLibrary(name)
+
+ IS_RUST_LIBRARY = True
+ # Some Rust build scripts compile C/C++ sources, don't error on warnings for them.
+ AllowCompilerWarnings()
+
+ if features:
+ HOST_RUST_LIBRARY_FEATURES = features
+
+@template
+def DisableStlWrapping():
+ COMPILE_FLAGS['STL'] = []
+
+@template
+def NoVisibilityFlags():
+ COMPILE_FLAGS['VISIBILITY'] = []
+
+@template
+def ForceInclude(*headers):
+ """Force includes a set of header files in C++ compilations"""
+ if CONFIG['CC_TYPE'] == 'clang-cl':
+ include_flag = '-FI'
+ else:
+ include_flag = '-include'
+ for header in headers:
+ CXXFLAGS += [include_flag, header]
+
+@template
+def GeneratedFile(name, *names, **kwargs):
+ """Add one or more GENERATED_FILES with the given attributes.
+
+ You must pass in at least one generated file (the "name" argument). Other
+ names can be included as positional arguments after "name"."""
+ script = kwargs.pop('script', None)
+ entry_point = kwargs.pop('entry_point', None)
+ inputs = kwargs.pop('inputs', [])
+ flags = kwargs.pop('flags', [])
+ force = kwargs.pop('force', False)
+ if kwargs:
+ error('Unrecognized argument(s) to GeneratedFile: %s' %
+ ', '.join(kwargs))
+ if entry_point and not script:
+ error('entry_point cannot be provided if script is not provided')
+ if script and ':' in script:
+ error('script should not include a `:`. If you want to provide an '
+ 'alternative entry point for your script, use the entry_point '
+ 'parameter.')
+
+ key = (name,) + names if names else name
+ GENERATED_FILES += [key]
+ generated_file = GENERATED_FILES[key]
+ if script and not entry_point:
+ generated_file.script = script
+ if script and entry_point:
+ generated_file.script = script + ':' + entry_point
+ generated_file.inputs = inputs
+ generated_file.flags = flags
+ generated_file.force = force
+
+@template
+def CbindgenHeader(name, inputs):
+ """Add one GENERATED_FILES by running RunCbindgen.py"""
+
+ inputs = ['!/config/cbindgen-metadata.json'] + inputs
+ GeneratedFile(name, script='/build/RunCbindgen.py',
+ entry_point='generate', inputs=inputs)
+
+
+include('gecko_templates.mozbuild')