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):
|
2018-12-20 01:40:38 +03:00
|
|
|
@depends(dependable(flags))
|
|
|
|
def flags(flags):
|
|
|
|
flags = list(flags or [])
|
|
|
|
flags.append('-c')
|
|
|
|
return flags
|
|
|
|
|
|
|
|
@depends(dependable(includes))
|
|
|
|
def header(includes):
|
|
|
|
includes = includes or []
|
|
|
|
return ['#include <%s>' % f for f in includes]
|
|
|
|
|
|
|
|
return self.try_run(
|
|
|
|
header=header, body=body, flags=flags, check_msg=check_msg,
|
|
|
|
when=when, onerror=onerror)
|
|
|
|
|
|
|
|
# Generates a test program and run the compiler against it. In case of
|
|
|
|
# failure, the resulting check will return None.
|
|
|
|
# - `header` is code 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.
|
|
|
|
# - `check_msg` is the message to be printed to accompany compiling the
|
|
|
|
# test program.
|
|
|
|
# - `onerror` is a function called when the check fails.
|
|
|
|
def try_run(self, header=None, body='', flags=None,
|
|
|
|
check_msg=None, when=None, onerror=lambda: None):
|
|
|
|
source = textwrap.dedent('''\
|
2016-08-04 09:51:47 +03:00
|
|
|
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
|
|
|
|
|
2019-03-28 01:05:04 +03:00
|
|
|
@depends(self, dependable(flags), extra_toolchain_flags,
|
|
|
|
stlport_cppflags, dependable(header), when=when)
|
2016-08-04 09:51:47 +03:00
|
|
|
@checking_fn
|
2019-03-28 01:05:04 +03:00
|
|
|
def func(compiler, flags, extra_flags, stlport_flags, header):
|
2018-12-20 01:40:38 +03:00
|
|
|
flags = list(flags or [])
|
2017-08-18 19:05:05 +03:00
|
|
|
if is_target:
|
|
|
|
flags += extra_flags or []
|
2019-03-28 01:05:04 +03:00
|
|
|
if compiler.language == 'C++':
|
|
|
|
flags += stlport_flags or []
|
2018-12-20 01:40:38 +03:00
|
|
|
header = header or ''
|
|
|
|
if isinstance(header, (list, tuple)):
|
|
|
|
header = '\n'.join(header)
|
|
|
|
if header:
|
|
|
|
header += '\n'
|
2016-08-04 09:51:47 +03:00
|
|
|
|
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,
|
2018-12-20 01:40:38 +03:00
|
|
|
compiler.language, header + source, flags,
|
2017-10-12 16:22:59 +03:00
|
|
|
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
|