1 # -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
2 # vim: set filetype=python:
3 # This Source Code Form is subject to the terms of the Mozilla Public
4 # License, v. 2.0. If a copy of the MPL was not distributed with this
5 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 '''Generic template for target binaries. Meant to be used by other
12 # Add -llog by default, since we use it all over the place.
13 if CONFIG['OS_TARGET'] == 'Android':
19 '''Template for program executables.'''
26 def SimplePrograms(names, ext='.cpp'):
27 '''Template for simple program executables.
29 Those have a single source with the same base name as the executable.
31 SIMPLE_PROGRAMS += names
32 SOURCES += ['%s%s' % (name, ext) for name in names]
38 def CppUnitTests(names, ext='.cpp'):
39 '''Template for C++ unit tests.
41 Those have a single source with the same base name as the executable.
43 COMPILE_FLAGS['EXTRA_INCLUDES'] = ['-I%s/dist/include' % TOPOBJDIR,
44 '-I%s/dist/include/testing' % TOPOBJDIR]
45 CPP_UNIT_TESTS += names
46 SOURCES += ['%s%s' % (name, ext) for name in names]
53 '''Template for libraries.'''
57 def AllowCompilerWarnings():
58 COMPILE_FLAGS['WARNINGS_AS_ERRORS'] = []
59 WASM_FLAGS['WARNINGS_AS_ERRORS'] = []
62 def DisableCompilerWarnings():
63 # Keep the -Wno-* flags to disable warnings that may be enabled through other means.
65 return [f for f in flags or [] if f.startswith('-Wno-')]
66 COMPILE_FLAGS['WARNINGS_CFLAGS'] = filter(CONFIG['WARNINGS_CFLAGS'])
67 COMPILE_FLAGS['WARNINGS_CXXFLAGS'] = filter(CONFIG['WARNINGS_CXXFLAGS'])
68 HOST_COMPILE_FLAGS['WARNINGS_CFLAGS'] = filter(CONFIG['WARNINGS_HOST_CFLAGS'])
69 HOST_COMPILE_FLAGS['WARNINGS_CXXFLAGS'] = filter(CONFIG['WARNINGS_HOST_CXXFLAGS'])
72 def RustLibrary(name, features=None, output_category=None, is_gkrust=False):
73 '''Template for Rust libraries.'''
76 IS_RUST_LIBRARY = True
77 # Some Rust build scripts compile C/C++ sources, don't error on warnings for them.
78 AllowCompilerWarnings()
80 # And furthermore, don't even show warnings for them, so they don't regress
81 # the Compiler Warnings build metric
82 # <https://developer.mozilla.org/en-US/docs/Mozilla/Performance/Automated_Performance_Testing_and_Sheriffing/Build_Metrics#compiler_warnings>.
83 DisableCompilerWarnings()
86 RUST_LIBRARY_FEATURES = features
89 RUST_LIBRARY_OUTPUT_CATEGORY = output_category
96 def SharedLibrary(name, output_category=None):
97 '''Template for shared libraries.'''
100 FORCE_SHARED_LIB = True
103 SHARED_LIBRARY_OUTPUT_CATEGORY = output_category
109 def Framework(name, output_category=None):
110 '''Template for OSX Frameworks.'''
111 SharedLibrary(name, output_category)
117 def HostProgram(name):
118 '''Template for build tools executables.'''
123 def HostSimplePrograms(names, ext='.cpp'):
124 '''Template for simple build tools executables.
126 Those have a single source with the same base name as the executable.
128 HOST_SIMPLE_PROGRAMS += names
129 HOST_SOURCES += ['%s%s' % (name.replace('host_', ''), ext)
134 def HostSharedLibrary(name):
135 '''Template for build tools libraries.'''
136 if name != 'clang-plugin':
137 error('Please make sure host shared library support is complete '
138 'before using for something else than the clang plugin')
140 HOST_LIBRARY_NAME = name
142 FORCE_SHARED_LIB = True
145 def HostLibrary(name):
146 '''Template for build tools libraries.'''
147 HOST_LIBRARY_NAME = name
150 def HostRustLibrary(name, features=None):
151 '''Template for host Rust libraries.'''
154 IS_RUST_LIBRARY = True
155 # Some Rust build scripts compile C/C++ sources, don't error on warnings for them.
156 AllowCompilerWarnings()
159 HOST_RUST_LIBRARY_FEATURES = features
162 def DisableStlWrapping():
163 COMPILE_FLAGS['STL'] = []
166 def NoVisibilityFlags():
167 COMPILE_FLAGS['VISIBILITY'] = []
170 def ForceInclude(*headers):
171 """Force includes a set of header files in C++ compilations"""
172 if CONFIG['CC_TYPE'] == 'clang-cl':
175 include_flag = '-include'
176 for header in headers:
177 CXXFLAGS += [include_flag, header]
180 def GeneratedFile(name, *names, **kwargs):
181 """Add one or more GENERATED_FILES with the given attributes.
183 You must pass in at least one generated file (the "name" argument). Other
184 names can be included as positional arguments after "name"."""
185 script = kwargs.pop('script', None)
186 entry_point = kwargs.pop('entry_point', None)
187 inputs = kwargs.pop('inputs', [])
188 flags = kwargs.pop('flags', [])
189 force = kwargs.pop('force', False)
191 error('Unrecognized argument(s) to GeneratedFile: %s' %
193 if entry_point and not script:
194 error('entry_point cannot be provided if script is not provided')
195 if script and ':' in script:
196 error('script should not include a `:`. If you want to provide an '
197 'alternative entry point for your script, use the entry_point '
200 key = (name,) + names if names else name
201 GENERATED_FILES += [key]
202 generated_file = GENERATED_FILES[key]
203 if script and not entry_point:
204 generated_file.script = script
205 if script and entry_point:
206 generated_file.script = script + ':' + entry_point
207 generated_file.inputs = inputs
208 generated_file.flags = flags
209 generated_file.force = force
212 def CbindgenHeader(name, inputs):
213 """Add one GENERATED_FILES by running RunCbindgen.py"""
215 inputs = ['!/config/cbindgen-metadata.json'] + inputs
216 GeneratedFile(name, script='/build/RunCbindgen.py',
217 entry_point='generate', inputs=inputs)
220 include('gecko_templates.mozbuild')