# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*- # 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 @imports('textwrap') @imports(_from='mozbuild.configure', _import='SandboxDependsFunction') def compiler_class(compiler): class Compiler(SandboxDependsFunction): # Generates a test program and attempts to compile it. In case of # failure, the resulting check will return None. If the test program # succeeds, it will return the output of the test program. # - `includes` are the includes (as file names) that will appear at the # top of the generated test program. # - `body` is the code that will appear in the main function of the # generated test program. `return 0;` is appended to the function # body automatically. # - `flags` are the flags to be passed to the compiler, in addition to # `-c`. # - `check_msg` is the message to be printed to accompany compiling the # test program. def try_compile(self, includes=None, body='', flags=None, check_msg=None, when=None, onerror=lambda: None): includes = includes or [] source_lines = ['#include <%s>' % f for f in includes] source = '\n'.join(source_lines) + '\n' source += textwrap.dedent('''\ int main(void) { %s ; return 0; } ''' % body) if check_msg: def checking_fn(fn): return checking(check_msg)(fn) else: def checking_fn(fn): return fn @depends_when(self, dependable(flags), extra_toolchain_flags, when=when) @checking_fn def func(compiler, flags, extra_flags): flags = flags or [] flags += extra_flags or [] flags.append('-c') if try_invoke_compiler( compiler.wrapper + [compiler.compiler] + compiler.flags, compiler.language, source, flags, onerror=onerror) is not None: return True return func compiler.__class__ = Compiler return compiler