2016-08-04 09:51:47 +03:00
|
|
|
# -*- 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/.
|
|
|
|
|
2017-10-12 16:22:59 +03:00
|
|
|
|
2016-08-04 09:51:47 +03:00
|
|
|
@template
|
|
|
|
@imports('textwrap')
|
2016-10-13 06:45:24 +03:00
|
|
|
@imports(_from='mozbuild.configure', _import='SandboxDependsFunction')
|
2017-08-18 19:05:05 +03:00
|
|
|
def compiler_class(compiler, host_or_target):
|
|
|
|
is_target = host_or_target is target
|
|
|
|
|
2016-10-13 06:45:24 +03:00
|
|
|
class Compiler(SandboxDependsFunction):
|
2016-08-04 09:51:47 +03:00
|
|
|
# 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,
|
2016-08-05 11:13:48 +03:00
|
|
|
check_msg=None, when=None, onerror=lambda: None):
|
2016-08-04 09:51:47 +03:00
|
|
|
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):
|
2016-08-10 04:00:43 +03:00
|
|
|
return checking(check_msg)(fn)
|
2016-08-04 09:51:47 +03:00
|
|
|
else:
|
|
|
|
def checking_fn(fn):
|
|
|
|
return fn
|
|
|
|
|
2017-02-01 10:25:29 +03:00
|
|
|
@depends(self, dependable(flags), extra_toolchain_flags, when=when)
|
2016-08-04 09:51:47 +03:00
|
|
|
@checking_fn
|
2016-09-01 00:23:20 +03:00
|
|
|
def func(compiler, flags, extra_flags):
|
|
|
|
flags = flags or []
|
2017-08-18 19:05:05 +03:00
|
|
|
if is_target:
|
|
|
|
flags += extra_flags or []
|
2016-08-04 09:51:47 +03:00
|
|
|
flags.append('-c')
|
|
|
|
|
2016-08-10 04:00:43 +03:00
|
|
|
if try_invoke_compiler(
|
2017-10-12 16:22:59 +03:00
|
|
|
compiler.wrapper +
|
|
|
|
[compiler.compiler] + compiler.flags,
|
|
|
|
compiler.language, source, flags,
|
|
|
|
onerror=onerror) is not None:
|
2016-08-10 04:00:43 +03:00
|
|
|
return True
|
2016-08-04 09:51:47 +03:00
|
|
|
|
|
|
|
return func
|
|
|
|
|
|
|
|
compiler.__class__ = Compiler
|
|
|
|
return compiler
|