set(ASY_SUBREPO_CLONE_ROOT ${CMAKE_CURRENT_SOURCE_DIR})

set(LSP_REPO_ROOT ${ASY_SUBREPO_CLONE_ROOT}/LspCpp)
set(TINYEXR_SUBREPO_ROOT ${ASY_SUBREPO_CLONE_ROOT}/tinyexr)
set(BOEHM_GC_ROOT ${ASY_SUBREPO_CLONE_ROOT}/gc)
set(LIBATOMIC_OPS_ROOT ${ASY_SUBREPO_CLONE_ROOT}/libatomic_ops)

# boehm gc
if (ENABLE_GC)
   set(enable_gpl OFF CACHE INTERNAL "libatomicops gpl libs option")
   add_subdirectory(${LIBATOMIC_OPS_ROOT})

   set(OLD_CFLAG_EXTRA ${CFLAG_EXTRA})
   set(CFLAGS_EXTRA -I${LIBATOMIC_OPS_ROOT}/src)  # for bdwgc

   set(OLD_BUILD_SHARED_LIBS ${BUILD_SHARED_LIBS})
   set(BUILD_SHARED_LIBS OFF CACHE INTERNAL "bdwgc shared libs flag")
   set(enable_cplusplus ON CACHE INTERNAL "bdwgc enable C++")
   set(without_libatomic_ops ON CACHE INTERNAL "bdwgc use libatomic ops")
   add_subdirectory(${BOEHM_GC_ROOT})

   set(CFLAG_EXTRA ${OLD_CFLAG_EXTRA})
   unset(BUILD_SHARED_LIBS CACHE)
   set(BUILD_SHARED_LIBS ${OLD_BUILD_SHARED_LIBS})

   list(APPEND ASY_STATIC_LIBARIES gc gccpp atomic_ops)

   if (WIN32)
       list(APPEND ASY_MACROS GC_NOT_DLL)
   endif()
   # We use #include <gc.h> as opposed to <gc/gc.h> (and also for other gc include files) to allow
   # linking directly to the compiled source for testing different GC versions.

   # In GC tarballs downloaded from https://www.hboehm.info/gc/, the header files are in include/gc.h, and not
   # include/gc/gc.h, hence we need a way to allow inclusion of "gc.h". In vcpkg gc distributions, the include
   # files are provided in include/gc/gc.h (and other files). Hence we append "/gc" to the include directories.

   if (WIN32)
       list(APPEND ASY_STATIC_LIBARIES gctba)
   endif()
   list(APPEND ASY_MACROS USEGC)
else()
   message(STATUS "Disabling gc support")
endif()

if (ENABLE_LSP)
   message(STATUS "LSP Enabled.")
   # disable New Boost version warning
   set(Boost_NO_WARN_NEW_VERSIONS 1)
   set(USE_SYSTEM_RAPIDJSON ON CACHE INTERNAL "Use system rapidjson")
   set(LSPCPP_USE_CPP17 ON CACHE INTERNAL "C++17 mode")
   # For transitive URI dependency
   set(Uri_BUILD_DOCS OFF CACHE INTERNAL "build docs for uri")
   set(Uri_BUILD_TESTS OFF CACHE INTERNAL "build tests for uri")

   if (WIN32)
       set(LSPCPP_WIN32_WINNT_VALUE ${ASY_WIN32_WINVER_VERSION} CACHE INTERNAL "lsp win32 winver value")
   endif()

   if (ENABLE_GC)
       set(LSPCPP_SUPPORT_BOEHM_GC ON CACHE INTERNAL "Use boehm GC")
       set(LSPCPP_GC_DOWNLOADED_ROOT ${BOEHM_GC_ROOT} CACHE INTERNAL "gc root for lsp")
       set(LSPCPP_GC_STATIC ON CACHE INTERNAL "lsp use static gc")
   endif()

   add_subdirectory(${LSP_REPO_ROOT})

   list(APPEND ASY_STATIC_LIBARIES lspcpp)
   list(APPEND ASY_MACROS HAVE_LSP=1)
else()
   # only include lsp libraries
   message(STATUS "LSP Disabled. Will not have language server protocol support.")
   list(APPEND ASYMPTOTE_INCLUDES ${LSP_REPO_ROOT}/include)
endif()