build/gecko_templates.mozbuild
author Jonathan Watt <jwatt@jwatt.org>
Mon, 09 Jan 2017 19:12:02 +0000
changeset 340973 b6959c93a4f797df7a6ce95e79a5490bc9004f04
parent 330016 15c053fffd35a97ad872547e0b01b68fe079ddee
child 363956 51d1ab9b2e524c089170a3477d03b90807606827
permissions -rw-r--r--
Bug 1058040, part 6 - When copying SVGImageContexts use the copy ctor. r=dholbert Prior to this patch whenever we wanted to pass on a modified SVGImageContext we would pass on a new object initialized with some of the data of the object we were given and with the new data we wanted to change. Unfortunately we were sometimes failing to faithfully copy member data that we do not want to modify (because of default arguments). This patch fixes that by making us fully copy the object we were given using its copy constructor and then explicitly override the data we want to change.

# -*- 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
def GeckoBinary(linkage='dependent', msvcrt='dynamic', mozglue=None):
    '''Template for Gecko-related binaries.

    This template is meant to be used in other templates.

    `linkage` indicates the wanted xpcom linkage type. Valid values are
    'dependent', 'standalone' or None. 'dependent' is the default. It is
    used for e.g. XPCOM components and executables with direct dependencies
    on libxul. Most executables should use the 'standalone' linkage, which
    uses the standalone XPCOM glue to load libxul. None means no XPCOM glue
    or libxul linkage at all.

    `msvcrt` indicates which Microsoft Visual Studio CRT, for Windows build,
    ought to be linked: 'static' or 'dynamic'.

    `mozglue` indicates whether to link against the mozglue library, and if
    so, what linkage to apply. Valid values are None (mozglue not linked),
    'program' (mozglue linked to an executable program), or 'library' (mozglue
    linked to a shared library).
    '''
    if msvcrt == 'dynamic' or CONFIG['OS_ARCH'] != 'WINNT' or CONFIG['MOZ_ASAN']:
        xpcomglue = 'xpcomglue'
    elif msvcrt == 'static':
        USE_STATIC_LIBS = True
        xpcomglue = 'xpcomglue_staticruntime'
        if not CONFIG['GNU_CC']:
            mozglue = None
            if linkage == 'dependent':
                USE_LIBS += [
                    'mozalloc_staticruntime',
                ]
    else:
        error('msvcrt must be "dynamic" or "static"')

    if linkage == 'dependent':
        USE_LIBS += [
            'nspr',
            'xul',
        ]
    elif linkage == 'standalone':
        DEFINES['XPCOM_GLUE'] = True

        USE_LIBS += [
            xpcomglue,
        ]
    elif linkage != None:
        error('`linkage` must be "dependent", "standalone" or None')

    if mozglue:
        LDFLAGS += CONFIG['MOZ_GLUE_WRAP_LDFLAGS']
        if mozglue == 'program':
            USE_LIBS += ['mozglue']
            DEFINES['MOZ_HAS_MOZGLUE'] = True
            if CONFIG['MOZ_GLUE_IN_PROGRAM']:
                if CONFIG['GNU_CC']:
                    LDFLAGS += ['-rdynamic']
                if CONFIG['MOZ_MEMORY']:
                    USE_LIBS += ['memory']
        elif mozglue == 'library':
            LIBRARY_DEFINES['MOZ_HAS_MOZGLUE'] = True
            if not CONFIG['MOZ_GLUE_IN_PROGRAM']:
                USE_LIBS += ['mozglue']
        else:
            error('`mozglue` must be "program" or "library"')

    if not CONFIG['JS_STANDALONE']:
        USE_LIBS += [
            'fallible',
        ]


@template
def GeckoProgram(name, linkage='standalone', **kwargs):
    '''Template for program executables related to Gecko.

    `name` identifies the executable base name.

    See the documentation for `GeckoBinary` for other possible arguments,
    with the notable difference that the default for `linkage` is 'standalone'.
    '''
    Program(name)

    kwargs.setdefault('mozglue', 'program')

    GeckoBinary(linkage=linkage, **kwargs)


@template
def GeckoSimplePrograms(names, **kwargs):
    '''Template for simple program executables related to Gecko.

    `names` identifies the executable base names for each executable.

    See the documentation for `GeckoBinary` for other possible arguments.
    '''
    SimplePrograms(names)

    kwargs.setdefault('mozglue', 'program')

    GeckoBinary(**kwargs)


@template
def GeckoCppUnitTests(names, **kwargs):
    '''Template for C++ unit tests related to Gecko.

    `names` identifies the executable base names for each executable.

    See the documentation for `GeckoBinary` for other possible arguments.
    '''
    CppUnitTests(names)

    kwargs.setdefault('mozglue', 'program')

    GeckoBinary(**kwargs)


@template
def GeckoSharedLibrary(name, **kwargs):
    '''Template for shared libraries related to Gecko.

    `name` identifies the library base name.
    See the documentation for `GeckoBinary` for other possible arguments.
    '''
    SharedLibrary(name)

    kwargs.setdefault('mozglue', 'library')

    GeckoBinary(**kwargs)


@template
def GeckoFramework(name, **kwargs):
    '''Template for OSX frameworks related to Gecko.

    `name` identifies the library base name.
    See the documentation for `GeckoBinary` for other possible arguments.
    '''
    Framework(name)

    kwargs.setdefault('mozglue', 'library')

    GeckoBinary(**kwargs)


@template
def XPCOMBinaryComponent(name):
    '''Template defining an XPCOM binary component for Gecko.

    `name` is the name of the component.
    '''
    GeckoSharedLibrary(name)

    IS_COMPONENT = True