cmake_minimum_required(VERSION 3.20.0)
if("${CMAKE_VERSION}" VERSION_LESS "3.31.0")
  message(WARNING
    "Your CMake version is ${CMAKE_VERSION}. Starting with LLVM 24, the "
    "minimum version of CMake required to build LLVM will become 3.31.0, and "
    "using an older CMake will become an error. Please upgrade your CMake to "
    "at least 3.31.0 now to avoid issues in the future.")
endif()

set(LLVM_SUBPROJECT_TITLE "LLDB")

if(NOT DEFINED LLVM_COMMON_CMAKE_UTILS)
  set(LLVM_COMMON_CMAKE_UTILS ${CMAKE_CURRENT_SOURCE_DIR}/../cmake)
endif()
include(${LLVM_COMMON_CMAKE_UTILS}/Modules/CMakePolicy.cmake
  NO_POLICY_SCOPE)

# Add path for custom modules.
set(CMAKE_MODULE_PATH
  ${CMAKE_MODULE_PATH}
  "${CMAKE_CURRENT_SOURCE_DIR}/cmake"
  "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules"
  )

# If we are not building as part of LLVM, build LLDB as a standalone project,
# using LLVM as an external library.
if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
  project(lldb)
  set(LLDB_BUILT_STANDALONE TRUE)
  set(LLVM_INCLUDE_TESTS ON CACHE INTERNAL "")
endif()

# Must go below project(..)
include(GNUInstallDirs)

option(LLDB_INCLUDE_TESTS "Generate build targets for the LLDB unit tests." ${LLVM_INCLUDE_TESTS})
option(LLDB_ENABLE_LIBCXX_TESTS "Set to OFF to acknowledge that libc++ is intentionally not built in-tree and silence the missing-libc++ warning." ON)

if(LLDB_BUILT_STANDALONE)
  set(CMAKE_CXX_STANDARD 17 CACHE STRING "C++ standard to conform to")
  set(CMAKE_CXX_STANDARD_REQUIRED YES)
  set(CMAKE_CXX_EXTENSIONS NO)

  include(LLDBStandalone)
  include(HandleDoxygen)
endif()

include(LLDBConfig)
include(AddLLDB)
include(LLDBLayeringCheck)

set(LLDB_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/include)

# Define the LLDB_CONFIGURATION_xxx matching the build type.
if(uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG" )
  add_definitions(-DLLDB_CONFIGURATION_DEBUG)
endif()

if (WIN32)
  add_definitions(-D_ENABLE_EXTENDED_ALIGNED_STORAGE)
  if (NOT MSVC)
    # _BSD_SOURCE is required for MinGW's getopt.h to define optreset
    add_definitions(-D_BSD_SOURCE)
  endif()
endif()

if (LLDB_ENABLE_PYTHON)
  set(cachestring_LLDB_PYTHON_RELATIVE_PATH
    "Path where Python modules are installed, relative to LLDB's install prefix")
  set(cachestring_LLDB_PYTHON_EXE_RELATIVE_PATH
    "Path to python interpreter exectuable, relative to python's install prefix")
  set(cachestring_LLDB_PYTHON_EXT_SUFFIX
    "Filename extension for native code python modules")
  set(cachestring_LLDB_PYTHON_DLL_RELATIVE_PATH
    "Relative path from LLDB executable to Python DLL directory (Windows only)")
  set(cachestring_LLDB_PYTHON_RUNTIME_LIBRARY_FILENAME
    "Filename of Python runtime library to search for, e.g. python311.dll (Windows only)")

  if (LLDB_ENABLE_PYTHON_LIMITED_API)
    set(stable_abi "--stable-abi")
  endif()

  foreach(var LLDB_PYTHON_RELATIVE_PATH LLDB_PYTHON_EXE_RELATIVE_PATH LLDB_PYTHON_EXT_SUFFIX)
    if(NOT DEFINED ${var} AND NOT CMAKE_CROSSCOMPILING)
      execute_process(
        COMMAND ${Python3_EXECUTABLE}
          ${CMAKE_CURRENT_SOURCE_DIR}/bindings/python/get-python-config.py
          ${stable_abi}
          ${var}
        OUTPUT_VARIABLE value
        OUTPUT_STRIP_TRAILING_WHITESPACE)
      file(TO_CMAKE_PATH "${value}" value)
      set(${var} ${value} CACHE STRING ${cachestring_${var}})
    else()
      if ("${${var}}" STREQUAL "")
        message(FATAL_ERROR
          "Crosscompiling LLDB with Python requires manually setting ${var}.")
      endif()
    endif()
  endforeach()
  # Make sure lldb extension has "_d" suffix on Windows in Debug mode.
  if(WIN32 AND CMAKE_BUILD_TYPE STREQUAL Debug)
    string(SUBSTRING ${LLDB_PYTHON_EXT_SUFFIX} 0 2 FIRST_2_CHARS)
    # Add "_d" manually if LLDB_PYTHON_EXT_SUFFIX lacks it due to release Python configuration.
    if(NOT FIRST_2_CHARS STREQUAL "_d")
      set(LLDB_PYTHON_EXT_SUFFIX "_d${LLDB_PYTHON_EXT_SUFFIX}")
    endif()
  endif()
  if(WIN32)
    # On Windows, FindPython3 doesn't reliably expose the runtime DLL path,
    # only the import library. CPython's DLL naming is standard.
    if(LLDB_ENABLE_PYTHON_LIMITED_API)
      if(MINGW)
        set(LLDB_PYTHON_RUNTIME_LIBRARY_FILENAME
            "libpython${Python3_VERSION_MAJOR}.dll")
      else()
        set(LLDB_PYTHON_RUNTIME_LIBRARY_FILENAME
            "python${Python3_VERSION_MAJOR}.dll")
      endif()
    else()
      if(MINGW)
        set(LLDB_PYTHON_RUNTIME_LIBRARY_FILENAME
            "libpython${Python3_VERSION_MAJOR}.${Python3_VERSION_MINOR}.dll")
      else()
        set(LLDB_PYTHON_RUNTIME_LIBRARY_FILENAME
            "python${Python3_VERSION_MAJOR}${Python3_VERSION_MINOR}.dll")
      endif()
    endif()
    message(STATUS "LLDB Python runtime DLL: ${LLDB_PYTHON_RUNTIME_LIBRARY_FILENAME} "
                   "(Python3_VERSION=${Python3_VERSION}, "
                   "limited_api=${LLDB_ENABLE_PYTHON_LIMITED_API})")
  endif()
endif ()

if (LLDB_ENABLE_LUA)
  set(LLDB_LUA_DEFAULT_RELATIVE_PATH "lib/lua/${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}")
  set(LLDB_LUA_RELATIVE_PATH ${LLDB_LUA_DEFAULT_RELATIVE_PATH}
    CACHE STRING "Path where Lua modules are installed, relative to install prefix")
endif ()

if (LLDB_ENABLE_PYTHON OR LLDB_ENABLE_LUA)
  add_subdirectory(bindings)
endif ()

# We need the headers generated by intrinsics_gen before we can compile
# any source file in LLDB as the imported Clang modules might include
# some of these generated headers. This approach is copied from Clang's main
# CMakeLists.txt, so it should kept in sync the code in Clang which was added
# in llvm-svn 308844.
if(LLVM_ENABLE_MODULES)
  list(APPEND LLVM_COMMON_DEPENDS intrinsics_gen)
endif()

if(CMAKE_CROSSCOMPILING AND LLDB_BUILT_STANDALONE AND NOT LLDB_TABLEGEN_EXE)
  set(LLVM_USE_HOST_TOOLS ON)
  include(CrossCompile)
  if (NOT NATIVE_LLVM_DIR OR NOT NATIVE_Clang_DIR)
    message(FATAL_ERROR
      "Crosscompiling standalone requires the variables NATIVE_{CLANG,LLVM}_DIR
      for building the native lldb-tblgen used during the build process.")
  endif()
  llvm_create_cross_target(lldb NATIVE "" Release
    -DLLVM_DIR=${NATIVE_LLVM_DIR}
    -DClang_DIR=${NATIVE_Clang_DIR})
endif()

# TableGen
add_subdirectory(utils/TableGen)

add_subdirectory(source)
add_subdirectory(tools)
add_subdirectory(docs)

check_lldb_plugin_layering()

if (LLDB_ENABLE_PYTHON)
  if(LLDB_BUILD_FRAMEWORK)
    set(lldb_python_target_dir "${LLDB_FRAMEWORK_ABSOLUTE_BUILD_DIR}/LLDB.framework/Resources/Python/lldb")
  else()
    set(lldb_python_target_dir "${LLVM_RUNTIME_OUTPUT_INTDIR}/../${LLDB_PYTHON_RELATIVE_PATH}/lldb")
  endif()
  get_target_property(lldb_python_bindings_dir swig_wrapper_python BINARY_DIR)
  finish_swig_python("lldb-python" "${lldb_python_bindings_dir}" "${lldb_python_target_dir}")
endif()

if (LLDB_ENABLE_LUA)
  if(LLDB_BUILD_FRAMEWORK)
    set(LLDB_LUA_CPATH "${LLDB_FRAMEWORK_ABSOLUTE_BUILD_DIR}/LLDB.framework/Resources/Lua")
  else()
    set(LLDB_LUA_CPATH "${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${LLDB_LUA_RELATIVE_PATH}")
  endif()
  get_target_property(lldb_lua_bindings_dir swig_wrapper_lua BINARY_DIR)
  finish_swig_lua("lldb-lua" "${lldb_lua_bindings_dir}" "${LLDB_LUA_CPATH}")
endif()

set(LLDB_INCLUDE_UNITTESTS ON)
if (NOT TARGET llvm_gtest)
  set(LLDB_INCLUDE_UNITTESTS OFF)
endif()

if(LLDB_INCLUDE_TESTS)
  add_subdirectory(test)
  if (LLDB_INCLUDE_UNITTESTS)
    add_subdirectory(unittests)
  endif()
  add_subdirectory(utils)
endif()

if(LLDB_BUILT_STANDALONE AND NOT LLVM_ENABLE_IDE)
  llvm_distribution_add_targets()
endif()
