diff options
Diffstat (limited to 'build/templates.mozbuild')
-rw-r--r-- | build/templates.mozbuild | 237 |
1 files changed, 237 insertions, 0 deletions
diff --git a/build/templates.mozbuild b/build/templates.mozbuild new file mode 100644 index 0000000000..811b96bb7e --- /dev/null +++ b/build/templates.mozbuild @@ -0,0 +1,237 @@ +# -*- 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") |