# CMake support related to building libffi.

include(CheckTypeSize)
include(CheckFunctionExists)

function(setup_libffi libffi_srcroot)

  # FIXME: currently hard-coded
  set(VERSION "3.99999")

  set(STDC_HEADERS 1)

  # FIXME: hoist this up into a common config-checking section (combine
  # with similar check in libbacktrace cmake).
  # For the moment, require that the target system supports mmap.
  check_symbol_exists(mmap "sys/mman.h" HAVE_MMAP)
  if(NOT HAVE_MMAP)
    message(SEND_ERROR "Support for mmap() is required -- setup failed.")
  else()
    set(HAVE_MMAP_ANON 1)
    set(HAVE_MMAP_FILE 1)
  endif()

  # Is this 32-bit or 64-bit x86?
  if(SIZEOF_VOID_P STREQUAL 4)
    set(HAVE_64BIT 0)
  else()
    set(HAVE_64BIT 1)
    set(HAVE_AS_X86_64_UNWIND_SECTION_TYPE 1)
  endif()

  # Pick up correct sources based on arch.
  set(c_srcs
    "${libffi_srcroot}/src/closures.c"
    "${libffi_srcroot}/src/prep_cif.c"
    "${libffi_srcroot}/src/types.c"
    "${libffi_srcroot}/src/raw_api.c"
    "${libffi_srcroot}/src/java_raw_api.c"
    "${libffi_srcroot}/src/x86/ffi.c")
  set(asm_srcs
    "${libffi_srcroot}/src/x86/sysv.S")
  if(HAVE_64BIT)
    list(APPEND c_srcs "${libffi_srcroot}/src/x86/ffi64.c" "${libffi_srcroot}/src/x86/ffiw64.c")
    list(APPEND asm_srcs "${libffi_srcroot}/src/x86/unix64.S")
    list(APPEND asm_srcs "${libffi_srcroot}/src/x86/win64.S")
  endif()
  set_source_files_properties(${asm_srcs} PROPERTIES LANGUAGE C)

  # Set target based on arch.
  if(HAVE_64BIT)
    set(TARGET X86_64)
  else()
    set(TARGET X86)
  endif()

  # Misc x86 and llvm setup.
  set(HAVE_AS_REGISTER_PSEUDO_OP 0)
  set(HAVE_AS_CFI_PSEUDO_OP 1)
  set(HAVE_AS_X86_PCREL 1)
  set(HAVE_RO_EH_FRAME 1)
  set(HAVE_HIDDEN_VISIBILITY_ATTRIBUTE 1)

  # These are options for FFI that we want to hard-wire on
  set(FFI_CLOSURES 1)
  set(FFI_GO_CLOSURES 1)
  set(FFI_DEBUG off)
  set(FFI_EXEC_TRAMPOLINE_TABLE 0)
  set(FFI_MMAP_EXEC_WRIT 0)

  # Copy correct version of ffitarget.h to libgo binary root.
  file(COPY "${libffi_srcroot}/src/x86/ffitarget.h" DESTINATION ${CMAKE_CURRENT_BINARY_DIR})

  # At this point we can generate the necessary headers.
  configure_file("${CMAKE_CURRENT_SOURCE_DIR}/fficonfig.h.cmake" "${CMAKE_CURRENT_BINARY_DIR}/fficonfig.h")
  configure_file ("${libffi_srcroot}/include/ffi.h.in" "${CMAKE_CURRENT_BINARY_DIR}/ffi.h")

  # Create libffi object libraries
  add_library(libffi_nonpiclib OBJECT EXCLUDE_FROM_ALL ${c_srcs} ${asm_srcs})
  set_target_properties(libffi_nonpiclib PROPERTIES COMPILE_FLAGS "")
  target_include_directories(libffi_nonpiclib PUBLIC "${libffi_srcroot}/include")

  add_library(libffi_piclib OBJECT EXCLUDE_FROM_ALL ${c_srcs} ${asm_srcs})
  set_target_properties(libffi_piclib PROPERTIES COMPILE_FLAGS "-fPIC")
  target_include_directories(libffi_piclib PUBLIC "${libffi_srcroot}/include")

endfunction()
