summaryrefslogtreecommitdiffstats
path: root/build/moz.configure/compilers-util.configure
diff options
context:
space:
mode:
Diffstat (limited to 'build/moz.configure/compilers-util.configure')
-rw-r--r--build/moz.configure/compilers-util.configure62
1 files changed, 62 insertions, 0 deletions
diff --git a/build/moz.configure/compilers-util.configure b/build/moz.configure/compilers-util.configure
new file mode 100644
index 000000000..32271a010
--- /dev/null
+++ b/build/moz.configure/compilers-util.configure
@@ -0,0 +1,62 @@
+# -*- 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
+@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