build/moz.configure/compilers-util.configure
author Mike Hommey <mh+mozilla@glandium.org>
Wed, 01 Feb 2017 16:25:29 +0900
changeset 378973 35967a21613ea7f0a6aca96a4042d7a2d8fdcccf
parent 361130 793b6eeb323a11768a95fbe679159e87a3dc1267
child 424873 772250315e76877800a1969e0db9be13da736460
permissions -rw-r--r--
Bug 1335666 - Remove @depends_when. r=chmanchester In bug 1296530, we made @depends take a when argument, it can now replace all uses of @depends_when.

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