# -*- 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', ] GENERATED_FILES += [ '../../../js/src/ctypes/libffi/include/ffi.h', ] ffi_h = GENERATED_FILES['../../../js/src/ctypes/libffi/include/ffi.h'] ffi_h.script = 'subst_header.py' ffi_h.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'] GENERATED_FILES += ['win64_aarch.asm'] asm = GENERATED_FILES['win64_aarch.asm'] asm.inputs = [ '/js/src/ctypes/libffi/src/aarch64/win64.asm', '!../../../js/src/ctypes/libffi/fficonfig.h', '!../../../js/src/ctypes/libffi/include/ffi.h', ] asm.script = 'preprocess_libffi_asm.py' asm.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 GENERATED_FILES += ['win32.asm'] asm = GENERATED_FILES['win32.asm'] asm.inputs = [ '/js/src/ctypes/libffi/src/x86/win32.S', '!../../../js/src/ctypes/libffi/fficonfig.h', '!../../../js/src/ctypes/libffi/include/ffi.h', ] asm.script = 'preprocess_libffi_asm.py' asm.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 GENERATED_FILES += ['win64.asm'] asm = GENERATED_FILES['win64.asm'] asm.inputs = [ '/js/src/ctypes/libffi/src/x86/win64.S', '!../../../js/src/ctypes/libffi/fficonfig.h', '!../../../js/src/ctypes/libffi/include/ffi.h', ] asm.script = 'preprocess_libffi_asm.py' asm.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) ]