include(CheckCXXCompilerFlag)
include(CheckLibraryExists)
include_directories(${CMAKE_CURRENT_BINARY_DIR}/..)
include_directories(${LLDB_SOURCE_DIR}/source)

include_directories(MacOSX)

function(check_certificate identity result_valid)
  execute_process(
    COMMAND security find-certificate -Z -p -c ${identity} /Library/Keychains/System.keychain
    RESULT_VARIABLE exit_code OUTPUT_QUIET ERROR_QUIET)
  if(exit_code)
    set(${result_valid} FALSE PARENT_SCOPE)
  else()
    set(${result_valid} TRUE PARENT_SCOPE)
  endif()
endfunction()

function(get_debugserver_codesign_identity result)
  string(CONCAT not_found_help
    "This will cause failures in the test suite."
    "Pass '-DLLDB_USE_SYSTEM_DEBUGSERVER=ON' to use the system one instead."
    "See 'Code Signing on macOS' in the documentation."
  )

  # Explicit override: warn if unavailable
  if(LLDB_CODESIGN_IDENTITY)
    set(${result} ${LLDB_CODESIGN_IDENTITY} PARENT_SCOPE)
    check_certificate(${LLDB_CODESIGN_IDENTITY} available)
    if(NOT available)
      message(WARNING "LLDB_CODESIGN_IDENTITY not found: '${LLDB_CODESIGN_IDENTITY}' ${not_found_help}")
    endif()
    return()
  endif()

  # Development signing identity: use if available
  check_certificate(lldb_codesign available)
  if(available)
    set(${result} lldb_codesign PARENT_SCOPE)
    return()
  endif()

  message(WARNING "Development code sign identity not found: 'lldb_codesign' ${not_found_help}")

  # LLVM pendant: fallback if available
  if(LLVM_CODESIGNING_IDENTITY)
    check_certificate(${LLVM_CODESIGNING_IDENTITY} available)
    if(available)
      set(${result} ${LLVM_CODESIGNING_IDENTITY} PARENT_SCOPE)
      return()
    endif()
  endif()

  # Ad-hoc signing: last resort
  set(${result} "-" PARENT_SCOPE)
endfunction()

# debugserver does not depend on intrinsics_gen, or on llvm. Set the common
# llvm dependencies in the current scope to the empty set.
set(LLVM_COMMON_DEPENDS)

set(DEBUGSERVER_RESOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../resources")
set(DEBUGSERVER_INFO_PLIST "${DEBUGSERVER_RESOURCE_DIR}/lldb-debugserver-Info.plist")

set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -stdlib=libc++ -Wl,-sectcreate,__TEXT,__info_plist,${DEBUGSERVER_INFO_PLIST}")

check_cxx_compiler_flag("-Wno-gnu-zero-variadic-macro-arguments"
                        CXX_SUPPORTS_NO_GNU_ZERO_VARIADIC_MACRO_ARGUMENTS)
if (CXX_SUPPORTS_NO_GNU_ZERO_VARIADIC_MACRO_ARGUMENTS)
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-gnu-zero-variadic-macro-arguments")
endif ()

check_cxx_compiler_flag("-Wno-zero-length-array"
                        CXX_SUPPORTS_NO_ZERO_LENGTH_ARRAY)
if (CXX_SUPPORTS_NO_ZERO_LENGTH_ARRAY)
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-zero-length-array")
endif ()

check_cxx_compiler_flag("-Wno-extended-offsetof"
                        CXX_SUPPORTS_NO_EXTENDED_OFFSETOF)
if (CXX_SUPPORTS_NO_EXTENDED_OFFSETOF)
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-extended-offsetof")
endif ()

include(CheckCSourceCompiles)
check_c_source_compiles(
    "
    #include <TargetConditionals.h>
    #if TARGET_CPU_ARM64
    #if TARGET_OS_OSX
    #warning Building for macOS
    #else
    #error Not building for macOS
    #endif
    #else
    #error Not building for ARM64
    #endif
    int main() { return 0; }
    "
    BUILDING_FOR_ARM64_OSX
)

# You can only debug arm64e processes using an arm64e debugserver.
option(LLDB_ENABLE_ARM64E_DEBUGSERVER "Build debugserver for arm64 and arm64e" OFF)
if (BUILDING_FOR_ARM64_OSX AND LLDB_ENABLE_ARM64E_DEBUGSERVER)
  set(CMAKE_OSX_ARCHITECTURES "arm64;arm64e")
endif ()

check_library_exists(compression compression_encode_buffer "" HAVE_LIBCOMPRESSION)

find_library(SECURITY_LIBRARY Security)

add_subdirectory(MacOSX)

set(LLDB_CODESIGN_IDENTITY "" CACHE STRING
    "Identity override for debugserver; see 'Code Signing on macOS' in the documentation (Darwin only)")

get_debugserver_codesign_identity(debugserver_codesign_identity)

# Override locally, so the identity is used for targets created in this scope.
set(LLVM_CODESIGNING_IDENTITY ${debugserver_codesign_identity})

# Use the same identity later in the test suite.
set_property(GLOBAL PROPERTY
  LLDB_DEBUGSERVER_CODESIGN_IDENTITY ${debugserver_codesign_identity})

if(APPLE)
  if(APPLE_EMBEDDED)
    find_library(BACKBOARD_LIBRARY BackBoardServices
      PATHS ${CMAKE_OSX_SYSROOT}/System/Library/PrivateFrameworks)
    find_library(FRONTBOARD_LIBRARY FrontBoardServices
      PATHS ${CMAKE_OSX_SYSROOT}/System/Library/PrivateFrameworks)
    find_library(SPRINGBOARD_LIBRARY SpringBoardServices
      PATHS ${CMAKE_OSX_SYSROOT}/System/Library/PrivateFrameworks)
    find_library(MOBILESERVICES_LIBRARY MobileCoreServices
      PATHS ${CMAKE_OSX_SYSROOT}/System/Library/PrivateFrameworks)
    find_library(LOCKDOWN_LIBRARY lockdown)
    if (APPLE_EMBEDDED STREQUAL "watchos")
      find_library(CAROUSELSERVICES_LIBRARY CarouselServices
        PATHS ${CMAKE_OSX_SYSROOT}/System/Library/PrivateFrameworks)
    endif()

    if(NOT BACKBOARD_LIBRARY)
      set(SKIP_TEST_DEBUGSERVER ON CACHE BOOL "" FORCE)
    endif()
  endif()
endif()

if(HAVE_LIBCOMPRESSION)
  set(LIBCOMPRESSION compression)
endif()

if(LLDB_USE_ENTITLEMENTS)
  if(APPLE_EMBEDDED)
    set(entitlements ${DEBUGSERVER_RESOURCE_DIR}/debugserver-entitlements.plist)
  else()
    if (LLDB_USE_PRIVATE_ENTITLEMENTS)
      set(entitlements ${DEBUGSERVER_RESOURCE_DIR}/debugserver-macosx-private-entitlements.plist)
    else()
      set(entitlements ${DEBUGSERVER_RESOURCE_DIR}/debugserver-macosx-entitlements.plist)
    endif()
  endif()
endif()

add_definitions(-DLLDB_USE_OS_LOG)

if(${CMAKE_OSX_SYSROOT} MATCHES ".Internal.sdk$")
  message(STATUS "LLDB debugserver energy support is enabled")
  add_definitions(-DLLDB_ENERGY)
  set(ENERGY_LIBRARY -lpmenergy -lpmsample)
else()
  message(STATUS "LLDB debugserver energy support is disabled")
endif()

set(generated_mach_interfaces
  ${CMAKE_CURRENT_BINARY_DIR}/mach_exc.h
  ${CMAKE_CURRENT_BINARY_DIR}/mach_excServer.c
  ${CMAKE_CURRENT_BINARY_DIR}/mach_excUser.c
  )

set(MIG_ARCH_FLAGS "")
if (DEFINED MIG_ARCHS)
  foreach(ARCH ${MIG_ARCHS})
    set(MIG_ARCH_FLAGS "${MIG_ARCH_FLAGS} -arch ${ARCH}")
  endforeach()
endif()
separate_arguments(MIG_ARCH_FLAGS_SEPARTED NATIVE_COMMAND "${MIG_ARCH_FLAGS}")

add_custom_command(OUTPUT ${generated_mach_interfaces}
  VERBATIM COMMAND mig ${MIG_ARCH_FLAGS_SEPARTED} -isysroot ${CMAKE_OSX_SYSROOT} ${CMAKE_CURRENT_SOURCE_DIR}/MacOSX/dbgnub-mig.defs
  DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/MacOSX/dbgnub-mig.defs
  )

set(DEBUGSERVER_VERS_GENERATED_FILE ${CMAKE_CURRENT_BINARY_DIR}/debugserver_vers.c)
configure_file(debugserver_vers.c.in
               ${DEBUGSERVER_VERS_GENERATED_FILE} @ONLY)

set(lldbDebugserverCommonSources
  DNBArch.cpp
  DNBBreakpoint.cpp
  DNB.cpp
  DNBDataRef.cpp
  DNBError.cpp
  DNBLog.cpp
  DNBRegisterInfo.cpp
  DNBThreadResumeActions.cpp
  JSON.cpp
  StdStringExtractor.cpp
  StringConvert.cpp
  # JSON reader depends on the following LLDB-common files
  ${LLDB_SOURCE_DIR}/source/Host/common/SocketAddress.cpp
  # end JSON reader dependencies
  libdebugserver.cpp
  PseudoTerminal.cpp
  PThreadEvent.cpp
  PThreadMutex.cpp
  RNBContext.cpp
  RNBRemote.cpp
  RNBServices.cpp
  RNBSocket.cpp
  SysSignal.cpp
  TTYState.cpp

  MacOSX/CFBundle.cpp
  MacOSX/CFString.cpp
  MacOSX/Genealogy.cpp
  MacOSX/MachException.cpp
  MacOSX/MachProcess.mm
  MacOSX/MachTask.mm
  MacOSX/MachThread.cpp
  MacOSX/MachThreadList.cpp
  MacOSX/MachVMMemory.cpp
  MacOSX/MachVMRegion.cpp
  MacOSX/OsLogger.cpp
  ${generated_mach_interfaces}
  ${DEBUGSERVER_VERS_GENERATED_FILE})

# Tell LLVM not to complain about these source files.
set(LLVM_OPTIONAL_SOURCES
  ${lldbDebugserverCommonSources}
  debugserver.cpp)

add_lldb_library(lldbDebugserverCommon ${lldbDebugserverCommonSources})
set_target_properties(lldbDebugserverCommon PROPERTIES FOLDER "lldb libraries/debugserver")

target_link_libraries(lldbDebugserverCommon
                      INTERFACE ${COCOA_LIBRARY}
                      ${CORE_FOUNDATION_LIBRARY}
                      ${FOUNDATION_LIBRARY}
                      ${BACKBOARD_LIBRARY}
                      ${FRONTBOARD_LIBRARY}
                      ${SPRINGBOARD_LIBRARY}
                      ${MOBILESERVICES_LIBRARY}
                      ${LOCKDOWN_LIBRARY}
                      ${CAROUSELSERVICES_LIBRARY}
                      lldbDebugserverArchSupport
                      ${FOUNDATION_LIBRARY}
                      ${SECURITY_LIBRARY}
                      ${LIBCOMPRESSION}
                      ${ENERGY_LIBRARY})
if(HAVE_LIBCOMPRESSION)
  set_property(TARGET lldbDebugserverCommon APPEND PROPERTY
                COMPILE_DEFINITIONS HAVE_LIBCOMPRESSION)
endif()
add_lldb_tool(debugserver ADD_TO_FRAMEWORK
  debugserver.cpp
  LINK_LIBS lldbDebugserverCommon
  ENTITLEMENTS ${entitlements}
)

# Workaround for Xcode-specific code-signing behavior:
# The XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY option causes debugserver to be copied
# into the framework first and code-signed afterwards. Sign the copy manually.
if (debugserver_codesign_identity AND LLDB_BUILD_FRAMEWORK AND
    CMAKE_GENERATOR STREQUAL "Xcode")
  if(NOT CMAKE_CODESIGN_ALLOCATE)
    execute_process(
      COMMAND xcrun -f codesign_allocate
      OUTPUT_STRIP_TRAILING_WHITESPACE
      OUTPUT_VARIABLE CMAKE_CODESIGN_ALLOCATE
    )
  endif()
  if(entitlements)
    set(pass_entitlements --entitlements ${entitlements})
  endif()

  set(copy_location ${LLDB_FRAMEWORK_ABSOLUTE_BUILD_DIR}/LLDB.framework/Versions/${LLDB_FRAMEWORK_VERSION}/Resources/debugserver)

  add_custom_command(TARGET debugserver POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E
            env CODESIGN_ALLOCATE=${CMAKE_CODESIGN_ALLOCATE}
            xcrun codesign -f -s ${debugserver_codesign_identity}
            ${pass_entitlements} ${copy_location}
    COMMENT "Code-sign debugserver copy in the build-tree framework: ${copy_location}"
  )
endif()

set_target_properties(debugserver PROPERTIES FOLDER "lldb libraries/debugserver")

if(APPLE_EMBEDDED)
  set_property(TARGET lldbDebugserverCommon APPEND PROPERTY COMPILE_DEFINITIONS
    WITH_LOCKDOWN
    WITH_FBS
    WITH_BKS
    )
  if(CAROUSELSERVICES_LIBRARY)
    set_property(TARGET lldbDebugserverCommon APPEND PROPERTY COMPILE_DEFINITIONS
      WITH_CAROUSEL
      )
  endif()
  set_property(TARGET debugserver APPEND PROPERTY COMPILE_DEFINITIONS
    WITH_LOCKDOWN
    WITH_FBS
    WITH_BKS
    )
  set_property(TARGET lldbDebugserverCommon APPEND PROPERTY COMPILE_FLAGS
    -F${CMAKE_OSX_SYSROOT}/System/Library/PrivateFrameworks
    )

  add_lldb_library(lldbDebugserverCommon_NonUI ${lldbDebugserverCommonSources})
  target_link_libraries(lldbDebugserverCommon_NonUI
                      INTERFACE ${COCOA_LIBRARY}
                      ${CORE_FOUNDATION_LIBRARY}
                      ${FOUNDATION_LIBRARY}
                      lldbDebugserverArchSupport
                      ${SECURITY_LIBRARY}
                      ${LIBCOMPRESSION})
  if(HAVE_LIBCOMPRESSION)
    set_property(TARGET lldbDebugserverCommon_NonUI APPEND PROPERTY
                  COMPILE_DEFINITIONS HAVE_LIBCOMPRESSION)
  endif()

  add_lldb_tool(debugserver-nonui
    debugserver.cpp

    LINK_LIBS
      lldbDebugserverCommon_NonUI

    ENTITLEMENTS
      ${entitlements}
    )
endif()
