config/external/ffi/moz.build
author Jonathan Kew <jkew@mozilla.com>
Wed, 23 Oct 2019 10:40:16 +0000
changeset 498686 782f341be605f1a30e8a9bfbfc13ce389e620a24
parent 496659 fb7912816d3e5a8f8f5ec90d6e0f79565b669924
permissions -rw-r--r--
Bug 1588407 - If a requested font-family name may be a styled legacy family, force immediate loading of additional family names so that the correct font can be found. r=jwatt Differential Revision: https://phabricator.services.mozilla.com/D49181

# -*- 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/.

FINAL_LIBRARY = 'js'

if CONFIG['MOZ_SYSTEM_FFI']:
    OS_LIBS += CONFIG['MOZ_FFI_LIBS']
else:
    AllowCompilerWarnings()
    NoVisibilityFlags()

    CONFIGURE_DEFINE_FILES += [
        '../../../js/src/ctypes/libffi/fficonfig.h',
    ]
    GeneratedFile('../../../js/src/ctypes/libffi/include/ffi.h',
                  script='subst_header.py',
                  inputs=['../../../js/src/ctypes/libffi/include/ffi.h.in'])

    LOCAL_INCLUDES += [
        '!/js/src/ctypes/libffi',
        '!/js/src/ctypes/libffi/include',
        '/js/src/ctypes/libffi/include',
        '/js/src/ctypes/libffi/src/%s' % CONFIG['FFI_TARGET_DIR'],
    ]

    DEFINES.update({
        'TARGET': CONFIG['FFI_TARGET'],
        CONFIG['FFI_TARGET']: True,
        'FFI_NO_RAW_API': True,
        'HAVE_AS_ASCII_PSEUDO_OP': True,
        'HAVE_AS_STRING_PSEUDO_OP': True,
        'HAVE_AS_X86_64_UNWIND_SECTION_TYPE': True,
    })

    if CONFIG['MOZ_DEBUG']:
        DEFINES['FFI_DEBUG'] = True
        if not CONFIG['MOZ_NO_DEBUG_RTL']:
            DEFINES['USE_DEBUG_RTL'] = True
        SOURCES += [
            '/js/src/ctypes/libffi/src/debug.c',
        ]

    if CONFIG['OS_TARGET'] not in ('WINNT', 'Darwin'):
        DEFINES['HAVE_HIDDEN_VISIBILITY_ATTRIBUTE'] = True

    if CONFIG['INTEL_ARCHITECTURE']:
        DEFINES['HAVE_AS_X86_PCREL'] = True

    # Don't bother setting EH_FRAME_FLAGS on Windows.
    # Quoted defines confuse msvcc.sh, and the value isn't used there.
    if CONFIG['OS_TARGET'] != 'WINNT':
        if CONFIG['FFI_TARGET'] == 'ARM':
            DEFINES['EH_FRAME_FLAGS'] = '"aw"'
        else:
            DEFINES['EH_FRAME_FLAGS'] = '"a"'

    # Common source files.
    SOURCES += [
        '/js/src/ctypes/libffi/src/closures.c',
        '/js/src/ctypes/libffi/src/java_raw_api.c',
        '/js/src/ctypes/libffi/src/prep_cif.c',
        '/js/src/ctypes/libffi/src/raw_api.c',
        '/js/src/ctypes/libffi/src/types.c',
    ]

    # Per-platform sources and flags.
    ffi_srcs = ()
    if CONFIG['FFI_TARGET'] == 'ARM':
        ffi_srcs = ('sysv.S', 'ffi.c')
        if CONFIG['CC_TYPE'] == 'clang':
            ASFLAGS += ['-no-integrated-as']
    elif CONFIG['FFI_TARGET'] == 'AARCH64':
        ffi_srcs = ('sysv.S', 'ffi.c')
    elif CONFIG['FFI_TARGET'] == 'ARM64_WIN64':
        ffi_srcs = ['ffi.c']

        GeneratedFile(
            'win64_aarch.asm',
            inputs=[
                '/js/src/ctypes/libffi/src/aarch64/win64.asm',
                '!../../../js/src/ctypes/libffi/fficonfig.h',
                '!../../../js/src/ctypes/libffi/include/ffi.h',
            ],
            script='preprocess_libffi_asm.py',
            flags=['$(DEFINES)', '$(LOCAL_INCLUDES)'])
        SOURCES += ['!win64_aarch.asm']
    elif CONFIG['FFI_TARGET'] == 'X86':
        ffi_srcs = ('ffi.c', 'sysv.S', 'win32.S')
    elif CONFIG['FFI_TARGET'] == 'X86_64':
        ffi_srcs = ('ffi64.c', 'unix64.S', 'ffi.c', 'sysv.S')
    elif CONFIG['FFI_TARGET'] == 'X86_WIN32':
        ffi_srcs = ['ffi.c']
        # MinGW Build for 32 bit
        if CONFIG['CC_TYPE'] in ('gcc', 'clang'):
            DEFINES['SYMBOL_UNDERSCORE'] = True
            ffi_srcs += ['win32.S']
        else:
            # libffi asm needs to be preprocessed for MSVC
            GeneratedFile('win32.asm', inputs=[
                '/js/src/ctypes/libffi/src/x86/win32.S',
                '!../../../js/src/ctypes/libffi/fficonfig.h',
                '!../../../js/src/ctypes/libffi/include/ffi.h',
            ], script='preprocess_libffi_asm.py',
            flags=['$(DEFINES)', '$(LOCAL_INCLUDES)'])
            SOURCES += ['!win32.asm']
            ASFLAGS += ['-safeseh']
    elif CONFIG['FFI_TARGET'] == 'X86_WIN64':
        ffi_srcs = ['ffi.c']
        if CONFIG['CC_TYPE'] in ('gcc', 'clang'):
            ffi_srcs += ['win64.S']
        else:
            # libffi asm needs to be preprocessed for MSVC
            GeneratedFile(
                'win64.asm',
                inputs=[
                    '/js/src/ctypes/libffi/src/x86/win64.S',
                    '!../../../js/src/ctypes/libffi/fficonfig.h',
                    '!../../../js/src/ctypes/libffi/include/ffi.h',
                ], script='preprocess_libffi_asm.py',
                flags=['$(DEFINES)', '$(LOCAL_INCLUDES)'])
            SOURCES += ['!win64.asm']
    elif CONFIG['FFI_TARGET'] == 'X86_DARWIN':
        DEFINES['FFI_MMAP_EXEC_WRIT'] = True
        if CONFIG['CPU_ARCH'] == 'x86':
            ffi_srcs = ('ffi.c', 'darwin.S', 'ffi64.c', 'darwin64.S',
                        'win32.S')
            DEFINES['SYMBOL_UNDERSCORE'] = True
        else:
            ffi_srcs = ('ffi.c', 'darwin.S', 'ffi64.c', 'darwin64.S')

    SOURCES += [
        '/js/src/ctypes/libffi/src/%s/%s' % (CONFIG['FFI_TARGET_DIR'], s)
        for s in sorted(ffi_srcs)
    ]