1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- # -*- 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
|