#-----------------------------------------------------------------------
# Build the utilities used by CMake
#
# Originally it was a macro in the root `CMakeLists.txt` with the comment
# "Simply to improve readability...".
# However, as part of the modernization refactoring it was moved into a
# separate file cuz adding library alises wasn't possible inside the
# macro.
#-----------------------------------------------------------------------

# Suppress unnecessary checks in third-party code.
include(Utilities/cmThirdPartyChecks.cmake)

#---------------------------------------------------------------------
# Create the kwsys library for CMake.
set(KWSYS_NAMESPACE cmsys)
set(KWSYS_USE_SystemTools 1)
set(KWSYS_USE_Directory 1)
set(KWSYS_USE_RegularExpression 1)
set(KWSYS_USE_Base64 1)
set(KWSYS_USE_MD5 1)
set(KWSYS_USE_Process 1)
set(KWSYS_USE_CommandLineArguments 1)
set(KWSYS_USE_ConsoleBuf 1)
set(KWSYS_HEADER_ROOT ${CMake_BINARY_DIR}/Source)
set(KWSYS_INSTALL_DOC_DIR "${CMAKE_DOC_DIR}")
if(CMake_NO_CXX_STANDARD)
  set(KWSYS_CXX_STANDARD "")
endif()
if(CMake_NO_SELF_BACKTRACE)
  set(KWSYS_NO_EXECINFO 1)
endif()
if(WIN32)
  # FIXME: Teach KWSys to hard-code these checks on Windows.
  set(KWSYS_C_HAS_CLOCK_GETTIME_MONOTONIC_COMPILED 0)
  set(KWSYS_C_HAS_PTRDIFF_T_COMPILED 1)
  set(KWSYS_CXX_HAS_ENVIRON_IN_STDLIB_H_COMPILED 1)
  set(KWSYS_CXX_HAS_RLIMIT64_COMPILED 0)
  set(KWSYS_CXX_HAS_SETENV_COMPILED 0)
  set(KWSYS_CXX_HAS_UNSETENV_COMPILED 0)
  set(KWSYS_CXX_HAS_UTIMENSAT_COMPILED 0)
  set(KWSYS_CXX_HAS_UTIMES_COMPILED 0)
  set(KWSYS_CXX_STAT_HAS_ST_MTIM_COMPILED 0)
  set(KWSYS_CXX_STAT_HAS_ST_MTIMESPEC_COMPILED 0)
  set(KWSYS_STL_HAS_WSTRING_COMPILED 1)
  set(KWSYS_SYS_HAS_IFADDRS_H 0)
endif()
add_subdirectory(Source/kwsys)
set(kwsys_folder "Utilities/KWSys")
CMAKE_SET_TARGET_FOLDER(${KWSYS_NAMESPACE} "${kwsys_folder}")
CMAKE_SET_TARGET_FOLDER(${KWSYS_NAMESPACE}_c "${kwsys_folder}")
if(BUILD_TESTING)
  CMAKE_SET_TARGET_FOLDER(${KWSYS_NAMESPACE}TestDynload "${kwsys_folder}")
  CMAKE_SET_TARGET_FOLDER(${KWSYS_NAMESPACE}TestProcess "${kwsys_folder}")
  CMAKE_SET_TARGET_FOLDER(${KWSYS_NAMESPACE}TestsC "${kwsys_folder}")
  CMAKE_SET_TARGET_FOLDER(${KWSYS_NAMESPACE}TestsCxx "${kwsys_folder}")
endif()

#---------------------------------------------------------------------
# Setup third-party libraries.
# Everything in the tree should be able to include files from the
# Utilities directory.
if((CMAKE_SYSTEM_NAME STREQUAL "AIX" OR CMAKE_SYSTEM_NAME STREQUAL "OS400") AND CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
  # using -isystem option generate error "template with C linkage"
  include_directories("${CMake_SOURCE_DIR}/Utilities/std")
else()
  include_directories(SYSTEM "${CMake_SOURCE_DIR}/Utilities/std")
endif()

include_directories("${CMake_BINARY_DIR}/Utilities")
if((CMAKE_SYSTEM_NAME STREQUAL "AIX" OR CMAKE_SYSTEM_NAME STREQUAL "OS400") AND CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
  # using -isystem option generate error "template with C linkage"
  include_directories("${CMake_SOURCE_DIR}/Utilities")
else()
  include_directories(SYSTEM "${CMake_SOURCE_DIR}/Utilities")
endif()

#---------------------------------------------------------------------
# Build CMake std library for CMake and CTest.
add_subdirectory(Utilities/std)
CMAKE_SET_TARGET_FOLDER(cmstd "Utilities/std")

# check for the use of system libraries versus builtin ones
# (a macro defined in this file)
CMAKE_HANDLE_SYSTEM_LIBRARIES()

if(CMAKE_USE_SYSTEM_KWIML)
  find_package(KWIML 1.0)
  if(NOT KWIML_FOUND)
    message(FATAL_ERROR "CMAKE_USE_SYSTEM_KWIML is ON but KWIML is not found!")
  endif()
else()
  if(BUILD_TESTING)
    set(KWIML_TEST_ENABLE 1)
  endif()
  add_subdirectory(Utilities/KWIML)
endif()

if(CMAKE_USE_SYSTEM_LIBRHASH)
  find_package(LibRHash)
  if(NOT LibRHash_FOUND)
    message(FATAL_ERROR
      "CMAKE_USE_SYSTEM_LIBRHASH is ON but LibRHash is not found!")
  endif()
else()
  add_subdirectory(Utilities/cmlibrhash)
  add_library(LibRHash::LibRHash ALIAS cmlibrhash)
  CMAKE_SET_TARGET_FOLDER(cmlibrhash "Utilities/3rdParty")
endif()

#---------------------------------------------------------------------
# Build zlib library for Curl, CMake, and CTest.
if(CMAKE_USE_SYSTEM_ZLIB)
  find_package(ZLIB)
  if(NOT ZLIB_FOUND)
    message(FATAL_ERROR
      "CMAKE_USE_SYSTEM_ZLIB is ON but a zlib is not found!")
  endif()
else()
  if(NOT POLICY CMP0102) # CMake < 3.17
    # Store in cache to protect from mark_as_advanced.
    set(ZLIB_INCLUDE_DIR ${CMake_SOURCE_DIR}/Utilities CACHE PATH "")
  else()
    set(ZLIB_INCLUDE_DIR ${CMake_SOURCE_DIR}/Utilities)
  endif()
  set(ZLIB_LIBRARY cmzlib)
  set(WITHOUT_ZLIB_DLL "")
  set(WITHOUT_ZLIB_DLL_WITH_LIB cmzlib)
  set(ZLIB_DLL "")
  set(ZLIB_DLL_WITH_LIB cmzlib)
  set(ZLIB_WINAPI "")
  set(ZLIB_WINAPI_COMPILED 0)
  set(ZLIB_WINAPI_WITH_LIB cmzlib)
  add_subdirectory(Utilities/cmzlib)
  add_library(ZLIB::ZLIB ALIAS cmzlib)
  CMAKE_SET_TARGET_FOLDER(cmzlib "Utilities/3rdParty")
endif()

#---------------------------------------------------------------------
# Build Curl library for CTest.
if(CMAKE_USE_SYSTEM_CURL)
  find_package(CURL)
  if(NOT CURL_FOUND)
    message(FATAL_ERROR
      "CMAKE_USE_SYSTEM_CURL is ON but a curl is not found!")
  endif()
else()
  if(CMAKE_TESTS_CDASH_SERVER)
    set(CMAKE_CURL_TEST_URL "${CMAKE_TESTS_CDASH_SERVER}/user.php")
  endif()
  set(_CMAKE_USE_OPENSSL_DEFAULT OFF)
  if(NOT DEFINED CMAKE_USE_OPENSSL AND NOT WIN32 AND NOT APPLE
      AND CMAKE_SYSTEM_NAME MATCHES "(Linux|FreeBSD)")
    set(_CMAKE_USE_OPENSSL_DEFAULT ON)
  endif()
  option(CMAKE_USE_OPENSSL "Use OpenSSL." ${_CMAKE_USE_OPENSSL_DEFAULT})
  mark_as_advanced(CMAKE_USE_OPENSSL)
  if(CMAKE_USE_OPENSSL)
    set(CURL_CA_BUNDLE "" CACHE FILEPATH "Path to SSL CA Certificate Bundle")
    set(CURL_CA_PATH "" CACHE PATH "Path to SSL CA Certificate Directory")
    mark_as_advanced(CURL_CA_BUNDLE CURL_CA_PATH)
  endif()
  if(NOT CMAKE_USE_SYSTEM_NGHTTP2)
    # Tell curl's FindNGHTTP2 module to use our library.
    set(NGHTTP2_LIBRARY cmnghttp2)
    set(NGHTTP2_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/Utilities/cmnghttp2/lib/includes)
  endif()
  add_subdirectory(Utilities/cmcurl)
  add_library(CURL::libcurl ALIAS cmcurl)
  CMAKE_SET_TARGET_FOLDER(cmcurl "Utilities/3rdParty")
  CMAKE_SET_TARGET_FOLDER(LIBCURL "Utilities/3rdParty")
  if(NOT CMAKE_USE_SYSTEM_NGHTTP2)
    # Configure after curl to re-use some check results.
    add_subdirectory(Utilities/cmnghttp2)
    CMAKE_SET_TARGET_FOLDER(cmnghttp2 "Utilities/3rdParty")
  endif()
endif()

#---------------------------------------------------------------------
# Build expat library for CMake, CTest, and libarchive.
if(CMAKE_USE_SYSTEM_EXPAT)
  find_package(EXPAT)
  if(NOT EXPAT_FOUND)
    message(FATAL_ERROR
      "CMAKE_USE_SYSTEM_EXPAT is ON but a expat is not found!")
  endif()
  set(CMAKE_EXPAT_INCLUDES ${EXPAT_INCLUDE_DIRS})
  set(CMAKE_EXPAT_LIBRARIES ${EXPAT_LIBRARIES})
else()
  set(CMAKE_EXPAT_INCLUDES)
  set(CMAKE_EXPAT_LIBRARIES cmexpat)
  add_subdirectory(Utilities/cmexpat)
  add_library(EXPAT::EXPAT ALIAS cmexpat)
  CMAKE_SET_TARGET_FOLDER(cmexpat "Utilities/3rdParty")
endif()

#---------------------------------------------------------------------
# Build or use system libbz2 for libarchive.
if(NOT CMAKE_USE_SYSTEM_LIBARCHIVE)
  if(CMAKE_USE_SYSTEM_BZIP2)
    find_package(BZip2)
  else()
    set(BZIP2_INCLUDE_DIR
      "${CMAKE_CURRENT_SOURCE_DIR}/Utilities/cmbzip2")
    set(BZIP2_LIBRARIES cmbzip2)
    set(BZIP2_NEED_PREFIX "")
    set(USE_BZIP2_DLL "")
    set(USE_BZIP2_DLL_WITH_LIB cmbzip2)
    set(USE_BZIP2_STATIC "")
    set(USE_BZIP2_STATIC_WITH_LIB cmbzip2)
    add_subdirectory(Utilities/cmbzip2)
    CMAKE_SET_TARGET_FOLDER(cmbzip2 "Utilities/3rdParty")
  endif()
endif()

#---------------------------------------------------------------------
# Build or use system zstd for libarchive.
if(NOT CMAKE_USE_SYSTEM_LIBARCHIVE)
  if(NOT CMAKE_USE_SYSTEM_ZSTD)
    set(ZSTD_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/Utilities/cmzstd")
    set(ZSTD_LIBRARY cmzstd)
    add_subdirectory(Utilities/cmzstd)
    CMAKE_SET_TARGET_FOLDER(cmzstd "Utilities/3rdParty")
  endif()
endif()

#---------------------------------------------------------------------
# Build or use system liblzma for libarchive.
if(NOT CMAKE_USE_SYSTEM_LIBARCHIVE)
  if(CMAKE_USE_SYSTEM_LIBLZMA)
    find_package(LibLZMA)
    if(NOT LIBLZMA_FOUND)
      message(FATAL_ERROR "CMAKE_USE_SYSTEM_LIBLZMA is ON but LibLZMA is not found!")
    endif()
  else()
    add_subdirectory(Utilities/cmliblzma)
    CMAKE_SET_TARGET_FOLDER(cmliblzma "Utilities/3rdParty")
    set(LIBLZMA_HAS_AUTO_DECODER 1)
    set(LIBLZMA_HAS_EASY_ENCODER 1)
    set(LIBLZMA_HAS_LZMA_PRESET 1)
    set(LIBLZMA_INCLUDE_DIR
      "${CMAKE_CURRENT_SOURCE_DIR}/Utilities/cmliblzma/liblzma/api")
    set(LIBLZMA_LIBRARY cmliblzma)
    set(HAVE_LZMA_STREAM_ENCODER_MT 1)
  endif()
endif()

#---------------------------------------------------------------------
# Build or use system libarchive for CMake and CTest.
if(CMAKE_USE_SYSTEM_LIBARCHIVE)
  find_package(LibArchive 3.3.3)
  if(NOT LibArchive_FOUND)
    message(FATAL_ERROR "CMAKE_USE_SYSTEM_LIBARCHIVE is ON but LibArchive is not found!")
  endif()
  # NOTE `FindLibArchive` got imported targets support since 3.17
  if (NOT TARGET LibArchive::LibArchive)
    add_library(LibArchive::LibArchive UNKNOWN IMPORTED)
    set_target_properties(LibArchive::LibArchive PROPERTIES
      IMPORTED_LOCATION "${LibArchive_LIBRARIES}"
      INTERFACE_INCLUDE_DIRECTORIES "${LibArchive_INCLUDE_DIRS}")
  endif ()
else()
  set(EXPAT_INCLUDE_DIR ${CMAKE_EXPAT_INCLUDES})
  set(EXPAT_LIBRARY ${CMAKE_EXPAT_LIBRARIES})
  set(ENABLE_MBEDTLS OFF)
  set(ENABLE_NETTLE OFF)
  if(DEFINED CMAKE_USE_OPENSSL)
    set(ENABLE_OPENSSL "${CMAKE_USE_OPENSSL}")
  else()
    set(ENABLE_OPENSSL OFF)
  endif()
  set(ENABLE_LIBB2 OFF)
  set(ENABLE_LZ4 OFF)
  set(ENABLE_LZO OFF)
  set(ENABLE_LZMA ON)
  set(ENABLE_ZSTD ON)
  set(ENABLE_ZLIB ON)
  set(ENABLE_BZip2 ON)
  set(ENABLE_LIBXML2 OFF)
  set(ENABLE_EXPAT OFF)
  set(ENABLE_PCREPOSIX OFF)
  set(ENABLE_LibGCC OFF)
  set(ENABLE_CNG OFF)
  set(ENABLE_TAR OFF)
  set(ENABLE_TAR_SHARED OFF)
  set(ENABLE_CPIO OFF)
  set(ENABLE_CPIO_SHARED OFF)
  set(ENABLE_CAT OFF)
  set(ENABLE_CAT_SHARED OFF)
  set(ENABLE_XATTR OFF)
  set(ENABLE_ACL OFF)
  set(ENABLE_ICONV OFF)
  set(ENABLE_TEST OFF)
  set(ENABLE_COVERAGE OFF)
  set(ENABLE_INSTALL OFF)
  set(POSIX_REGEX_LIB "" CACHE INTERNAL "libarchive: No POSIX regular expression support")
  set(ENABLE_SAFESEH "" CACHE INTERNAL "libarchive: No /SAFESEH linker flag")
  set(WINDOWS_VERSION "WIN7" CACHE INTERNAL "libarchive: Set Windows version to use (Windows only)")
  add_subdirectory(Utilities/cmlibarchive)
  add_library(LibArchive::LibArchive ALIAS cmlibarchive)
  target_compile_definitions(cmlibarchive INTERFACE LIBARCHIVE_STATIC)
  CMAKE_SET_TARGET_FOLDER(cmlibarchive "Utilities/3rdParty")
endif()

#---------------------------------------------------------------------
# Build jsoncpp library.
if(CMAKE_USE_SYSTEM_JSONCPP)
  find_package(JsonCpp 1.6.0)
  if(NOT JsonCpp_FOUND)
    message(FATAL_ERROR
      "CMAKE_USE_SYSTEM_JSONCPP is ON but a JsonCpp is not found!")
  endif()
  if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|LCC|Clang")
    set_property(TARGET JsonCpp::JsonCpp APPEND PROPERTY
      INTERFACE_COMPILE_OPTIONS -Wno-deprecated-declarations)
  endif()
else()
  add_subdirectory(Utilities/cmjsoncpp)
  add_library(JsonCpp::JsonCpp ALIAS cmjsoncpp)
  CMAKE_SET_TARGET_FOLDER(cmjsoncpp "Utilities/3rdParty")
endif()

#---------------------------------------------------------------------
# Build libuv library.
if(CMAKE_USE_SYSTEM_LIBUV)
  if(WIN32)
    find_package(LibUV 1.38.0)
  else()
    find_package(LibUV 1.28.0)
  endif()
  if(NOT LIBUV_FOUND)
    message(FATAL_ERROR
      "CMAKE_USE_SYSTEM_LIBUV is ON but a libuv is not found!")
  endif()
else()
  add_subdirectory(Utilities/cmlibuv)
  add_library(LibUV::LibUV ALIAS cmlibuv)
  CMAKE_SET_TARGET_FOLDER(cmlibuv "Utilities/3rdParty")
endif()

#---------------------------------------------------------------------
# Use curses?
if(NOT DEFINED BUILD_CursesDialog)
  if(UNIX)
    include(${CMake_SOURCE_DIR}/Source/Checks/Curses.cmake)
    set(BUILD_CursesDialog_DEFAULT "${CMakeCheckCurses_COMPILED}")
  elseif(WIN32)
    set(BUILD_CursesDialog_DEFAULT "OFF")
  endif()
  option(BUILD_CursesDialog "Build the CMake Curses Dialog ccmake" "${BUILD_CursesDialog_DEFAULT}")
endif()
if(BUILD_CursesDialog)
  if(UNIX)
    set(CURSES_NEED_NCURSES TRUE)
    find_package(Curses)
    if(NOT CURSES_FOUND)
      message(WARNING
        "'ccmake' will not be built because Curses was not found.\n"
        "Turn off BUILD_CursesDialog to suppress this message."
        )
      set(BUILD_CursesDialog 0)
    endif()
  elseif(WIN32)
    # FIXME: Add support for system-provided pdcurses.
    add_subdirectory(Utilities/cmpdcurses)
    set(CURSES_LIBRARY cmpdcurses)
    set(CURSES_INCLUDE_PATH "") # cmpdcurses has usage requirements
    set(CMAKE_USE_SYSTEM_FORM 0)
    set(HAVE_CURSES_USE_DEFAULT_COLORS 1)
  endif()
endif()
if(BUILD_CursesDialog)
  if(NOT CMAKE_USE_SYSTEM_FORM)
    add_subdirectory(Source/CursesDialog/form)
  elseif(NOT CURSES_FORM_LIBRARY)
    message(FATAL_ERROR "CMAKE_USE_SYSTEM_FORM in ON but CURSES_FORM_LIBRARY is not set!")
  endif()
endif()
