aboutsummaryrefslogtreecommitdiff
path: root/cmake.deps
diff options
context:
space:
mode:
Diffstat (limited to 'cmake.deps')
-rw-r--r--cmake.deps/CMakeLists.txt293
-rw-r--r--cmake.deps/cmake/BuildGettext.cmake37
-rw-r--r--cmake.deps/cmake/BuildLibiconv.cmake32
-rw-r--r--cmake.deps/cmake/BuildLibtermkey.cmake57
-rw-r--r--cmake.deps/cmake/BuildLibuv.cmake77
-rw-r--r--cmake.deps/cmake/BuildLibvterm.cmake69
-rw-r--r--cmake.deps/cmake/BuildLua.cmake96
-rw-r--r--cmake.deps/cmake/BuildLuajit.cmake163
-rw-r--r--cmake.deps/cmake/BuildLuarocks.cmake227
-rw-r--r--cmake.deps/cmake/BuildLuv.cmake133
-rw-r--r--cmake.deps/cmake/BuildMsgpack.cmake66
-rw-r--r--cmake.deps/cmake/BuildTreesitter.cmake59
-rw-r--r--cmake.deps/cmake/BuildTreesitterParsers.cmake29
-rw-r--r--cmake.deps/cmake/BuildUnibilium.cmake48
-rw-r--r--cmake.deps/cmake/CopyFilesGlob.cmake20
-rw-r--r--cmake.deps/cmake/DownloadAndExtractFile.cmake195
-rw-r--r--cmake.deps/cmake/GetBinaryDeps.cmake43
-rw-r--r--cmake.deps/cmake/GettextCMakeLists.txt329
-rw-r--r--cmake.deps/cmake/LibiconvCMakeLists.txt97
-rw-r--r--cmake.deps/cmake/LibuvCMakeLists.txt33
-rw-r--r--cmake.deps/cmake/Libvterm-tbl2inc_c.cmake163
-rw-r--r--cmake.deps/cmake/LibvtermCMakeLists.txt92
-rw-r--r--cmake.deps/cmake/RemoveFiles.cmake5
-rw-r--r--cmake.deps/cmake/TargetArch.cmake23
-rw-r--r--cmake.deps/cmake/TreesitterCMakeLists.txt21
-rw-r--r--cmake.deps/cmake/TreesitterParserCMakeLists.txt19
-rw-r--r--cmake.deps/cmake/UnibiliumCMakeLists.txt25
-rw-r--r--cmake.deps/cmake/libtermkeyCMakeLists.txt34
-rw-r--r--cmake.deps/patches/libvterm-Remove-VLAs-for-MSVC.patch50
29 files changed, 2535 insertions, 0 deletions
diff --git a/cmake.deps/CMakeLists.txt b/cmake.deps/CMakeLists.txt
new file mode 100644
index 0000000000..27374a2a9a
--- /dev/null
+++ b/cmake.deps/CMakeLists.txt
@@ -0,0 +1,293 @@
+# This is not meant to be included by the top-level.
+cmake_minimum_required (VERSION 2.8.12)
+project(NVIM_DEPS C)
+
+# Needed for: check_c_compiler_flag()
+include(CheckCCompilerFlag)
+
+# Point CMake at any custom modules we may ship
+list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake" "${PROJECT_SOURCE_DIR}/../cmake")
+
+# In Windows/MSVC CMAKE_BUILD_TYPE changes the paths/linking of the build
+# recipes (libuv, msgpack), make sure it is set
+if(NOT CMAKE_BUILD_TYPE)
+ set(CMAKE_BUILD_TYPE Release)
+endif()
+
+set(DEFAULT_MAKE_CFLAGS CFLAGS+=-g)
+
+check_c_compiler_flag(-Og HAS_OG_FLAG)
+if(HAS_OG_FLAG)
+ set(DEFAULT_MAKE_CFLAGS CFLAGS+=-Og ${DEFAULT_MAKE_CFLAGS})
+endif()
+
+if(CMAKE_SYSTEM_NAME MATCHES "OpenBSD")
+ # pkg-config 29.2 has a bug on OpenBSD which causes it to drop any paths that
+ # *contain* system include paths. To avoid this, we prefix what would be
+ # "/usr/include" as "/_usr/include".
+ # This check is also performed in the root CMakeLists.txt
+ # https://github.com/neovim/neovim/pull/14745#issuecomment-860201794
+ set(DEPS_INSTALL_DIR "${CMAKE_BINARY_DIR}/_usr" CACHE PATH "Dependencies install directory.")
+else()
+ set(DEPS_INSTALL_DIR "${CMAKE_BINARY_DIR}/usr" CACHE PATH "Dependencies install directory.")
+endif()
+
+set(DEPS_BIN_DIR "${DEPS_INSTALL_DIR}/bin" CACHE PATH "Dependencies binary install directory.")
+set(DEPS_LIB_DIR "${DEPS_INSTALL_DIR}/lib" CACHE PATH "Dependencies library install directory.")
+set(DEPS_BUILD_DIR "${CMAKE_BINARY_DIR}/build" CACHE PATH "Dependencies build directory.")
+set(DEPS_DOWNLOAD_DIR "${DEPS_BUILD_DIR}/downloads" CACHE PATH "Dependencies download directory.")
+
+option(USE_BUNDLED "Use bundled dependencies." ON)
+
+option(USE_BUNDLED_UNIBILIUM "Use the bundled unibilium." ${USE_BUNDLED})
+option(USE_BUNDLED_LIBTERMKEY "Use the bundled libtermkey." ${USE_BUNDLED})
+option(USE_BUNDLED_LIBVTERM "Use the bundled libvterm." ${USE_BUNDLED})
+option(USE_BUNDLED_LIBUV "Use the bundled libuv." ${USE_BUNDLED})
+option(USE_BUNDLED_MSGPACK "Use the bundled msgpack." ${USE_BUNDLED})
+option(USE_BUNDLED_LUAJIT "Use the bundled version of luajit." ${USE_BUNDLED})
+option(USE_BUNDLED_LUAROCKS "Use the bundled version of luarocks." ${USE_BUNDLED})
+option(USE_BUNDLED_LUV "Use the bundled version of luv." ${USE_BUNDLED})
+#XXX(tarruda): Lua is only used for debugging the functional test client, no
+# build it unless explicitly requested
+option(USE_BUNDLED_LUA "Use the bundled version of lua." OFF)
+option(USE_BUNDLED_TS_PARSERS "Use the bundled treesitter parsers." ${USE_BUNDLED})
+option(USE_BUNDLED_TS "Use the bundled treesitter runtime." ${USE_BUNDLED})
+
+if(USE_BUNDLED AND MSVC)
+ option(USE_BUNDLED_GETTEXT "Use the bundled version of gettext." ON)
+ option(USE_BUNDLED_LIBICONV "Use the bundled version of libiconv." ON)
+else()
+ option(USE_BUNDLED_GETTEXT "Use the bundled version of gettext." OFF)
+ option(USE_BUNDLED_LIBICONV "Use the bundled version of libiconv." OFF)
+endif()
+
+option(USE_EXISTING_SRC_DIR "Skip download of deps sources in case of existing source directory." OFF)
+
+if(WIN32)
+ find_package(Git)
+ if(NOT Git_FOUND)
+ message(FATAL_ERROR "Git is required to apply patches for Windows.")
+ endif()
+endif()
+
+if(UNIX)
+ find_program(MAKE_PRG NAMES gmake make)
+ if(MAKE_PRG)
+ execute_process(
+ COMMAND "${MAKE_PRG}" --version
+ OUTPUT_VARIABLE MAKE_VERSION_INFO)
+ if(NOT "${OUTPUT_VARIABLE}" MATCHES ".*GNU.*")
+ unset(MAKE_PRG)
+ endif()
+ endif()
+ if(NOT MAKE_PRG)
+ message(FATAL_ERROR "GNU Make is required to build the dependencies.")
+ else()
+ message(STATUS "Found GNU Make at ${MAKE_PRG}")
+ endif()
+endif()
+
+# When using make, use the $(MAKE) variable to avoid warning about the job
+# server.
+if(CMAKE_GENERATOR MATCHES "Makefiles")
+ set(MAKE_PRG "$(MAKE)")
+endif()
+
+if(MINGW AND CMAKE_GENERATOR MATCHES "Ninja")
+ find_program(MAKE_PRG NAMES mingw32-make)
+ if(NOT MAKE_PRG)
+ message(FATAL_ERROR "GNU Make for mingw32 is required to build the dependencies.")
+ else()
+ message(STATUS "Found GNU Make for mingw32: ${MAKE_PRG}")
+ endif()
+endif()
+
+if(CMAKE_C_COMPILER_ARG1)
+ set(DEPS_C_COMPILER "${CMAKE_C_COMPILER} ${CMAKE_C_COMPILER_ARG1}")
+else()
+ set(DEPS_C_COMPILER "${CMAKE_C_COMPILER}")
+endif()
+
+if(CMAKE_CXX_COMPILER)
+ set(DEPS_CXX_COMPILER "${CMAKE_CXX_COMPILER}")
+endif()
+
+if(CMAKE_OSX_SYSROOT)
+ set(DEPS_C_COMPILER "${DEPS_C_COMPILER} -isysroot${CMAKE_OSX_SYSROOT}")
+ if(DEPS_CXX_COMPILER)
+ set(DEPS_CXX_COMPILER "${DEPS_CXX_COMPILER} -isysroot${CMAKE_OSX_SYSROOT}")
+ endif()
+endif()
+
+if(CMAKE_OSX_ARCHITECTURES)
+ string(REPLACE ";" "|" CMAKE_OSX_ARCHITECTURES_ALT_SEP "${CMAKE_OSX_ARCHITECTURES}")
+ # The LuaJIT build does not like being passed multiple `-arch` flags
+ # so we handle a universal build the old-fashioned way.
+ set(LUAJIT_C_COMPILER "${DEPS_C_COMPILER}")
+ foreach(ARCH IN LISTS CMAKE_OSX_ARCHITECTURES)
+ set(DEPS_C_COMPILER "${DEPS_C_COMPILER} -arch ${ARCH}")
+ if(DEPS_CXX_COMPILER)
+ set(DEPS_CXX_COMPILER "${DEPS_CXX_COMPILER} -arch ${ARCH}")
+ endif()
+ endforeach()
+endif()
+
+set(HOSTDEPS_INSTALL_DIR "${DEPS_INSTALL_DIR}")
+set(HOSTDEPS_BIN_DIR "${DEPS_BIN_DIR}")
+set(HOSTDEPS_LIB_DIR "${DEPS_LIB_DIR}")
+set(HOSTDEPS_C_COMPILER "${DEPS_C_COMPILER}")
+set(HOSTDEPS_CXX_COMPILER "${DEPS_CXX_COMPILER}")
+
+include(ExternalProject)
+
+set(LIBUV_URL https://github.com/libuv/libuv/archive/730e07e2f77a4001bdf6894112271c926399f5a8.tar.gz)
+set(LIBUV_SHA256 271869759a7dbdaf1d1bf75f1ec388a7307592153b34ebb52d3934715cbaac8a)
+
+set(MSGPACK_URL https://github.com/msgpack/msgpack-c/releases/download/c-4.0.0/msgpack-c-4.0.0.tar.gz)
+set(MSGPACK_SHA256 420fe35e7572f2a168d17e660ef981a589c9cbe77faa25eb34a520e1fcc032c8)
+
+# https://github.com/LuaJIT/LuaJIT/tree/v2.1
+set(LUAJIT_URL https://github.com/LuaJIT/LuaJIT/archive/4ef96cff887c268cc676f9b4b1dc9c54a693efd5.tar.gz)
+set(LUAJIT_SHA256 ae913e33be80dded08a2fc368787f168305c22808519c962553bf4c8668e9856)
+
+set(LUA_URL https://www.lua.org/ftp/lua-5.1.5.tar.gz)
+set(LUA_SHA256 2640fc56a795f29d28ef15e13c34a47e223960b0240e8cb0a82d9b0738695333)
+
+set(LUAROCKS_URL https://github.com/luarocks/luarocks/archive/v3.8.0.tar.gz)
+set(LUAROCKS_SHA256 ab6612ca9ab87c6984871d2712d05525775e8b50172701a0a1cabddf76de2be7)
+
+set(UNIBILIUM_URL https://github.com/neovim/unibilium/archive/92d929f.tar.gz)
+set(UNIBILIUM_SHA256 29815283c654277ef77a3adcc8840db79ddbb20a0f0b0c8f648bd8cd49a02e4b)
+
+set(LIBTERMKEY_URL https://www.leonerd.org.uk/code/libtermkey/libtermkey-0.22.tar.gz)
+set(LIBTERMKEY_SHA256 6945bd3c4aaa83da83d80a045c5563da4edd7d0374c62c0d35aec09eb3014600)
+
+set(LIBVTERM_URL https://www.leonerd.org.uk/code/libvterm/libvterm-0.1.4.tar.gz)
+set(LIBVTERM_SHA256 bc70349e95559c667672fc8c55b9527d9db9ada0fb80a3beda533418d782d3dd)
+
+set(LUV_VERSION 1.43.0-0)
+set(LUV_URL https://github.com/luvit/luv/archive/9f80386338af7d164ff1f47d480ee1ae775cb0ef.tar.gz)
+set(LUV_SHA256 a6fe420f06944c0d84a173fccff2eb0d14dfd1293bc24666a580b98dd1a7254f)
+
+set(LUA_COMPAT53_URL https://github.com/keplerproject/lua-compat-5.3/archive/v0.9.tar.gz)
+set(LUA_COMPAT53_SHA256 ad05540d2d96a48725bb79a1def35cf6652a4e2ec26376e2617c8ce2baa6f416)
+
+# cat.exe curl.exe curl-ca-bundle.crt diff.exe tee.exe xxd.exe
+set(WINTOOLS_URL https://github.com/neovim/deps/raw/d66e306abf5b846484b4f2adffd896bce7e065d2/opt/win32tools.zip)
+set(WINTOOLS_SHA256 2fb2f8d69070b3f16e029913fb95008e6be33893d77fc358012396c275a0fdb7)
+
+set(WINGUI_URL https://github.com/equalsraf/neovim-qt/releases/download/v0.2.16.1/neovim-qt.zip)
+set(WINGUI_SHA256 ddb4492db03da407703fb0ab271c4eb060250d1a7d71200e2b3b981cb0de59de)
+
+set(WIN32YANK_X86_URL https://github.com/equalsraf/win32yank/releases/download/v0.0.4/win32yank-x86.zip)
+set(WIN32YANK_X86_SHA256 62f34e5a46c5d4a7b3f3b512e1ff7b77fedd432f42581cbe825233a996eed62c)
+set(WIN32YANK_X86_64_URL https://github.com/equalsraf/win32yank/releases/download/v0.0.4/win32yank-x64.zip)
+set(WIN32YANK_X86_64_SHA256 33a747a92da60fb65e668edbf7661d3d902411a2d545fe9dc08623cecd142a20)
+
+set(GETTEXT_URL https://ftp.gnu.org/pub/gnu/gettext/gettext-0.20.1.tar.gz)
+set(GETTEXT_SHA256 66415634c6e8c3fa8b71362879ec7575e27da43da562c798a8a2f223e6e47f5c)
+
+set(LIBICONV_URL https://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.15.tar.gz)
+set(LIBICONV_SHA256 ccf536620a45458d26ba83887a983b96827001e92a13847b45e4925cc8913178)
+
+set(TREESITTER_C_URL https://github.com/tree-sitter/tree-sitter-c/archive/v0.20.1.tar.gz)
+set(TREESITTER_C_SHA256 ffcc2ef0eded59ad1acec9aec4f9b0c7dd209fc1a85d85f8b0e81298e3dddcc2)
+
+set(TREESITTER_URL https://github.com/tree-sitter/tree-sitter/archive/v0.20.6.tar.gz)
+set(TREESITTER_SHA256 4d37eaef8a402a385998ff9aca3e1043b4a3bba899bceeff27a7178e1165b9de)
+
+if(USE_BUNDLED_UNIBILIUM)
+ include(BuildUnibilium)
+endif()
+
+if(USE_BUNDLED_LIBTERMKEY)
+ include(BuildLibtermkey)
+ if(USE_BUNDLED_UNIBILIUM)
+ add_dependencies(libtermkey unibilium)
+ endif()
+endif()
+
+if(USE_BUNDLED_LIBVTERM)
+ include(BuildLibvterm)
+endif()
+
+if(USE_BUNDLED_LIBUV)
+ include(BuildLibuv)
+endif()
+
+if(USE_BUNDLED_MSGPACK)
+ include(BuildMsgpack)
+endif()
+
+if(USE_BUNDLED_LUAJIT)
+ include(BuildLuajit)
+endif()
+
+if(USE_BUNDLED_LUA)
+ include(BuildLua)
+endif()
+
+if(USE_BUNDLED_LUAROCKS)
+ include(BuildLuarocks)
+endif()
+
+if(USE_BUNDLED_LUV)
+ include(BuildLuv)
+endif()
+
+if(USE_BUNDLED_GETTEXT)
+ include(BuildGettext)
+endif()
+
+if(USE_BUNDLED_LIBICONV)
+ include(BuildLibiconv)
+endif()
+
+if(USE_BUNDLED_TS_PARSERS)
+ include(BuildTreesitterParsers)
+endif()
+
+if(USE_BUNDLED_TS)
+ include(BuildTreesitter)
+endif()
+
+if(WIN32)
+ include(GetBinaryDeps)
+
+ GetBinaryDep(TARGET wintools
+ INSTALL_COMMAND ${CMAKE_COMMAND} -E copy_directory . ${DEPS_INSTALL_DIR}/bin)
+
+ GetBinaryDep(TARGET wingui
+ INSTALL_COMMAND ${CMAKE_COMMAND} -E copy_directory bin ${DEPS_INSTALL_DIR}/bin
+ COMMAND ${CMAKE_COMMAND} -E copy_directory share ${DEPS_INSTALL_DIR}/share)
+
+ include(TargetArch)
+ GetBinaryDep(TARGET "win32yank_${TARGET_ARCH}"
+ INSTALL_COMMAND ${CMAKE_COMMAND} -E copy win32yank.exe ${DEPS_INSTALL_DIR}/bin)
+
+ if("${TARGET_ARCH}" STREQUAL "X86_64")
+ set(TARGET_ARCH x64)
+ elseif(TARGET_ARCH STREQUAL "X86")
+ set(TARGET_ARCH ia32)
+ endif()
+endif()
+
+# clean-shared-libraries removes ${DEPS_INSTALL_DIR}/lib/nvim/parser/c.dll,
+# resulting in MSVC build failure in CI.
+if (MSVC)
+ set(ALL_DEPS ${THIRD_PARTY_DEPS})
+else()
+ add_custom_target(clean-shared-libraries
+ COMMAND ${CMAKE_COMMAND}
+ -DREMOVE_FILE_GLOB=${DEPS_INSTALL_DIR}/lib/${CMAKE_SHARED_LIBRARY_PREFIX}*${CMAKE_SHARED_LIBRARY_SUFFIX}*
+ -P ${PROJECT_SOURCE_DIR}/cmake/RemoveFiles.cmake
+ DEPENDS ${THIRD_PARTY_DEPS}
+ )
+ set(ALL_DEPS clean-shared-libraries)
+endif()
+
+# TODO(justinmk): does anyone use this target?
+add_custom_target(third-party ALL
+ COMMAND ${CMAKE_COMMAND} -E touch .third-party
+ DEPENDS ${ALL_DEPS}
+)
diff --git a/cmake.deps/cmake/BuildGettext.cmake b/cmake.deps/cmake/BuildGettext.cmake
new file mode 100644
index 0000000000..6128ecfa69
--- /dev/null
+++ b/cmake.deps/cmake/BuildGettext.cmake
@@ -0,0 +1,37 @@
+if(MSVC)
+
+ ExternalProject_Add(gettext
+ PREFIX ${DEPS_BUILD_DIR}
+ URL ${GETTEXT_URL}
+ DOWNLOAD_DIR ${DEPS_DOWNLOAD_DIR}/gettext
+ DOWNLOAD_COMMAND ${CMAKE_COMMAND}
+ -DPREFIX=${DEPS_BUILD_DIR}
+ -DDOWNLOAD_DIR=${DEPS_DOWNLOAD_DIR}/gettext
+ -DURL=${GETTEXT_URL}
+ -DEXPECTED_SHA256=${GETTEXT_SHA256}
+ -DTARGET=gettext
+ -DUSE_EXISTING_SRC_DIR=${USE_EXISTING_SRC_DIR}
+ -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/DownloadAndExtractFile.cmake
+ CONFIGURE_COMMAND ${CMAKE_COMMAND} -E copy
+ ${CMAKE_CURRENT_SOURCE_DIR}/cmake/GettextCMakeLists.txt
+ ${DEPS_BUILD_DIR}/src/gettext/CMakeLists.txt
+ COMMAND ${CMAKE_COMMAND} ${DEPS_BUILD_DIR}/src/gettext
+ -DCMAKE_INSTALL_PREFIX=${DEPS_INSTALL_DIR}
+ # Pass toolchain
+ -DCMAKE_TOOLCHAIN_FILE=${TOOLCHAIN}
+ -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
+ -DCMAKE_GENERATOR=${CMAKE_GENERATOR}
+ -DCMAKE_GENERATOR_PLATFORM=${CMAKE_GENERATOR_PLATFORM}
+ -DLIBICONV_INCLUDE_DIRS=${DEPS_INSTALL_DIR}/include
+ -DLIBICONV_LIBRARIES=${DEPS_LIB_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}libcharset${CMAKE_STATIC_LIBRARY_SUFFIX}$<SEMICOLON>${DEPS_LIB_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}libiconv${CMAKE_STATIC_LIBRARY_SUFFIX}
+ BUILD_COMMAND ${CMAKE_COMMAND} --build . --config ${CMAKE_BUILD_TYPE}
+ INSTALL_COMMAND ${CMAKE_COMMAND} --build . --target install --config ${CMAKE_BUILD_TYPE})
+
+else()
+ message(FATAL_ERROR "Trying to build gettext in an unsupported system ${CMAKE_SYSTEM_NAME}/${CMAKE_C_COMPILER_ID}")
+endif()
+
+list(APPEND THIRD_PARTY_DEPS gettext)
+if(USE_BUNDLED_LIBICONV)
+ add_dependencies(gettext libiconv)
+endif()
diff --git a/cmake.deps/cmake/BuildLibiconv.cmake b/cmake.deps/cmake/BuildLibiconv.cmake
new file mode 100644
index 0000000000..5ff33e0cd3
--- /dev/null
+++ b/cmake.deps/cmake/BuildLibiconv.cmake
@@ -0,0 +1,32 @@
+if(MSVC)
+
+ ExternalProject_Add(libiconv
+ PREFIX ${DEPS_BUILD_DIR}
+ URL ${LIBICONV_URL}
+ DOWNLOAD_DIR ${DEPS_DOWNLOAD_DIR}/libiconv
+ DOWNLOAD_COMMAND ${CMAKE_COMMAND}
+ -DPREFIX=${DEPS_BUILD_DIR}
+ -DDOWNLOAD_DIR=${DEPS_DOWNLOAD_DIR}/libiconv
+ -DURL=${LIBICONV_URL}
+ -DEXPECTED_SHA256=${LIBICONV_SHA256}
+ -DTARGET=libiconv
+ -DUSE_EXISTING_SRC_DIR=${USE_EXISTING_SRC_DIR}
+ -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/DownloadAndExtractFile.cmake
+ CONFIGURE_COMMAND ${CMAKE_COMMAND} -E copy
+ ${CMAKE_CURRENT_SOURCE_DIR}/cmake/LibiconvCMakeLists.txt
+ ${DEPS_BUILD_DIR}/src/libiconv/CMakeLists.txt
+ COMMAND ${CMAKE_COMMAND} ${DEPS_BUILD_DIR}/src/libiconv
+ -DCMAKE_INSTALL_PREFIX=${DEPS_INSTALL_DIR}
+ # Pass toolchain
+ -DCMAKE_TOOLCHAIN_FILE=${TOOLCHAIN}
+ -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
+ -DCMAKE_GENERATOR=${CMAKE_GENERATOR}
+ -DCMAKE_GENERATOR_PLATFORM=${CMAKE_GENERATOR_PLATFORM}
+ BUILD_COMMAND ${CMAKE_COMMAND} --build . --config ${CMAKE_BUILD_TYPE}
+ INSTALL_COMMAND ${CMAKE_COMMAND} --build . --target install --config ${CMAKE_BUILD_TYPE})
+
+else()
+ message(FATAL_ERROR "Trying to build libiconv in an unsupported system ${CMAKE_SYSTEM_NAME}/${CMAKE_C_COMPILER_ID}")
+endif()
+
+list(APPEND THIRD_PARTY_DEPS libiconv)
diff --git a/cmake.deps/cmake/BuildLibtermkey.cmake b/cmake.deps/cmake/BuildLibtermkey.cmake
new file mode 100644
index 0000000000..d44e09d734
--- /dev/null
+++ b/cmake.deps/cmake/BuildLibtermkey.cmake
@@ -0,0 +1,57 @@
+if(WIN32)
+ExternalProject_Add(libtermkey
+ PREFIX ${DEPS_BUILD_DIR}
+ URL ${LIBTERMKEY_URL}
+ DOWNLOAD_DIR ${DEPS_DOWNLOAD_DIR}/libtermkey
+ DOWNLOAD_COMMAND ${CMAKE_COMMAND}
+ -DPREFIX=${DEPS_BUILD_DIR}
+ -DDOWNLOAD_DIR=${DEPS_DOWNLOAD_DIR}/libtermkey
+ -DURL=${LIBTERMKEY_URL}
+ -DEXPECTED_SHA256=${LIBTERMKEY_SHA256}
+ -DTARGET=libtermkey
+ -DUSE_EXISTING_SRC_DIR=${USE_EXISTING_SRC_DIR}
+ -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/DownloadAndExtractFile.cmake
+ CONFIGURE_COMMAND ${CMAKE_COMMAND} -E copy
+ ${CMAKE_CURRENT_SOURCE_DIR}/cmake/libtermkeyCMakeLists.txt
+ ${DEPS_BUILD_DIR}/src/libtermkey/CMakeLists.txt
+ COMMAND ${CMAKE_COMMAND} ${DEPS_BUILD_DIR}/src/libtermkey
+ -DCMAKE_INSTALL_PREFIX=${DEPS_INSTALL_DIR}
+ # Pass toolchain
+ -DCMAKE_TOOLCHAIN_FILE=${TOOLCHAIN}
+ -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
+ # Hack to avoid -rdynamic in Mingw
+ -DCMAKE_SHARED_LIBRARY_LINK_C_FLAGS=""
+ -DCMAKE_GENERATOR=${CMAKE_GENERATOR}
+ -DCMAKE_GENERATOR_PLATFORM=${CMAKE_GENERATOR_PLATFORM}
+ -DUNIBILIUM_INCLUDE_DIRS=${DEPS_INSTALL_DIR}/include
+ -DUNIBILIUM_LIBRARIES=${DEPS_LIB_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}unibilium${CMAKE_STATIC_LIBRARY_SUFFIX}
+ BUILD_COMMAND ${CMAKE_COMMAND} --build . --config ${CMAKE_BUILD_TYPE}
+ INSTALL_COMMAND ${CMAKE_COMMAND} --build . --target install --config ${CMAKE_BUILD_TYPE})
+else()
+find_package(PkgConfig REQUIRED)
+
+ExternalProject_Add(libtermkey
+ PREFIX ${DEPS_BUILD_DIR}
+ URL ${LIBTERMKEY_URL}
+ DOWNLOAD_DIR ${DEPS_DOWNLOAD_DIR}/libtermkey
+ DOWNLOAD_COMMAND ${CMAKE_COMMAND}
+ -DPREFIX=${DEPS_BUILD_DIR}
+ -DDOWNLOAD_DIR=${DEPS_DOWNLOAD_DIR}/libtermkey
+ -DURL=${LIBTERMKEY_URL}
+ -DEXPECTED_SHA256=${LIBTERMKEY_SHA256}
+ -DTARGET=libtermkey
+ -DUSE_EXISTING_SRC_DIR=${USE_EXISTING_SRC_DIR}
+ -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/DownloadAndExtractFile.cmake
+ CONFIGURE_COMMAND ""
+ BUILD_IN_SOURCE 1
+ BUILD_COMMAND ""
+ INSTALL_COMMAND ${MAKE_PRG} CC=${DEPS_C_COMPILER}
+ PREFIX=${DEPS_INSTALL_DIR}
+ PKG_CONFIG_PATH=${DEPS_LIB_DIR}/pkgconfig
+ CFLAGS=-fPIC
+ LDFLAGS+=-static
+ ${DEFAULT_MAKE_CFLAGS}
+ install)
+endif()
+
+list(APPEND THIRD_PARTY_DEPS libtermkey)
diff --git a/cmake.deps/cmake/BuildLibuv.cmake b/cmake.deps/cmake/BuildLibuv.cmake
new file mode 100644
index 0000000000..ba5de38714
--- /dev/null
+++ b/cmake.deps/cmake/BuildLibuv.cmake
@@ -0,0 +1,77 @@
+# BuildLibuv(TARGET targetname CONFIGURE_COMMAND ... BUILD_COMMAND ... INSTALL_COMMAND ...)
+# Reusable function to build libuv, wraps ExternalProject_Add.
+# Failing to pass a command argument will result in no command being run
+function(BuildLibuv)
+ cmake_parse_arguments(_libuv
+ "BUILD_IN_SOURCE"
+ "TARGET"
+ "PATCH_COMMAND;CONFIGURE_COMMAND;BUILD_COMMAND;INSTALL_COMMAND"
+ ${ARGN})
+
+ if(NOT _libuv_CONFIGURE_COMMAND AND NOT _libuv_BUILD_COMMAND
+ AND NOT _libuv_INSTALL_COMMAND)
+ message(FATAL_ERROR "Must pass at least one of CONFIGURE_COMMAND, BUILD_COMMAND, INSTALL_COMMAND")
+ endif()
+ if(NOT _libuv_TARGET)
+ set(_libuv_TARGET "libuv")
+ endif()
+
+ ExternalProject_Add(${_libuv_TARGET}
+ PREFIX ${DEPS_BUILD_DIR}
+ URL ${LIBUV_URL}
+ DOWNLOAD_DIR ${DEPS_DOWNLOAD_DIR}/libuv
+ DOWNLOAD_COMMAND ${CMAKE_COMMAND}
+ -DPREFIX=${DEPS_BUILD_DIR}
+ -DDOWNLOAD_DIR=${DEPS_DOWNLOAD_DIR}/libuv
+ -DURL=${LIBUV_URL}
+ -DEXPECTED_SHA256=${LIBUV_SHA256}
+ -DTARGET=${_libuv_TARGET}
+ -DUSE_EXISTING_SRC_DIR=${USE_EXISTING_SRC_DIR}
+ -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/DownloadAndExtractFile.cmake
+ PATCH_COMMAND "${_libuv_PATCH_COMMAND}"
+ BUILD_IN_SOURCE ${_libuv_BUILD_IN_SOURCE}
+ CONFIGURE_COMMAND "${_libuv_CONFIGURE_COMMAND}"
+ BUILD_COMMAND "${_libuv_BUILD_COMMAND}"
+ INSTALL_COMMAND "${_libuv_INSTALL_COMMAND}")
+endfunction()
+
+set(UNIX_CFGCMD sh ${DEPS_BUILD_DIR}/src/libuv/autogen.sh &&
+ ${DEPS_BUILD_DIR}/src/libuv/configure --with-pic --disable-shared
+ --prefix=${DEPS_INSTALL_DIR} --libdir=${DEPS_INSTALL_DIR}/lib
+ CC=${DEPS_C_COMPILER})
+
+if(UNIX)
+ BuildLibuv(
+ CONFIGURE_COMMAND ${UNIX_CFGCMD} MAKE=${MAKE_PRG}
+ INSTALL_COMMAND ${MAKE_PRG} V=1 install)
+
+elseif(WIN32)
+
+ set(UV_OUTPUT_DIR ${DEPS_BUILD_DIR}/src/libuv/${CMAKE_BUILD_TYPE})
+ if(MSVC)
+ set(BUILD_SHARED ON)
+ elseif(MINGW)
+ set(BUILD_SHARED OFF)
+ else()
+ message(FATAL_ERROR "Trying to build libuv in an unsupported system ${CMAKE_SYSTEM_NAME}/${CMAKE_C_COMPILER_ID}")
+ endif()
+ BuildLibUv(BUILD_IN_SOURCE
+ CONFIGURE_COMMAND ${CMAKE_COMMAND} -E copy
+ ${CMAKE_CURRENT_SOURCE_DIR}/cmake/LibuvCMakeLists.txt
+ ${DEPS_BUILD_DIR}/src/libuv/CMakeLists.txt
+ COMMAND ${CMAKE_COMMAND} ${DEPS_BUILD_DIR}/src/libuv/CMakeLists.txt
+ -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
+ -DCMAKE_GENERATOR=${CMAKE_GENERATOR}
+ -DCMAKE_GENERATOR_PLATFORM=${CMAKE_GENERATOR_PLATFORM}
+ -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
+ -DBUILD_SHARED_LIBS=${BUILD_SHARED}
+ -DCMAKE_INSTALL_PREFIX=${DEPS_INSTALL_DIR}
+ PATCH_COMMAND ${LIBUV_PATCH_COMMAND}
+ BUILD_COMMAND ${CMAKE_COMMAND} --build . --config ${CMAKE_BUILD_TYPE}
+ INSTALL_COMMAND ${CMAKE_COMMAND} --build . --target install --config ${CMAKE_BUILD_TYPE})
+
+else()
+ message(FATAL_ERROR "Trying to build libuv in an unsupported system ${CMAKE_SYSTEM_NAME}/${CMAKE_C_COMPILER_ID}")
+endif()
+
+list(APPEND THIRD_PARTY_DEPS libuv)
diff --git a/cmake.deps/cmake/BuildLibvterm.cmake b/cmake.deps/cmake/BuildLibvterm.cmake
new file mode 100644
index 0000000000..2c300dda7c
--- /dev/null
+++ b/cmake.deps/cmake/BuildLibvterm.cmake
@@ -0,0 +1,69 @@
+# BuildLibvterm(CONFIGURE_COMMAND ... BUILD_COMMAND ... INSTALL_COMMAND ...)
+# Failing to pass a command argument will result in no command being run
+function(BuildLibvterm)
+ cmake_parse_arguments(_libvterm
+ ""
+ ""
+ "PATCH_COMMAND;CONFIGURE_COMMAND;BUILD_COMMAND;INSTALL_COMMAND"
+ ${ARGN})
+
+ if(NOT _libvterm_CONFIGURE_COMMAND AND NOT _libvterm_BUILD_COMMAND
+ AND NOT _libvterm_INSTALL_COMMAND)
+ message(FATAL_ERROR "Must pass at least one of CONFIGURE_COMMAND, BUILD_COMMAND, INSTALL_COMMAND")
+ endif()
+
+ ExternalProject_Add(libvterm
+ PREFIX ${DEPS_BUILD_DIR}
+ URL ${LIBVTERM_URL}
+ DOWNLOAD_DIR ${DEPS_DOWNLOAD_DIR}/libvterm
+ DOWNLOAD_COMMAND ${CMAKE_COMMAND}
+ -DPREFIX=${DEPS_BUILD_DIR}
+ -DDOWNLOAD_DIR=${DEPS_DOWNLOAD_DIR}/libvterm
+ -DURL=${LIBVTERM_URL}
+ -DEXPECTED_SHA256=${LIBVTERM_SHA256}
+ -DTARGET=libvterm
+ -DUSE_EXISTING_SRC_DIR=${USE_EXISTING_SRC_DIR}
+ -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/DownloadAndExtractFile.cmake
+ PATCH_COMMAND "${_libvterm_PATCH_COMMAND}"
+ BUILD_IN_SOURCE 1
+ CONFIGURE_COMMAND "${_libvterm_CONFIGURE_COMMAND}"
+ BUILD_COMMAND "${_libvterm_BUILD_COMMAND}"
+ INSTALL_COMMAND "${_libvterm_INSTALL_COMMAND}")
+endfunction()
+
+if(WIN32)
+ if(MSVC)
+ set(LIBVTERM_PATCH_COMMAND
+ ${GIT_EXECUTABLE} -C ${DEPS_BUILD_DIR}/src/libvterm init
+ COMMAND ${GIT_EXECUTABLE} -C ${DEPS_BUILD_DIR}/src/libvterm apply --ignore-whitespace
+ ${CMAKE_CURRENT_SOURCE_DIR}/patches/libvterm-Remove-VLAs-for-MSVC.patch)
+ endif()
+ set(LIBVTERM_CONFIGURE_COMMAND ${CMAKE_COMMAND} -E copy
+ ${CMAKE_CURRENT_SOURCE_DIR}/cmake/LibvtermCMakeLists.txt
+ ${DEPS_BUILD_DIR}/src/libvterm/CMakeLists.txt
+ COMMAND ${CMAKE_COMMAND} -E copy
+ ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Libvterm-tbl2inc_c.cmake
+ ${DEPS_BUILD_DIR}/src/libvterm/tbl2inc_c.cmake
+ COMMAND ${CMAKE_COMMAND} ${DEPS_BUILD_DIR}/src/libvterm
+ -DCMAKE_INSTALL_PREFIX=${DEPS_INSTALL_DIR}
+ -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
+ -DCMAKE_GENERATOR_PLATFORM=${CMAKE_GENERATOR_PLATFORM}
+ "-DCMAKE_C_FLAGS:STRING=${CMAKE_C_COMPILER_ARG1} -fPIC"
+ -DCMAKE_GENERATOR=${CMAKE_GENERATOR})
+ set(LIBVTERM_BUILD_COMMAND ${CMAKE_COMMAND} --build . --config ${CMAKE_BUILD_TYPE})
+ set(LIBVTERM_INSTALL_COMMAND ${CMAKE_COMMAND} --build . --target install --config ${CMAKE_BUILD_TYPE})
+else()
+ set(LIBVTERM_INSTALL_COMMAND ${MAKE_PRG} CC=${DEPS_C_COMPILER}
+ PREFIX=${DEPS_INSTALL_DIR}
+ CFLAGS=-fPIC
+ LDFLAGS+=-static
+ ${DEFAULT_MAKE_CFLAGS}
+ install)
+endif()
+
+BuildLibvterm(PATCH_COMMAND ${LIBVTERM_PATCH_COMMAND}
+ CONFIGURE_COMMAND ${LIBVTERM_CONFIGURE_COMMAND}
+ BUILD_COMMAND ${LIBVTERM_BUILD_COMMAND}
+ INSTALL_COMMAND ${LIBVTERM_INSTALL_COMMAND})
+
+list(APPEND THIRD_PARTY_DEPS libvterm)
diff --git a/cmake.deps/cmake/BuildLua.cmake b/cmake.deps/cmake/BuildLua.cmake
new file mode 100644
index 0000000000..a40cb7dcb2
--- /dev/null
+++ b/cmake.deps/cmake/BuildLua.cmake
@@ -0,0 +1,96 @@
+# BuildLua(CONFIGURE_COMMAND ... BUILD_COMMAND ... INSTALL_COMMAND ...)
+# Reusable function to build lua, wraps ExternalProject_Add.
+# Failing to pass a command argument will result in no command being run
+function(BuildLua)
+ cmake_parse_arguments(_lua
+ ""
+ ""
+ "CONFIGURE_COMMAND;BUILD_COMMAND;INSTALL_COMMAND"
+ ${ARGN})
+
+ if(NOT _lua_CONFIGURE_COMMAND AND NOT _lua_BUILD_COMMAND
+ AND NOT _lua_INSTALL_COMMAND)
+ message(FATAL_ERROR "Must pass at least one of CONFIGURE_COMMAND, BUILD_COMMAND, INSTALL_COMMAND")
+ endif()
+
+ ExternalProject_Add(lua
+ PREFIX ${DEPS_BUILD_DIR}
+ URL ${LUA_URL}
+ DOWNLOAD_DIR ${DEPS_DOWNLOAD_DIR}/lua
+ DOWNLOAD_COMMAND ${CMAKE_COMMAND}
+ -DPREFIX=${DEPS_BUILD_DIR}
+ -DDOWNLOAD_DIR=${DEPS_DOWNLOAD_DIR}/lua
+ -DURL=${LUA_URL}
+ -DEXPECTED_SHA256=${LUA_SHA256}
+ -DTARGET=lua
+ -DUSE_EXISTING_SRC_DIR=${USE_EXISTING_SRC_DIR}
+ -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/DownloadAndExtractFile.cmake
+ CONFIGURE_COMMAND "${_lua_CONFIGURE_COMMAND}"
+ BUILD_IN_SOURCE 1
+ BUILD_COMMAND "${_lua_BUILD_COMMAND}"
+ INSTALL_COMMAND "${_lua_INSTALL_COMMAND}")
+endfunction()
+
+if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
+ set(LUA_TARGET linux)
+elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
+ set(LUA_TARGET macosx)
+elseif(CMAKE_SYSTEM_NAME STREQUAL "FreeBSD")
+ set(LUA_TARGET freebsd)
+elseif(CMAKE_SYSTEM_NAME MATCHES "BSD")
+ set(CMAKE_LUA_TARGET bsd)
+elseif(CMAKE_SYSTEM_NAME MATCHES "^MINGW")
+ set(CMAKE_LUA_TARGET mingw)
+else()
+ if(UNIX)
+ set(LUA_TARGET posix)
+ else()
+ set(LUA_TARGET generic)
+ endif()
+endif()
+
+set(LUA_CFLAGS "-O0 -g3 -fPIC")
+set(LUA_LDFLAGS "")
+
+if(CLANG_ASAN_UBSAN)
+ set(LUA_CFLAGS "${LUA_CFLAGS} -fsanitize=address")
+ set(LUA_CFLAGS "${LUA_CFLAGS} -fno-omit-frame-pointer")
+ set(LUA_CFLAGS "${LUA_CFLAGS} -fno-optimize-sibling-calls")
+
+ set(LUA_LDFLAGS "${LUA_LDFLAGS} -fsanitize=address")
+endif()
+
+set(LUA_CONFIGURE_COMMAND
+ sed -e "/^CC/s@gcc@${CMAKE_C_COMPILER} ${CMAKE_C_COMPILER_ARG1}@"
+ -e "/^CFLAGS/s@-O2@${LUA_CFLAGS}@"
+ -e "/^MYLDFLAGS/s@$@${LUA_LDFLAGS}@"
+ -e "s@-lreadline@@g"
+ -e "s@-lhistory@@g"
+ -e "s@-lncurses@@g"
+ -i ${DEPS_BUILD_DIR}/src/lua/src/Makefile &&
+ sed -e "/#define LUA_USE_READLINE/d"
+ -e "s@\\(#define LUA_ROOT[ ]*\"\\)/usr/local@\\1${DEPS_INSTALL_DIR}@"
+ -i ${DEPS_BUILD_DIR}/src/lua/src/luaconf.h)
+set(LUA_INSTALL_TOP_ARG "INSTALL_TOP=${DEPS_INSTALL_DIR}")
+set(LUA_BUILD_COMMAND
+ ${MAKE_PRG} ${LUA_INSTALL_TOP_ARG} ${LUA_TARGET})
+set(LUA_INSTALL_COMMAND
+ ${MAKE_PRG} ${LUA_INSTALL_TOP_ARG} install)
+
+message(STATUS "Lua target is ${LUA_TARGET}")
+
+BuildLua(CONFIGURE_COMMAND ${LUA_CONFIGURE_COMMAND}
+ BUILD_COMMAND ${LUA_BUILD_COMMAND}
+ INSTALL_COMMAND ${LUA_INSTALL_COMMAND})
+list(APPEND THIRD_PARTY_DEPS lua)
+
+set(BUSTED ${DEPS_INSTALL_DIR}/bin/busted)
+set(BUSTED_LUA ${BUSTED}-lua)
+
+add_custom_command(OUTPUT ${BUSTED_LUA}
+ COMMAND sed -e 's/^exec/exec $$LUA_DEBUGGER/' -e 's/jit//g' < ${BUSTED} > ${BUSTED_LUA} && chmod +x ${BUSTED_LUA}
+ DEPENDS lua busted ${BUSTED})
+add_custom_target(busted-lua
+ DEPENDS ${DEPS_INSTALL_DIR}/bin/busted-lua)
+
+list(APPEND THIRD_PARTY_DEPS busted-lua)
diff --git a/cmake.deps/cmake/BuildLuajit.cmake b/cmake.deps/cmake/BuildLuajit.cmake
new file mode 100644
index 0000000000..c8d5b39398
--- /dev/null
+++ b/cmake.deps/cmake/BuildLuajit.cmake
@@ -0,0 +1,163 @@
+# BuildLuajit(TARGET targetname CONFIGURE_COMMAND ... BUILD_COMMAND ... INSTALL_COMMAND ...)
+# Reusable function to build luajit, wraps ExternalProject_Add.
+# Failing to pass a command argument will result in no command being run
+function(BuildLuajit)
+ cmake_parse_arguments(_luajit
+ ""
+ "TARGET"
+ "CONFIGURE_COMMAND;BUILD_COMMAND;INSTALL_COMMAND;DEPENDS"
+ ${ARGN})
+ if(NOT _luajit_CONFIGURE_COMMAND AND NOT _luajit_BUILD_COMMAND
+ AND NOT _luajit_INSTALL_COMMAND)
+ message(FATAL_ERROR "Must pass at least one of CONFIGURE_COMMAND, BUILD_COMMAND, INSTALL_COMMAND")
+ endif()
+ if(NOT _luajit_TARGET)
+ set(_luajit_TARGET "luajit")
+ endif()
+
+ ExternalProject_Add(${_luajit_TARGET}
+ PREFIX ${DEPS_BUILD_DIR}
+ URL ${LUAJIT_URL}
+ DOWNLOAD_DIR ${DEPS_DOWNLOAD_DIR}/luajit
+ DOWNLOAD_COMMAND ${CMAKE_COMMAND}
+ -DPREFIX=${DEPS_BUILD_DIR}
+ -DDOWNLOAD_DIR=${DEPS_DOWNLOAD_DIR}/luajit
+ -DURL=${LUAJIT_URL}
+ -DEXPECTED_SHA256=${LUAJIT_SHA256}
+ -DTARGET=${_luajit_TARGET}
+ -DUSE_EXISTING_SRC_DIR=${USE_EXISTING_SRC_DIR}
+ -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/DownloadAndExtractFile.cmake
+ CONFIGURE_COMMAND "${_luajit_CONFIGURE_COMMAND}"
+ BUILD_IN_SOURCE 1
+ BUILD_COMMAND "${_luajit_BUILD_COMMAND}"
+ INSTALL_COMMAND "${_luajit_INSTALL_COMMAND}"
+ DEPENDS "${_luajit_DEPENDS}")
+
+ # Create symlink for development version manually.
+ if(UNIX)
+ add_custom_command(
+ TARGET ${_luajit_TARGET}
+ COMMAND ${CMAKE_COMMAND} -E create_symlink luajit-2.1.0-beta3 ${DEPS_BIN_DIR}/${_luajit_TARGET})
+ endif()
+endfunction()
+
+check_c_compiler_flag(-fno-stack-check HAS_NO_STACK_CHECK)
+if(CMAKE_SYSTEM_NAME MATCHES "Darwin" AND HAS_NO_STACK_CHECK)
+ set(NO_STACK_CHECK "CFLAGS+=-fno-stack-check")
+else()
+ set(NO_STACK_CHECK "")
+endif()
+if(CMAKE_SYSTEM_NAME MATCHES "OpenBSD")
+ set(AMD64_ABI "LDFLAGS=-lpthread -lc++abi")
+else()
+ set(AMD64_ABI "")
+endif()
+set(BUILDCMD_UNIX ${MAKE_PRG} CFLAGS=-fPIC
+ CFLAGS+=-DLUA_USE_APICHECK
+ CFLAGS+=-funwind-tables
+ ${NO_STACK_CHECK}
+ ${AMD64_ABI}
+ CCDEBUG+=-g
+ Q=)
+
+if(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
+ if(CMAKE_OSX_DEPLOYMENT_TARGET)
+ set(DEPLOYMENT_TARGET "MACOSX_DEPLOYMENT_TARGET=${CMAKE_OSX_DEPLOYMENT_TARGET}")
+ else()
+ execute_process(COMMAND sw_vers -productVersion
+ OUTPUT_VARIABLE MACOS_VERSION
+ OUTPUT_STRIP_TRAILING_WHITESPACE)
+ set(DEPLOYMENT_TARGET "MACOSX_DEPLOYMENT_TARGET=${MACOS_VERSION}")
+ endif()
+else()
+ set(DEPLOYMENT_TARGET "")
+endif()
+
+if((UNIX AND NOT APPLE) OR (APPLE AND NOT CMAKE_OSX_ARCHITECTURES))
+ BuildLuaJit(INSTALL_COMMAND ${BUILDCMD_UNIX}
+ CC=${DEPS_C_COMPILER} PREFIX=${DEPS_INSTALL_DIR}
+ ${DEPLOYMENT_TARGET} install)
+
+elseif(CMAKE_OSX_ARCHITECTURES AND APPLE)
+
+ # Passing multiple `-arch` flags to the LuaJIT build will cause it to fail.
+ # To get a working universal build, we build each requested architecture slice
+ # individually then `lipo` them all up.
+ set(LUAJIT_SRC_DIR "${DEPS_BUILD_DIR}/src/luajit")
+ foreach(ARCH IN LISTS CMAKE_OSX_ARCHITECTURES)
+ set(STATIC_CC "${LUAJIT_C_COMPILER} -arch ${ARCH}")
+ set(DYNAMIC_CC "${LUAJIT_C_COMPILER} -arch ${ARCH} -fPIC")
+ set(TARGET_LD "${LUAJIT_C_COMPILER} -arch ${ARCH}")
+ list(APPEND LUAJIT_THIN_EXECUTABLES "${LUAJIT_SRC_DIR}-${ARCH}/src/luajit")
+ list(APPEND LUAJIT_THIN_STATIC_LIBS "${LUAJIT_SRC_DIR}-${ARCH}/src/libluajit.a")
+ list(APPEND LUAJIT_THIN_DYLIBS "${LUAJIT_SRC_DIR}-${ARCH}/src/libluajit.so")
+ list(APPEND LUAJIT_THIN_TARGETS "luajit-${ARCH}")
+
+ # See https://luajit.org/install.html#cross.
+ BuildLuaJit(TARGET "luajit-${ARCH}"
+ BUILD_COMMAND ${BUILDCMD_UNIX}
+ CC=${LUAJIT_C_COMPILER} STATIC_CC=${STATIC_CC}
+ DYNAMIC_CC=${DYNAMIC_CC} TARGET_LD=${TARGET_LD}
+ PREFIX=${DEPS_INSTALL_DIR}
+ ${DEPLOYMENT_TARGET})
+ endforeach()
+ BuildLuaJit(
+ CONFIGURE_COMMAND ${BUILDCMD_UNIX} CC=${LUAJIT_C_COMPILER} PREFIX=${DEPS_INSTALL_DIR} ${DEPLOYMENT_TARGET}
+ COMMAND ${CMAKE_COMMAND} -E rm -f ${LUAJIT_SRC_DIR}/src/luajit ${LUAJIT_SRC_DIR}/src/libluajit.so ${LUAJIT_SRC_DIR}/src/libluajit.a
+ BUILD_COMMAND lipo ${LUAJIT_THIN_EXECUTABLES} -create -output ${LUAJIT_SRC_DIR}/src/luajit
+ COMMAND lipo ${LUAJIT_THIN_STATIC_LIBS} -create -output ${LUAJIT_SRC_DIR}/src/libluajit.a
+ COMMAND lipo ${LUAJIT_THIN_DYLIBS} -create -output ${LUAJIT_SRC_DIR}/src/libluajit.so
+ INSTALL_COMMAND ${BUILDCMD_UNIX} CC=${LUAJIT_C_COMPILER} PREFIX=${DEPS_INSTALL_DIR} ${DEPLOYMENT_TARGET} install
+ DEPENDS ${LUAJIT_THIN_TARGETS}
+ )
+
+elseif(MINGW)
+
+ if(CMAKE_GENERATOR MATCHES "Ninja")
+ set(LUAJIT_MAKE_PRG ${MAKE_PRG})
+ else()
+ set(LUAJIT_MAKE_PRG ${CMAKE_MAKE_PROGRAM})
+ endif()
+ BuildLuaJit(BUILD_COMMAND ${LUAJIT_MAKE_PRG} CC=${DEPS_C_COMPILER}
+ PREFIX=${DEPS_INSTALL_DIR}
+ CFLAGS+=-DLUA_USE_APICHECK
+ CFLAGS+=-funwind-tables
+ CCDEBUG+=-g
+ BUILDMODE=static
+ # Build a DLL too
+ COMMAND ${LUAJIT_MAKE_PRG} CC=${DEPS_C_COMPILER} BUILDMODE=dynamic
+
+ INSTALL_COMMAND ${CMAKE_COMMAND} -E make_directory ${DEPS_INSTALL_DIR}/bin
+ COMMAND ${CMAKE_COMMAND} -E copy ${DEPS_BUILD_DIR}/src/luajit/src/luajit.exe ${DEPS_INSTALL_DIR}/bin
+ COMMAND ${CMAKE_COMMAND} -E copy ${DEPS_BUILD_DIR}/src/luajit/src/lua51.dll ${DEPS_INSTALL_DIR}/bin
+ COMMAND ${CMAKE_COMMAND} -E make_directory ${DEPS_INSTALL_DIR}/lib
+ # Luarocks searches for lua51.dll in lib
+ COMMAND ${CMAKE_COMMAND} -E copy ${DEPS_BUILD_DIR}/src/luajit/src/lua51.dll ${DEPS_INSTALL_DIR}/lib
+ COMMAND ${CMAKE_COMMAND} -E copy ${DEPS_BUILD_DIR}/src/luajit/src/libluajit.a ${DEPS_INSTALL_DIR}/lib
+ COMMAND ${CMAKE_COMMAND} -E make_directory ${DEPS_INSTALL_DIR}/include/luajit-2.1
+ COMMAND ${CMAKE_COMMAND} -DFROM_GLOB=${DEPS_BUILD_DIR}/src/luajit/src/*.h -DTO=${DEPS_INSTALL_DIR}/include/luajit-2.1 -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/CopyFilesGlob.cmake
+ COMMAND ${CMAKE_COMMAND} -E make_directory ${DEPS_INSTALL_DIR}/bin/lua/jit
+ COMMAND ${CMAKE_COMMAND} -E copy_directory ${DEPS_BUILD_DIR}/src/luajit/src/jit ${DEPS_INSTALL_DIR}/bin/lua/jit
+ )
+elseif(MSVC)
+
+ BuildLuaJit(
+ BUILD_COMMAND ${CMAKE_COMMAND} -E chdir ${DEPS_BUILD_DIR}/src/luajit/src ${DEPS_BUILD_DIR}/src/luajit/src/msvcbuild.bat
+ INSTALL_COMMAND ${CMAKE_COMMAND} -E make_directory ${DEPS_INSTALL_DIR}/bin
+ COMMAND ${CMAKE_COMMAND} -E copy ${DEPS_BUILD_DIR}/src/luajit/src/luajit.exe ${DEPS_INSTALL_DIR}/bin
+ COMMAND ${CMAKE_COMMAND} -E copy ${DEPS_BUILD_DIR}/src/luajit/src/lua51.dll ${DEPS_INSTALL_DIR}/bin
+ COMMAND ${CMAKE_COMMAND} -E make_directory ${DEPS_INSTALL_DIR}/lib
+ # Luarocks searches for lua51.lib
+ COMMAND ${CMAKE_COMMAND} -E copy ${DEPS_BUILD_DIR}/src/luajit/src/lua51.lib ${DEPS_INSTALL_DIR}/lib/lua51.lib
+ # Luv searches for luajit.lib
+ COMMAND ${CMAKE_COMMAND} -E copy ${DEPS_BUILD_DIR}/src/luajit/src/lua51.lib ${DEPS_INSTALL_DIR}/lib/luajit.lib
+ COMMAND ${CMAKE_COMMAND} -E make_directory ${DEPS_INSTALL_DIR}/include/luajit-2.1
+ COMMAND ${CMAKE_COMMAND} -DFROM_GLOB=${DEPS_BUILD_DIR}/src/luajit/src/*.h -DTO=${DEPS_INSTALL_DIR}/include/luajit-2.1 -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/CopyFilesGlob.cmake
+ COMMAND ${CMAKE_COMMAND} -E make_directory ${DEPS_INSTALL_DIR}/bin/lua/jit
+ COMMAND ${CMAKE_COMMAND} -E copy_directory ${DEPS_BUILD_DIR}/src/luajit/src/jit ${DEPS_INSTALL_DIR}/bin/lua/jit
+ )
+else()
+ message(FATAL_ERROR "Trying to build luajit in an unsupported system ${CMAKE_SYSTEM_NAME}/${CMAKE_C_COMPILER_ID}")
+endif()
+
+list(APPEND THIRD_PARTY_DEPS luajit)
diff --git a/cmake.deps/cmake/BuildLuarocks.cmake b/cmake.deps/cmake/BuildLuarocks.cmake
new file mode 100644
index 0000000000..6933d263f2
--- /dev/null
+++ b/cmake.deps/cmake/BuildLuarocks.cmake
@@ -0,0 +1,227 @@
+# Luarocks recipe. Luarocks is only required when building Neovim, when
+# cross compiling we still want to build for the HOST system, whenever
+# writing a recipe that is meant for cross-compile, use the HOSTDEPS_* variables
+# instead of DEPS_* - check the main CMakeLists.txt for a list.
+#
+# NOTE: LuaRocks rocks need to "DEPENDS" on the previous module, because
+# running luarocks in parallel will break, e.g. when some rocks have
+# the same dependency..
+
+option(USE_BUNDLED_BUSTED "Use the bundled version of busted to run tests." ON)
+
+# BuildLuarocks(CONFIGURE_COMMAND ... BUILD_COMMAND ... INSTALL_COMMAND ...)
+# Reusable function to build luarocks, wraps ExternalProject_Add.
+# Failing to pass a command argument will result in no command being run
+function(BuildLuarocks)
+ cmake_parse_arguments(_luarocks
+ ""
+ ""
+ "CONFIGURE_COMMAND;BUILD_COMMAND;INSTALL_COMMAND"
+ ${ARGN})
+
+ if(NOT _luarocks_CONFIGURE_COMMAND AND NOT _luarocks_BUILD_COMMAND
+ AND NOT _luarocks_INSTALL_COMMAND)
+ message(FATAL_ERROR "Must pass at least one of CONFIGURE_COMMAND, BUILD_COMMAND, INSTALL_COMMAND")
+ endif()
+
+ ExternalProject_Add(luarocks
+ PREFIX ${DEPS_BUILD_DIR}
+ URL ${LUAROCKS_URL}
+ DOWNLOAD_DIR ${DEPS_DOWNLOAD_DIR}/luarocks
+ DOWNLOAD_COMMAND ${CMAKE_COMMAND}
+ -DPREFIX=${DEPS_BUILD_DIR}
+ -DDOWNLOAD_DIR=${DEPS_DOWNLOAD_DIR}/luarocks
+ -DURL=${LUAROCKS_URL}
+ -DEXPECTED_SHA256=${LUAROCKS_SHA256}
+ -DTARGET=luarocks
+ -DUSE_EXISTING_SRC_DIR=${USE_EXISTING_SRC_DIR}
+ -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/DownloadAndExtractFile.cmake
+ BUILD_IN_SOURCE 1
+ CONFIGURE_COMMAND "${_luarocks_CONFIGURE_COMMAND}"
+ BUILD_COMMAND "${_luarocks_BUILD_COMMAND}"
+ INSTALL_COMMAND "${_luarocks_INSTALL_COMMAND}")
+endfunction()
+
+# The luarocks binary location
+set(LUAROCKS_BINARY ${HOSTDEPS_BIN_DIR}/luarocks)
+
+# Arguments for calls to 'luarocks build'
+if(NOT MSVC)
+ # In MSVC don't pass the compiler/linker to luarocks, the bundled
+ # version already knows, and passing them here breaks the build
+ set(LUAROCKS_BUILDARGS CC=${HOSTDEPS_C_COMPILER} LD=${HOSTDEPS_C_COMPILER})
+endif()
+
+# Lua version, used with rocks directories.
+# Defaults to 5.1 for bundled LuaJIT/Lua.
+set(LUA_VERSION "5.1")
+
+if(UNIX)
+
+ if(USE_BUNDLED_LUAJIT)
+ list(APPEND LUAROCKS_OPTS
+ --with-lua=${HOSTDEPS_INSTALL_DIR}
+ --with-lua-include=${HOSTDEPS_INSTALL_DIR}/include/luajit-2.1
+ --with-lua-interpreter=luajit)
+ elseif(USE_BUNDLED_LUA)
+ list(APPEND LUAROCKS_OPTS
+ --with-lua=${HOSTDEPS_INSTALL_DIR})
+ else()
+ find_package(LuaJit)
+ if(LUAJIT_FOUND)
+ list(APPEND LUAROCKS_OPTS
+ --with-lua-include=${LUAJIT_INCLUDE_DIRS}
+ --with-lua-interpreter=luajit)
+ endif()
+
+ # Get LUA_VERSION used with rocks output.
+ if(LUAJIT_FOUND)
+ set(LUA_EXE "luajit")
+ else()
+ set(LUA_EXE "lua")
+ endif()
+ execute_process(
+ COMMAND ${LUA_EXE} -e "print(string.sub(_VERSION, 5))"
+ OUTPUT_VARIABLE LUA_VERSION
+ ERROR_VARIABLE ERR
+ RESULT_VARIABLE RES)
+ if(NOT RES EQUAL 0)
+ message(FATAL_ERROR "Could not get LUA_VERSION with ${LUA_EXE}: ${ERR}")
+ endif()
+ endif()
+
+ BuildLuarocks(
+ CONFIGURE_COMMAND ${DEPS_BUILD_DIR}/src/luarocks/configure
+ --prefix=${HOSTDEPS_INSTALL_DIR} --force-config ${LUAROCKS_OPTS}
+ INSTALL_COMMAND ${MAKE_PRG} -j1 bootstrap)
+elseif(MSVC OR MINGW)
+
+ if(MINGW)
+ set(COMPILER_FLAG /MW)
+ elseif(MSVC)
+ set(COMPILER_FLAG /MSVC)
+ endif()
+
+ # Ignore USE_BUNDLED_LUAJIT - always ON for native Win32
+ BuildLuarocks(INSTALL_COMMAND install.bat /FORCECONFIG /NOREG /NOADMIN /Q /F
+ /LUA ${DEPS_INSTALL_DIR}
+ /LIB ${DEPS_LIB_DIR}
+ /BIN ${DEPS_BIN_DIR}
+ /INC ${DEPS_INSTALL_DIR}/include/luajit-2.1
+ /P ${DEPS_INSTALL_DIR}/luarocks /TREE ${DEPS_INSTALL_DIR}
+ /SCRIPTS ${DEPS_BIN_DIR}
+ /CMOD ${DEPS_BIN_DIR}
+ ${COMPILER_FLAG}
+ /LUAMOD ${DEPS_BIN_DIR}/lua)
+
+ set(LUAROCKS_BINARY ${DEPS_INSTALL_DIR}/luarocks/luarocks.bat)
+else()
+ message(FATAL_ERROR "Trying to build luarocks in an unsupported system ${CMAKE_SYSTEM_NAME}/${CMAKE_C_COMPILER_ID}")
+endif()
+
+list(APPEND THIRD_PARTY_DEPS luarocks)
+
+if(USE_BUNDLED_LUAJIT)
+ add_dependencies(luarocks luajit)
+elseif(USE_BUNDLED_LUA)
+ add_dependencies(luarocks lua)
+endif()
+set(ROCKS_DIR ${HOSTDEPS_LIB_DIR}/luarocks/rocks-${LUA_VERSION})
+
+# mpack
+add_custom_command(OUTPUT ${ROCKS_DIR}/mpack
+ COMMAND ${LUAROCKS_BINARY}
+ ARGS build mpack 1.0.8-0 ${LUAROCKS_BUILDARGS}
+ DEPENDS luarocks)
+add_custom_target(mpack DEPENDS ${ROCKS_DIR}/mpack)
+list(APPEND THIRD_PARTY_DEPS mpack)
+
+# lpeg
+add_custom_command(OUTPUT ${ROCKS_DIR}/lpeg
+ COMMAND ${LUAROCKS_BINARY}
+ ARGS build lpeg 1.0.2-1 ${LUAROCKS_BUILDARGS}
+ DEPENDS mpack)
+add_custom_target(lpeg DEPENDS ${ROCKS_DIR}/lpeg)
+list(APPEND THIRD_PARTY_DEPS lpeg)
+
+if((NOT USE_BUNDLED_LUAJIT) AND USE_BUNDLED_LUA)
+ # luabitop
+ add_custom_command(OUTPUT ${ROCKS_DIR}/luabitop
+ COMMAND ${LUAROCKS_BINARY}
+ ARGS build luabitop 1.0.2-3 ${LUAROCKS_BUILDARGS}
+ DEPENDS lpeg)
+ add_custom_target(luabitop DEPENDS ${ROCKS_DIR}/luabitop)
+ list(APPEND THIRD_PARTY_DEPS luabitop)
+endif()
+
+if(USE_BUNDLED_BUSTED)
+ if((NOT USE_BUNDLED_LUAJIT) AND USE_BUNDLED_LUA)
+ set(PENLIGHT_DEPENDS luabitop)
+ else()
+ set(PENLIGHT_DEPENDS lpeg)
+ endif()
+
+ # penlight
+ add_custom_command(OUTPUT ${ROCKS_DIR}/penlight
+ COMMAND ${LUAROCKS_BINARY}
+ ARGS build penlight 1.5.4-1 ${LUAROCKS_BUILDARGS}
+ DEPENDS ${PENLIGHT_DEPENDS})
+ add_custom_target(penlight DEPENDS ${ROCKS_DIR}/penlight)
+
+ # busted
+ if(WIN32)
+ set(BUSTED_EXE "${HOSTDEPS_BIN_DIR}/busted.bat")
+ set(LUACHECK_EXE "${HOSTDEPS_BIN_DIR}/luacheck.bat")
+ else()
+ set(BUSTED_EXE "${HOSTDEPS_BIN_DIR}/busted")
+ set(LUACHECK_EXE "${HOSTDEPS_BIN_DIR}/luacheck")
+ endif()
+ add_custom_command(OUTPUT ${BUSTED_EXE}
+ COMMAND ${LUAROCKS_BINARY}
+ ARGS build busted 2.0.0 ${LUAROCKS_BUILDARGS}
+ DEPENDS penlight)
+ add_custom_target(busted DEPENDS ${BUSTED_EXE})
+
+ # luacheck
+ add_custom_command(OUTPUT ${LUACHECK_EXE}
+ COMMAND ${LUAROCKS_BINARY}
+ ARGS build luacheck 0.23.0-1 ${LUAROCKS_BUILDARGS}
+ DEPENDS busted)
+ add_custom_target(luacheck DEPENDS ${LUACHECK_EXE})
+
+ # luv
+ set(LUV_DEPS luacheck)
+ if(USE_BUNDLED_LUV)
+ list(APPEND LUV_DEPS luv-static lua-compat-5.3)
+ set(LUV_ARGS "CFLAGS=-O0 -g3 -fPIC")
+ if(USE_BUNDLED_LIBUV)
+ list(APPEND LUV_ARGS LIBUV_DIR=${HOSTDEPS_INSTALL_DIR})
+ # workaround for bug introduced in
+ # https://github.com/luarocks/luarocks/commit/83126ba324846b754ffc5e0345341f01262b3f86
+ if(MSVC)
+ list(APPEND LUV_ARGS LIBUV_LIBDIR=${HOSTDEPS_INSTALL_DIR}/lib)
+ endif()
+ endif()
+ SET(LUV_PRIVATE_ARGS LUA_COMPAT53_INCDIR=${DEPS_BUILD_DIR}/src/lua-compat-5.3/c-api)
+ add_custom_command(OUTPUT ${ROCKS_DIR}/luv
+ COMMAND ${LUAROCKS_BINARY}
+ ARGS make ${LUAROCKS_BUILDARGS} ${LUV_ARGS} ${LUV_PRIVATE_ARGS}
+ WORKING_DIRECTORY ${DEPS_BUILD_DIR}/src/luv
+ DEPENDS ${LUV_DEPS})
+ else()
+ add_custom_command(OUTPUT ${ROCKS_DIR}/luv
+ COMMAND ${LUAROCKS_BINARY}
+ ARGS build luv ${LUV_VERSION} ${LUAROCKS_BUILDARGS}
+ DEPENDS ${LUV_DEPS})
+ endif()
+ add_custom_target(luv DEPENDS ${ROCKS_DIR}/luv)
+
+ # nvim-client: https://github.com/neovim/lua-client
+ add_custom_command(OUTPUT ${ROCKS_DIR}/nvim-client
+ COMMAND ${LUAROCKS_BINARY}
+ ARGS build nvim-client 0.2.4-1 ${LUAROCKS_BUILDARGS}
+ DEPENDS luv)
+ add_custom_target(nvim-client DEPENDS ${ROCKS_DIR}/nvim-client)
+
+ list(APPEND THIRD_PARTY_DEPS busted luacheck nvim-client)
+endif()
diff --git a/cmake.deps/cmake/BuildLuv.cmake b/cmake.deps/cmake/BuildLuv.cmake
new file mode 100644
index 0000000000..6e9a333dc8
--- /dev/null
+++ b/cmake.deps/cmake/BuildLuv.cmake
@@ -0,0 +1,133 @@
+# BuildLuv(PATCH_COMMAND ... CONFIGURE_COMMAND ... BUILD_COMMAND ... INSTALL_COMMAND ...)
+# Reusable function to build luv, wraps ExternalProject_Add.
+# Failing to pass a command argument will result in no command being run
+function(BuildLuv)
+ cmake_parse_arguments(_luv
+ ""
+ ""
+ "PATCH_COMMAND;CONFIGURE_COMMAND;BUILD_COMMAND;INSTALL_COMMAND"
+ ${ARGN})
+
+ if(NOT _luv_CONFIGURE_COMMAND AND NOT _luv_BUILD_COMMAND
+ AND NOT _luv_INSTALL_COMMAND)
+ message(FATAL_ERROR "Must pass at least one of CONFIGURE_COMMAND, BUILD_COMMAND, INSTALL_COMMAND")
+ endif()
+
+ ExternalProject_Add(lua-compat-5.3
+ PREFIX ${DEPS_BUILD_DIR}
+ URL ${LUA_COMPAT53_URL}
+ DOWNLOAD_DIR ${DEPS_DOWNLOAD_DIR}/lua-compat-5.3
+ DOWNLOAD_COMMAND ${CMAKE_COMMAND}
+ -DPREFIX=${DEPS_BUILD_DIR}
+ -DDOWNLOAD_DIR=${DEPS_DOWNLOAD_DIR}/lua-compat-5.3
+ -DURL=${LUA_COMPAT53_URL}
+ -DEXPECTED_SHA256=${LUA_COMPAT53_SHA256}
+ -DTARGET=lua-compat-5.3
+ -DUSE_EXISTING_SRC_DIR=${USE_EXISTING_SRC_DIR}
+ -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/DownloadAndExtractFile.cmake
+ PATCH_COMMAND ""
+ CONFIGURE_COMMAND ""
+ BUILD_COMMAND ""
+ INSTALL_COMMAND "")
+
+ ExternalProject_Add(luv-static
+ PREFIX ${DEPS_BUILD_DIR}
+ DEPENDS lua-compat-5.3
+ URL ${LUV_URL}
+ DOWNLOAD_DIR ${DEPS_DOWNLOAD_DIR}/luv
+ DOWNLOAD_COMMAND ${CMAKE_COMMAND}
+ -DPREFIX=${DEPS_BUILD_DIR}
+ -DDOWNLOAD_DIR=${DEPS_DOWNLOAD_DIR}/luv
+ -DURL=${LUV_URL}
+ -DEXPECTED_SHA256=${LUV_SHA256}
+ -DTARGET=luv-static
+ # The source is shared with BuildLuarocks (with USE_BUNDLED_LUV).
+ -DSRC_DIR=${DEPS_BUILD_DIR}/src/luv
+ -DUSE_EXISTING_SRC_DIR=${USE_EXISTING_SRC_DIR}
+ -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/DownloadAndExtractFile.cmake
+ PATCH_COMMAND "${_luv_PATCH_COMMAND}"
+ CONFIGURE_COMMAND "${_luv_CONFIGURE_COMMAND}"
+ BUILD_COMMAND "${_luv_BUILD_COMMAND}"
+ INSTALL_COMMAND "${_luv_INSTALL_COMMAND}"
+ LIST_SEPARATOR |)
+endfunction()
+
+set(LUV_SRC_DIR ${DEPS_BUILD_DIR}/src/luv)
+set(LUV_INCLUDE_FLAGS
+ "-I${DEPS_INSTALL_DIR}/include -I${DEPS_INSTALL_DIR}/include/luajit-2.1")
+
+# Replace luv default rockspec with the alternate one under the "rockspecs"
+# directory
+set(LUV_PATCH_COMMAND
+ ${CMAKE_COMMAND} -E copy_directory ${LUV_SRC_DIR}/rockspecs ${LUV_SRC_DIR})
+
+set(LUV_CONFIGURE_COMMAND_COMMON
+ ${CMAKE_COMMAND} ${LUV_SRC_DIR}
+ -DCMAKE_GENERATOR=${CMAKE_GENERATOR}
+ -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
+ -DCMAKE_INSTALL_PREFIX=${DEPS_INSTALL_DIR}
+ -DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES_ALT_SEP}
+ -DLUA_BUILD_TYPE=System
+ -DLUA_COMPAT53_DIR=${DEPS_BUILD_DIR}/src/lua-compat-5.3
+ -DWITH_SHARED_LIBUV=ON
+ -DBUILD_SHARED_LIBS=OFF
+ -DBUILD_STATIC_LIBS=ON
+ -DBUILD_MODULE=OFF)
+
+if(USE_BUNDLED_LUAJIT)
+ list(APPEND LUV_CONFIGURE_COMMAND_COMMON -DWITH_LUA_ENGINE=LuaJit)
+elseif(USE_BUNDLED_LUA)
+ list(APPEND LUV_CONFIGURE_COMMAND_COMMON -DWITH_LUA_ENGINE=Lua)
+else()
+ find_package(LuaJit)
+ if(LUAJIT_FOUND)
+ list(APPEND LUV_CONFIGURE_COMMAND_COMMON -DWITH_LUA_ENGINE=LuaJit)
+ else()
+ list(APPEND LUV_CONFIGURE_COMMAND_COMMON -DWITH_LUA_ENGINE=Lua)
+ endif()
+endif()
+
+if(USE_BUNDLED_LIBUV)
+ set(LUV_CONFIGURE_COMMAND_COMMON
+ ${LUV_CONFIGURE_COMMAND_COMMON}
+ -DCMAKE_PREFIX_PATH=${DEPS_INSTALL_DIR})
+endif()
+
+if(MSVC)
+ set(LUV_CONFIGURE_COMMAND
+ ${LUV_CONFIGURE_COMMAND_COMMON}
+ -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
+ -DCMAKE_GENERATOR_PLATFORM=${CMAKE_GENERATOR_PLATFORM}
+ # Same as Unix without fPIC
+ "-DCMAKE_C_FLAGS:STRING=${CMAKE_C_COMPILER_ARG1} ${LUV_INCLUDE_FLAGS}"
+ # Make sure we use the same generator, otherwise we may
+ # accidentally end up using different MSVC runtimes
+ -DCMAKE_GENERATOR=${CMAKE_GENERATOR})
+else()
+ set(LUV_CONFIGURE_COMMAND
+ ${LUV_CONFIGURE_COMMAND_COMMON}
+ -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
+ "-DCMAKE_C_FLAGS:STRING=${CMAKE_C_COMPILER_ARG1} ${LUV_INCLUDE_FLAGS} -fPIC")
+ if(CMAKE_GENERATOR MATCHES "Unix Makefiles" AND
+ (CMAKE_SYSTEM_NAME MATCHES ".*BSD" OR CMAKE_SYSTEM_NAME MATCHES "DragonFly"))
+ set(LUV_CONFIGURE_COMMAND ${LUV_CONFIGURE_COMMAND} -DCMAKE_MAKE_PROGRAM=gmake)
+ endif()
+endif()
+
+set(LUV_BUILD_COMMAND
+ ${CMAKE_COMMAND} --build . --config ${CMAKE_BUILD_TYPE})
+set(LUV_INSTALL_COMMAND
+ ${CMAKE_COMMAND} --build . --target install --config ${CMAKE_BUILD_TYPE})
+
+BuildLuv(PATCH_COMMAND ${LUV_PATCH_COMMAND}
+ CONFIGURE_COMMAND ${LUV_CONFIGURE_COMMAND}
+ BUILD_COMMAND ${LUV_BUILD_COMMAND}
+ INSTALL_COMMAND ${LUV_INSTALL_COMMAND})
+
+list(APPEND THIRD_PARTY_DEPS luv-static)
+if(USE_BUNDLED_LUAJIT)
+ add_dependencies(luv-static luajit)
+endif()
+if(USE_BUNDLED_LIBUV)
+ add_dependencies(luv-static libuv)
+endif()
diff --git a/cmake.deps/cmake/BuildMsgpack.cmake b/cmake.deps/cmake/BuildMsgpack.cmake
new file mode 100644
index 0000000000..10bf1c8e37
--- /dev/null
+++ b/cmake.deps/cmake/BuildMsgpack.cmake
@@ -0,0 +1,66 @@
+# BuildMsgpack(CONFIGURE_COMMAND ... BUILD_COMMAND ... INSTALL_COMMAND ...)
+# Reusable function to build msgpack, wraps ExternalProject_Add.
+# Failing to pass a command argument will result in no command being run
+function(BuildMsgpack)
+ cmake_parse_arguments(_msgpack
+ ""
+ ""
+ "CONFIGURE_COMMAND;BUILD_COMMAND;INSTALL_COMMAND"
+ ${ARGN})
+
+ if(NOT _msgpack_CONFIGURE_COMMAND AND NOT _msgpack_BUILD_COMMAND
+ AND NOT _msgpack_INSTALL_COMMAND)
+ message(FATAL_ERROR "Must pass at least one of CONFIGURE_COMMAND, BUILD_COMMAND, INSTALL_COMMAND")
+ endif()
+
+ ExternalProject_Add(msgpack
+ PREFIX ${DEPS_BUILD_DIR}
+ URL ${MSGPACK_URL}
+ DOWNLOAD_DIR ${DEPS_DOWNLOAD_DIR}/msgpack
+ DOWNLOAD_COMMAND ${CMAKE_COMMAND}
+ -DPREFIX=${DEPS_BUILD_DIR}
+ -DDOWNLOAD_DIR=${DEPS_DOWNLOAD_DIR}/msgpack
+ -DURL=${MSGPACK_URL}
+ -DEXPECTED_SHA256=${MSGPACK_SHA256}
+ -DTARGET=msgpack
+ -DUSE_EXISTING_SRC_DIR=${USE_EXISTING_SRC_DIR}
+ -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/DownloadAndExtractFile.cmake
+ CONFIGURE_COMMAND "${_msgpack_CONFIGURE_COMMAND}"
+ BUILD_COMMAND "${_msgpack_BUILD_COMMAND}"
+ INSTALL_COMMAND "${_msgpack_INSTALL_COMMAND}"
+ LIST_SEPARATOR |)
+endfunction()
+
+set(MSGPACK_CONFIGURE_COMMAND ${CMAKE_COMMAND} ${DEPS_BUILD_DIR}/src/msgpack
+ -DMSGPACK_BUILD_TESTS=OFF
+ -DMSGPACK_BUILD_EXAMPLES=OFF
+ -DCMAKE_INSTALL_PREFIX=${DEPS_INSTALL_DIR}
+ -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
+ -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
+ -DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES_ALT_SEP}
+ "-DCMAKE_C_FLAGS:STRING=${CMAKE_C_COMPILER_ARG1} -fPIC"
+ -DCMAKE_GENERATOR=${CMAKE_GENERATOR})
+
+set(MSGPACK_BUILD_COMMAND ${CMAKE_COMMAND} --build . --config ${CMAKE_BUILD_TYPE})
+set(MSGPACK_INSTALL_COMMAND ${CMAKE_COMMAND} --build . --target install --config ${CMAKE_BUILD_TYPE})
+
+if(MSVC)
+ # Same as Unix without fPIC
+ set(MSGPACK_CONFIGURE_COMMAND ${CMAKE_COMMAND} ${DEPS_BUILD_DIR}/src/msgpack
+ -DMSGPACK_BUILD_TESTS=OFF
+ -DMSGPACK_BUILD_EXAMPLES=OFF
+ -DCMAKE_INSTALL_PREFIX=${DEPS_INSTALL_DIR}
+ -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
+ -DCMAKE_GENERATOR_PLATFORM=${CMAKE_GENERATOR_PLATFORM}
+ "-DCMAKE_C_FLAGS:STRING=${CMAKE_C_COMPILER_ARG1}"
+ -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
+ # Make sure we use the same generator, otherwise we may
+ # accidentally end up using different MSVC runtimes
+ -DCMAKE_GENERATOR=${CMAKE_GENERATOR})
+endif()
+
+BuildMsgpack(CONFIGURE_COMMAND ${MSGPACK_CONFIGURE_COMMAND}
+ BUILD_COMMAND ${MSGPACK_BUILD_COMMAND}
+ INSTALL_COMMAND ${MSGPACK_INSTALL_COMMAND})
+
+list(APPEND THIRD_PARTY_DEPS msgpack)
diff --git a/cmake.deps/cmake/BuildTreesitter.cmake b/cmake.deps/cmake/BuildTreesitter.cmake
new file mode 100644
index 0000000000..01fdb837e2
--- /dev/null
+++ b/cmake.deps/cmake/BuildTreesitter.cmake
@@ -0,0 +1,59 @@
+# BuildTreeSitter(TARGET targetname CONFIGURE_COMMAND ... BUILD_COMMAND ... INSTALL_COMMAND ...)
+function(BuildTreeSitter)
+ cmake_parse_arguments(_treesitter
+ "BUILD_IN_SOURCE"
+ "TARGET"
+ "CONFIGURE_COMMAND;BUILD_COMMAND;INSTALL_COMMAND"
+ ${ARGN})
+
+ if(NOT _treesitter_CONFIGURE_COMMAND AND NOT _treesitter_BUILD_COMMAND
+ AND NOT _treesitter_INSTALL_COMMAND)
+ message(FATAL_ERROR "Must pass at least one of CONFIGURE_COMMAND, BUILD_COMMAND, INSTALL_COMMAND")
+ endif()
+ if(NOT _treesitter_TARGET)
+ set(_treesitter_TARGET "tree-sitter")
+ endif()
+
+ ExternalProject_Add(tree-sitter
+ PREFIX ${DEPS_BUILD_DIR}
+ URL ${TREESITTER_URL}
+ DOWNLOAD_DIR ${DEPS_DOWNLOAD_DIR}/tree-sitter
+ INSTALL_DIR ${DEPS_INSTALL_DIR}
+ DOWNLOAD_COMMAND ${CMAKE_COMMAND}
+ -DPREFIX=${DEPS_BUILD_DIR}
+ -DDOWNLOAD_DIR=${DEPS_DOWNLOAD_DIR}/tree-sitter
+ -DURL=${TREESITTER_URL}
+ -DEXPECTED_SHA256=${TREESITTER_SHA256}
+ -DTARGET=tree-sitter
+ -DUSE_EXISTING_SRC_DIR=${USE_EXISTING_SRC_DIR}
+ -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/DownloadAndExtractFile.cmake
+ BUILD_IN_SOURCE ${_treesitter_BUILD_IN_SOURCE}
+ PATCH_COMMAND ""
+ CONFIGURE_COMMAND "${_treesitter_CONFIGURE_COMMAND}"
+ BUILD_COMMAND "${_treesitter_BUILD_COMMAND}"
+ INSTALL_COMMAND "${_treesitter_INSTALL_COMMAND}")
+endfunction()
+
+if(MSVC)
+ BuildTreeSitter(BUILD_IN_SOURCE
+ CONFIGURE_COMMAND ${CMAKE_COMMAND} -E copy
+ ${CMAKE_CURRENT_SOURCE_DIR}/cmake/TreesitterCMakeLists.txt
+ ${DEPS_BUILD_DIR}/src/tree-sitter/CMakeLists.txt
+ COMMAND ${CMAKE_COMMAND} ${DEPS_BUILD_DIR}/src/tree-sitter/CMakeLists.txt
+ -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
+ -DCMAKE_GENERATOR=${CMAKE_GENERATOR}
+ -DCMAKE_GENERATOR_PLATFORM=${CMAKE_GENERATOR_PLATFORM}
+ -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
+ -DCMAKE_INSTALL_PREFIX=${DEPS_INSTALL_DIR}
+ BUILD_COMMAND ${CMAKE_COMMAND} --build . --config ${CMAKE_BUILD_TYPE}
+ INSTALL_COMMAND ${CMAKE_COMMAND} --build . --target install --config ${CMAKE_BUILD_TYPE}
+ )
+else()
+ set(TS_CFLAGS "-O3 -Wall -Wextra")
+ BuildTreeSitter(BUILD_IN_SOURCE
+ CONFIGURE_COMMAND ""
+ BUILD_COMMAND ${MAKE_PRG} CC=${DEPS_C_COMPILER} CFLAGS=${TS_CFLAGS}
+ INSTALL_COMMAND ${MAKE_PRG} CC=${DEPS_C_COMPILER} PREFIX=${DEPS_INSTALL_DIR} install)
+endif()
+
+list(APPEND THIRD_PARTY_DEPS tree-sitter)
diff --git a/cmake.deps/cmake/BuildTreesitterParsers.cmake b/cmake.deps/cmake/BuildTreesitterParsers.cmake
new file mode 100644
index 0000000000..11ffb792de
--- /dev/null
+++ b/cmake.deps/cmake/BuildTreesitterParsers.cmake
@@ -0,0 +1,29 @@
+ExternalProject_Add(treesitter-c
+PREFIX ${DEPS_BUILD_DIR}
+URL ${TREESITTER_C_URL}
+DOWNLOAD_DIR ${DEPS_DOWNLOAD_DIR}/treesitter-c
+DOWNLOAD_COMMAND ${CMAKE_COMMAND}
+ -DPREFIX=${DEPS_BUILD_DIR}
+ -DDOWNLOAD_DIR=${DEPS_DOWNLOAD_DIR}/treesitter-c
+ -DURL=${TREESITTER_C_URL}
+ -DEXPECTED_SHA256=${TREESITTER_C_SHA256}
+ -DTARGET=treesitter-c
+ -DUSE_EXISTING_SRC_DIR=${USE_EXISTING_SRC_DIR}
+ -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/DownloadAndExtractFile.cmake
+PATCH_COMMAND ${CMAKE_COMMAND} -E copy
+ ${CMAKE_CURRENT_SOURCE_DIR}/cmake/TreesitterParserCMakeLists.txt
+ ${DEPS_BUILD_DIR}/src/treesitter-c/CMakeLists.txt
+CMAKE_ARGS
+ -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
+ -DCMAKE_GENERATOR=${CMAKE_GENERATOR}
+ -DCMAKE_GENERATOR_PLATFORM=${CMAKE_GENERATOR_PLATFORM}
+ -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
+ -DCMAKE_INSTALL_PREFIX=${DEPS_INSTALL_DIR}
+ -DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES_ALT_SEP}
+ # Pass toolchain
+ -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}
+ -DPARSERLANG=c
+
+BUILD_COMMAND ${CMAKE_COMMAND} --build . --config ${CMAKE_BUILD_TYPE}
+INSTALL_COMMAND ${CMAKE_COMMAND} --build . --target install --config ${CMAKE_BUILD_TYPE}
+LIST_SEPARATOR |)
diff --git a/cmake.deps/cmake/BuildUnibilium.cmake b/cmake.deps/cmake/BuildUnibilium.cmake
new file mode 100644
index 0000000000..2f940bdfd3
--- /dev/null
+++ b/cmake.deps/cmake/BuildUnibilium.cmake
@@ -0,0 +1,48 @@
+if(WIN32)
+ ExternalProject_Add(unibilium
+ PREFIX ${DEPS_BUILD_DIR}
+ URL ${UNIBILIUM_URL}
+ DOWNLOAD_DIR ${DEPS_DOWNLOAD_DIR}/unibilium
+ DOWNLOAD_COMMAND ${CMAKE_COMMAND}
+ -DPREFIX=${DEPS_BUILD_DIR}
+ -DDOWNLOAD_DIR=${DEPS_DOWNLOAD_DIR}/unibilium
+ -DURL=${UNIBILIUM_URL}
+ -DEXPECTED_SHA256=${UNIBILIUM_SHA256}
+ -DTARGET=unibilium
+ -DUSE_EXISTING_SRC_DIR=${USE_EXISTING_SRC_DIR}
+ -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/DownloadAndExtractFile.cmake
+ CONFIGURE_COMMAND ${CMAKE_COMMAND} -E copy
+ ${CMAKE_CURRENT_SOURCE_DIR}/cmake/UnibiliumCMakeLists.txt
+ ${DEPS_BUILD_DIR}/src/unibilium/CMakeLists.txt
+ COMMAND ${CMAKE_COMMAND} ${DEPS_BUILD_DIR}/src/unibilium
+ -DCMAKE_INSTALL_PREFIX=${DEPS_INSTALL_DIR}
+ # Pass toolchain
+ -DCMAKE_TOOLCHAIN_FILE=${TOOLCHAIN}
+ -DCMAKE_GENERATOR_PLATFORM=${CMAKE_GENERATOR_PLATFORM}
+ -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
+ -DCMAKE_GENERATOR=${CMAKE_GENERATOR}
+ BUILD_COMMAND ${CMAKE_COMMAND} --build . --config ${CMAKE_BUILD_TYPE}
+ INSTALL_COMMAND ${CMAKE_COMMAND} --build . --target install --config ${CMAKE_BUILD_TYPE})
+else()
+ ExternalProject_Add(unibilium
+ PREFIX ${DEPS_BUILD_DIR}
+ URL ${UNIBILIUM_URL}
+ DOWNLOAD_DIR ${DEPS_DOWNLOAD_DIR}/unibilium
+ DOWNLOAD_COMMAND ${CMAKE_COMMAND}
+ -DPREFIX=${DEPS_BUILD_DIR}
+ -DDOWNLOAD_DIR=${DEPS_DOWNLOAD_DIR}/unibilium
+ -DURL=${UNIBILIUM_URL}
+ -DEXPECTED_SHA256=${UNIBILIUM_SHA256}
+ -DTARGET=unibilium
+ -DUSE_EXISTING_SRC_DIR=${USE_EXISTING_SRC_DIR}
+ -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/DownloadAndExtractFile.cmake
+ CONFIGURE_COMMAND ""
+ BUILD_IN_SOURCE 1
+ BUILD_COMMAND ${MAKE_PRG} CC=${DEPS_C_COMPILER}
+ PREFIX=${DEPS_INSTALL_DIR}
+ CFLAGS=-fPIC
+ LDFLAGS+=-static
+ INSTALL_COMMAND ${MAKE_PRG} PREFIX=${DEPS_INSTALL_DIR} install)
+endif()
+
+list(APPEND THIRD_PARTY_DEPS unibilium)
diff --git a/cmake.deps/cmake/CopyFilesGlob.cmake b/cmake.deps/cmake/CopyFilesGlob.cmake
new file mode 100644
index 0000000000..8950ead1e5
--- /dev/null
+++ b/cmake.deps/cmake/CopyFilesGlob.cmake
@@ -0,0 +1,20 @@
+# Copy multiple files to destination, based on a glob expression
+# - FROM_GLOB
+# - TO
+
+if(NOT FROM_GLOB)
+ message(FATAL_ERROR "FROM_GLOB must be set")
+endif()
+if(NOT TO)
+ message(FATAL_ERROR "TO must be set")
+endif()
+
+execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory ${TO})
+
+file(GLOB files ${FROM_GLOB})
+foreach(file ${files})
+ execute_process(COMMAND ${CMAKE_COMMAND} -E copy ${file} ${TO} RESULT_VARIABLE rv)
+ if(NOT rv EQUAL 0)
+ message(FATAL_ERROR "Error copying ${file}")
+ endif()
+endforeach()
diff --git a/cmake.deps/cmake/DownloadAndExtractFile.cmake b/cmake.deps/cmake/DownloadAndExtractFile.cmake
new file mode 100644
index 0000000000..abb1ddc81a
--- /dev/null
+++ b/cmake.deps/cmake/DownloadAndExtractFile.cmake
@@ -0,0 +1,195 @@
+if(NOT DEFINED PREFIX)
+ message(FATAL_ERROR "PREFIX must be defined.")
+endif()
+
+if(NOT DEFINED URL)
+ message(FATAL_ERROR "URL must be defined.")
+endif()
+
+if(NOT DEFINED DOWNLOAD_DIR)
+ message(FATAL_ERROR "DOWNLOAD_DIR must be defined.")
+endif()
+
+if(NOT DEFINED EXPECTED_SHA256)
+ message(FATAL_ERROR "EXPECTED_SHA256 must be defined.")
+endif()
+
+if(NOT DEFINED TARGET)
+ message(FATAL_ERROR "TARGET must be defined.")
+endif()
+
+if(NOT DEFINED SRC_DIR)
+ set(SRC_DIR ${PREFIX}/src/${TARGET})
+endif()
+set(BINARY_DIR ${PREFIX}/src/${TARGET}-build)
+
+# Check whether the source has been downloaded. If true, skip it.
+# Useful for external downloads like homebrew.
+if(USE_EXISTING_SRC_DIR)
+ if(EXISTS "${SRC_DIR}" AND IS_DIRECTORY "${SRC_DIR}")
+ file(GLOB EXISTED_FILES "${SRC_DIR}/*")
+ if(EXISTED_FILES)
+ message(STATUS "${SRC_DIR} is found and not empty, skipping download and extraction. ")
+ return()
+ endif()
+ endif()
+ message(FATAL_ERROR "USE_EXISTING_SRC_DIR set to ON, but '${SRC_DIR}' does not exist or is empty.")
+endif()
+
+# Taken from ExternalProject_Add. Let's hope we can drop this one day when
+# ExternalProject_Add allows you to disable SHOW_PROGRESS on the file download.
+if(TIMEOUT)
+ set(timeout_args TIMEOUT ${timeout})
+ set(timeout_msg "${timeout} seconds")
+else()
+ set(timeout_args "")
+ set(timeout_msg "none")
+endif()
+
+string(REGEX MATCH "[^/\\?]*$" fname "${URL}")
+if(NOT "${fname}" MATCHES "(\\.|=)(bz2|tar|tgz|tar\\.gz|zip)$")
+ string(REGEX MATCH "([^/\\?]+(\\.|=)(bz2|tar|tgz|tar\\.gz|zip))/.*$" match_result "${URL}")
+ set(fname "${CMAKE_MATCH_1}")
+endif()
+if(NOT "${fname}" MATCHES "(\\.|=)(bz2|tar|tgz|tar\\.gz|zip)$")
+ message(FATAL_ERROR "Could not extract tarball filename from url:\n ${url}")
+endif()
+string(REPLACE ";" "-" fname "${fname}")
+
+set(file ${DOWNLOAD_DIR}/${fname})
+message(STATUS "file: ${file}")
+
+set(EXISTING_SHA256 "")
+if(EXISTS ${file})
+ file(SHA256 ${file} EXISTING_SHA256)
+endif()
+
+if(NOT EXISTING_SHA256 STREQUAL ${EXPECTED_SHA256})
+ message(STATUS "downloading...
+ src='${URL}'
+ dst='${file}'
+ timeout='${timeout_msg}'")
+
+ file(DOWNLOAD ${URL} ${file}
+ ${timeout_args}
+ ${hash_args}
+ STATUS status
+ LOG log)
+
+ list(GET status 0 status_code)
+ list(GET status 1 status_string)
+
+ if(NOT status_code EQUAL 0)
+ # Retry on certain errors, e.g. CURLE_COULDNT_RESOLVE_HOST, which is often
+ # seen with libtermkey (www.leonerd.org.uk).
+ if((status_code EQUAL 6) # "Couldn't resolve host name"
+ OR (status_code EQUAL 7)) # "Couldn't connect to server"
+ message(STATUS "warning: retrying '${URL}' (${status_string}, status ${status_code})")
+ execute_process(COMMAND ${CMAKE_COMMAND} -E sleep 10)
+ file(DOWNLOAD ${URL} ${file}
+ ${timeout_args}
+ ${hash_args}
+ STATUS status
+ LOG log)
+ list(GET status 0 status_code)
+ list(GET status 1 status_string)
+ endif()
+ if(NOT status_code EQUAL 0)
+ message(FATAL_ERROR "error: downloading '${URL}' failed
+ status_code: ${status_code}
+ status_string: ${status_string}
+ log: ${log}
+ ")
+ endif()
+ endif()
+endif()
+
+set(NULL_SHA256 "0000000000000000000000000000000000000000000000000000000000000000")
+
+# Allow users to use "SKIP" or "skip" as the sha256 to skip checking the hash.
+# You can still use the all zeros hash too.
+if((EXPECTED_SHA256 STREQUAL "SKIP") OR (EXPECTED_SHA256 STREQUAL "skip"))
+ set(EXPECTED_SHA256 ${NULL_SHA256})
+endif()
+
+# We could avoid computing the SHA256 entirely if a NULL_SHA256 was given,
+# but we want to warn users of an empty file.
+file(SHA256 ${file} ACTUAL_SHA256)
+if(ACTUAL_SHA256 STREQUAL "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855")
+ # File was empty. It's likely due to lack of SSL support.
+ message(FATAL_ERROR
+ "Failed to download ${URL}. The file is empty and likely means CMake "
+ "was built without SSL support. Please use a version of CMake with "
+ "proper SSL support. See "
+ "https://github.com/neovim/neovim/wiki/Building-Neovim#build-prerequisites "
+ "for more information.")
+elseif((NOT EXPECTED_SHA256 STREQUAL NULL_SHA256) AND
+ (NOT EXPECTED_SHA256 STREQUAL ACTUAL_SHA256))
+ # Wasn't a NULL SHA256 and we didn't match, so we fail.
+ message(FATAL_ERROR
+ "Failed to download ${URL}. Expected a SHA256 of "
+ "${EXPECTED_SHA256} but got ${ACTUAL_SHA256} instead.")
+endif()
+
+message(STATUS "downloading... done")
+
+# Slurped from a generated extract-TARGET.cmake file.
+message(STATUS "extracting...
+ src='${file}'
+ dst='${SRC_DIR}'")
+
+if(NOT EXISTS "${file}")
+ message(FATAL_ERROR "error: file to extract does not exist: '${file}'")
+endif()
+
+# Prepare a space for extracting:
+#
+set(i 1234)
+while(EXISTS "${SRC_DIR}/../ex-${TARGET}${i}")
+ math(EXPR i "${i} + 1")
+endwhile()
+set(ut_dir "${SRC_DIR}/../ex-${TARGET}${i}")
+file(MAKE_DIRECTORY "${ut_dir}")
+
+# Extract it:
+#
+message(STATUS "extracting... [tar xfz]")
+execute_process(COMMAND ${CMAKE_COMMAND} -E tar xfz ${file}
+ WORKING_DIRECTORY ${ut_dir}
+ RESULT_VARIABLE rv)
+
+if(NOT rv EQUAL 0)
+ message(STATUS "extracting... [error clean up]")
+ file(REMOVE_RECURSE "${ut_dir}")
+ message(FATAL_ERROR "error: extract of '${file}' failed")
+endif()
+
+# Analyze what came out of the tar file:
+#
+message(STATUS "extracting... [analysis]")
+file(GLOB contents "${ut_dir}/*")
+list(LENGTH contents n)
+if(NOT n EQUAL 1 OR NOT IS_DIRECTORY "${contents}")
+ set(contents "${ut_dir}")
+endif()
+
+# Move "the one" directory to the final directory:
+#
+message(STATUS "extracting... [rename]")
+file(REMOVE_RECURSE ${SRC_DIR})
+get_filename_component(contents ${contents} ABSOLUTE)
+file(RENAME ${contents} ${SRC_DIR})
+
+# Remove any existing BINARY_DIR, to force a new build.
+# Without this a necessary output (e.g. libluv.a) might not be updated/installed.
+#
+message(STATUS "extracting... [clean binary dir]")
+file(REMOVE_RECURSE ${BINARY_DIR})
+file(MAKE_DIRECTORY ${BINARY_DIR})
+
+# Clean up:
+#
+message(STATUS "extracting... [clean up]")
+file(REMOVE_RECURSE "${ut_dir}")
+
+message(STATUS "extracting... done")
diff --git a/cmake.deps/cmake/GetBinaryDeps.cmake b/cmake.deps/cmake/GetBinaryDeps.cmake
new file mode 100644
index 0000000000..04e3f95a29
--- /dev/null
+++ b/cmake.deps/cmake/GetBinaryDeps.cmake
@@ -0,0 +1,43 @@
+# This is similar to the build recipes, but instead downloads a third party
+# binary and installs it under the DEPS_PREFIX.
+# The INSTALL_COMMAND is executed in the folder where downloaded files are
+# extracted and the ${DEPS_INSTALL_DIR} holds the path to the third-party
+# install root.
+function(GetBinaryDep)
+ cmake_parse_arguments(_gettool
+ "BUILD_IN_SOURCE"
+ "TARGET"
+ "INSTALL_COMMAND"
+ ${ARGN})
+
+ if(NOT _gettool_TARGET OR NOT _gettool_INSTALL_COMMAND)
+ message(FATAL_ERROR "Must pass INSTALL_COMMAND and TARGET")
+ endif()
+
+ string(TOUPPER "${_gettool_TARGET}_URL" URL_VARNAME)
+ string(TOUPPER "${_gettool_TARGET}_SHA256" HASH_VARNAME)
+ set(URL ${${URL_VARNAME}})
+ set(HASH ${${HASH_VARNAME}})
+ if(NOT URL OR NOT HASH )
+ message(FATAL_ERROR "${URL_VARNAME} and ${HASH_VARNAME} must be set")
+ endif()
+
+ ExternalProject_Add(${_gettool_TARGET}
+ PREFIX ${DEPS_BUILD_DIR}
+ URL ${URL}
+ DOWNLOAD_DIR ${DEPS_DOWNLOAD_DIR}
+ DOWNLOAD_COMMAND ${CMAKE_COMMAND}
+ -DPREFIX=${DEPS_BUILD_DIR}
+ -DDOWNLOAD_DIR=${DEPS_DOWNLOAD_DIR}
+ -DURL=${URL}
+ -DEXPECTED_SHA256=${HASH}
+ -DTARGET=${_gettool_TARGET}
+ -DUSE_EXISTING_SRC_DIR=${USE_EXISTING_SRC_DIR}
+ -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/DownloadAndExtractFile.cmake
+ CONFIGURE_COMMAND ""
+ BUILD_IN_SOURCE 1
+ BUILD_COMMAND ""
+ INSTALL_COMMAND ${CMAKE_COMMAND} -E make_directory ${DEPS_INSTALL_DIR}/bin
+ COMMAND "${_gettool_INSTALL_COMMAND}")
+ list(APPEND THIRD_PARTY_DEPS ${__gettool_TARGET})
+endfunction()
diff --git a/cmake.deps/cmake/GettextCMakeLists.txt b/cmake.deps/cmake/GettextCMakeLists.txt
new file mode 100644
index 0000000000..c3f78716d0
--- /dev/null
+++ b/cmake.deps/cmake/GettextCMakeLists.txt
@@ -0,0 +1,329 @@
+cmake_minimum_required(VERSION 2.8.12)
+project(gettext C)
+
+# Adds PREFIX to each item in LIST
+macro(PREFIX_LIST_ITEMS LIST PREFIX)
+ string(REPLACE ";" ";${PREFIX}" ${LIST} ";${${LIST}}")
+endmacro()
+
+file(READ gettext-runtime/config.h.in CONFIG_CONTENT)
+string(REPLACE "#undef HAVE_GETCWD" "#define HAVE_GETCWD 1" CONFIG_CONTENT ${CONFIG_CONTENT})
+string(REPLACE "#undef HAVE_LONG_LONG_INT" "#define HAVE_LONG_LONG_INT 1" CONFIG_CONTENT ${CONFIG_CONTENT})
+string(REPLACE "#undef HAVE_ICONV_H" "#define HAVE_ICONV_H 1" CONFIG_CONTENT ${CONFIG_CONTENT})
+string(REPLACE "#undef HAVE_ICONV" "#define HAVE_ICONV 1" CONFIG_CONTENT ${CONFIG_CONTENT})
+string(REPLACE "#undef ICONV_CONST" "#define ICONV_CONST const" CONFIG_CONTENT ${CONFIG_CONTENT})
+string(REPLACE "#undef uintmax_t" "
+ #if _WIN64
+ # define intmax_t long long
+ # define uintmax_t unsigned long long
+ #elif _WIN32
+ # define intmax_t long
+ # define uintmax_t unsigned long
+ #endif"
+ CONFIG_CONTENT ${CONFIG_CONTENT})
+file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/gettext-runtime/config.h ${CONFIG_CONTENT})
+
+set(HAVE_NEWLOCALE 0)
+set(HAVE_POSIX_PRINTF 0)
+set(HAVE_SNPRINTF 0)
+set(HAVE_ASPRINTF 0)
+set(HAVE_WPRINTF 0)
+set(HAVE_NAMELESS_LOCALES 0)
+set(HAVE_LONG_LONG_INT 1)
+configure_file(gettext-runtime/intl/libgnuintl.in.h
+ ${CMAKE_CURRENT_BINARY_DIR}/gettext-runtime/intl/libgnuintl.h)
+
+set(LOCALDIR "gettext")
+set(LIBDIR "gettext")
+set(PKGDATADIR "gettext")
+set(PACKAGE_SUFFIX "gettext")
+add_definitions(-DLOCALEDIR=\"${LOCALDIR}\"
+ -DLOCALE_ALIAS_PATH=\"${LOCALDIR}\"
+ -DLIBDIR=\"${LOCALDIR}\"
+ -DINSTALLDIR=\"${LOCALDIR}\"
+ -DEXEEXT=\".exe\"
+ -DLOCALEDIR=\"${LOCALDIR}\"
+ -DLIBDIR=\"${LIBDIR}\"
+ -DPACKAGE_SUFFIX=\"${PACKAGE_SUFFIX}\"
+ -DGETTEXTDATADIR=\"${PKGDATADIR}\"
+ -DBISON_LOCALEDIR=\"${LOCALDIR}\"
+ -DHAVE_CONFIG_H)
+
+set(libintl_SOURCES
+ bindtextdom.c dcgettext.c dcigettext.c dcngettext.c dgettext.c dngettext.c
+ explodename.c finddomain.c gettext.c hash-string.c intl-compat.c l10nflist.c
+ langprefs.c loadmsgcat.c localcharset.c localealias.c localename-table.c
+ localename.c lock.c log.c ngettext.c osdep.c
+ plural-exp.c plural.c printf.c relocatable.c setlocale.c textdomain.c
+ threadlib.c version.c xsize.c)
+
+PREFIX_LIST_ITEMS(libintl_SOURCES "gettext-runtime/intl/")
+
+add_library(libintl ${libintl_SOURCES})
+target_link_libraries(libintl ${LIBICONV_LIBRARIES})
+set_property(TARGET libintl APPEND PROPERTY INCLUDE_DIRECTORIES
+ ${CMAKE_CURRENT_BINARY_DIR}/gettext-runtime
+ ${CMAKE_CURRENT_BINARY_DIR}/gettext-runtime/intl
+ ${LIBICONV_INCLUDE_DIRS})
+set_property(TARGET libintl APPEND PROPERTY COMPILE_DEFINITIONS
+ BUILDING_LIBINTL
+ IN_LIBINTL
+ ENABLE_RELOCATABLE=1
+ IN_LIBRARY
+ NO_XMALLOC
+ set_relocation_prefix=libintl_set_relocation_prefix
+ relocate=libintl_relocate
+ HAVE_CONFIG_H
+ _CRT_SECURE_NO_WARNINGS)
+
+
+file(READ gettext-tools/config.h.in CONFIG_CONTENT)
+string(REPLACE "#undef FLEXIBLE_ARRAY_MEMBER" "#define FLEXIBLE_ARRAY_MEMBER 1" CONFIG_CONTENT ${CONFIG_CONTENT})
+string(REPLACE "__declspec (dllimport)" "" CONFIG_CONTENT ${CONFIG_CONTENT})
+string(REPLACE "#undef ENDIANNESS" "#define ENDIANNESS 0" CONFIG_CONTENT ${CONFIG_CONTENT})
+string(REPLACE "#undef GNULIB_FWRITEERROR" "#define GNULIB_FWRITEERROR 1" CONFIG_CONTENT ${CONFIG_CONTENT})
+string(REPLACE "#undef HAVE_DECL_STRERROR_R" "#define HAVE_DECL_STRERROR_R 0" CONFIG_CONTENT ${CONFIG_CONTENT})
+string(REPLACE "#undef HAVE_DUP2" "#define HAVE_DUP2 1" CONFIG_CONTENT ${CONFIG_CONTENT})
+string(REPLACE "#undef HAVE_ICONV_H" "#define HAVE_ICONV_H 1" CONFIG_CONTENT ${CONFIG_CONTENT})
+string(REPLACE "#undef HAVE_ICONV" "#define HAVE_ICONV 1" CONFIG_CONTENT ${CONFIG_CONTENT})
+string(REPLACE "#undef HAVE_LIBUNISTRING" "#define HAVE_LIBUNISTRING 1" CONFIG_CONTENT ${CONFIG_CONTENT})
+string(REPLACE "#undef HAVE_STDINT_H_WITH_UINTMAX" "#define HAVE_STDINT_H_WITH_UINTMAX 1" CONFIG_CONTENT ${CONFIG_CONTENT})
+string(REPLACE "#undef HAVE_STDINT_H" "#define HAVE_STDINT_H 1" CONFIG_CONTENT ${CONFIG_CONTENT})
+string(REPLACE "#undef HAVE_LONG_LONG_INT" "#define HAVE_LONG_LONG_INT 1" CONFIG_CONTENT ${CONFIG_CONTENT})
+string(REPLACE "#undef HAVE_STRING_H" "#define HAVE_STRING_H 1" CONFIG_CONTENT ${CONFIG_CONTENT})
+string(REPLACE "#undef HAVE_SYS_TIMEB_H" "#define HAVE_SYS_TIMEB_H 1" CONFIG_CONTENT ${CONFIG_CONTENT})
+string(REPLACE "#undef HAVE__FTIME" "#define HAVE__FTIME 1" CONFIG_CONTENT ${CONFIG_CONTENT})
+string(REPLACE "#undef HAVE_FLOAT_H" "#define HAVE_FLOAT_H 1" CONFIG_CONTENT ${CONFIG_CONTENT})
+string(REPLACE "#undef ICONV_CONST" "#define ICONV_CONST const" CONFIG_CONTENT ${CONFIG_CONTENT})
+string(REPLACE "#undef PACKAGE" "#define PACKAGE \"gettext\"\n#define gettext_VERSION" CONFIG_CONTENT ${CONFIG_CONTENT})
+string(REPLACE "#undef VERSION" "#define VERSION \"\"" CONFIG_CONTENT ${CONFIG_CONTENT})
+string(REPLACE "#undef mode_t" "#define mode_t int" CONFIG_CONTENT ${CONFIG_CONTENT})
+string(REPLACE "#undef pid_t" "#define pid_t int" CONFIG_CONTENT ${CONFIG_CONTENT})
+string(REPLACE "#undef restrict" "#define restrict __restrict" CONFIG_CONTENT ${CONFIG_CONTENT})
+string(REPLACE "#undef ssize_t" "#include <BaseTsd.h>\n#define ssize_t SSIZE_T" CONFIG_CONTENT ${CONFIG_CONTENT})
+string(REPLACE "#undef uid_t" "#define uid_t int" CONFIG_CONTENT ${CONFIG_CONTENT})
+string(REPLACE "#undef HAVE_DECL___ARGV" "#define HAVE_DECL___ARGV 1" CONFIG_CONTENT ${CONFIG_CONTENT})
+set(CONFIG_CONTENT "${CONFIG_CONTENT}\n#define isatty libtextstyle_isatty")
+file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/gettext-tools/config.h ${CONFIG_CONTENT})
+
+set(libgettextsrc_COMMON_SOURCE
+ message.c po-error.c po-xerror.c read-catalog-abstract.c po-lex.c
+ po-gram-gen.c po-charset.c read-po.c read-properties.c read-stringtable.c
+ open-catalog.c dir-list.c str-list.c)
+
+set(libgettextsrc_FORMAT_SOURCE
+ format.c format-invalid.h format-c.c format-c-parse.h format-sh.c
+ format-python.c format-python-brace.c format-lisp.c format-elisp.c
+ format-librep.c format-scheme.c format-java.c format-csharp.c format-awk.c
+ format-pascal.c format-ycp.c format-tcl.c format-perl.c format-perl-brace.c
+ format-php.c format-gcc-internal.c format-gfc-internal.c format-qt.c
+ format-qt-plural.c format-kde.c format-kde-kuit.c format-boost.c format-lua.c
+ format-javascript.c)
+
+set(libgettextsrc_SOURCES
+ ${libgettextsrc_COMMON_SOURCE} read-catalog.c
+ write-catalog.c write-properties.c write-stringtable.c write-po.c
+ msgl-ascii.c msgl-iconv.c msgl-equal.c msgl-cat.c msgl-header.c msgl-english.c
+ msgl-check.c file-list.c msgl-charset.c po-time.c plural-exp.c plural-eval.c
+ plural-table.c quote.h sentence.h sentence.c
+ ${libgettextsrc_FORMAT_SOURCE}
+ read-desktop.c locating-rule.c its.c search-path.c)
+PREFIX_LIST_ITEMS(libgettextsrc_SOURCES "gettext-tools/src/")
+
+set(GLIBC_SOURCE
+ uniname/uniname.c javaexec.c unsetenv.c classpath.c setenv.c xsetenv.c
+ sh-quote.c execute.c javaversion.c csharpcomp.c csharpexec.c javacomp.c
+ gettimeofday.c getdtablesize.c fcntl.c dup-safer-flag.c cloexec.c
+ fd-safer-flag.c fd-safer.c pipe2.c pipe2-safer.c spawn-pipe.c xmemdup0.c
+ secure_getenv.c tmpdir.c tempname.c mkdtemp.c fnmatch.c clean-temp.c
+ wait-process.c waitpid.c getdelim.c getline.c sigprocmask.c sigaction.c
+ addext.c argmatch.c backupfile.c basename.c c-strcasecmp.c c-strncasecmp.c
+ c-strstr.c closeout.c concat-filename.c error-progname.c error.c exitfail.c
+ fstrcmp.c full-write.c fwriteerror.c getopt.c getopt1.c hash.c libxml/buf.c
+ localcharset.c malloca.c mbchar.c mbslen.c mbsstr.c mbswidth.c obstack.c
+ progname.c printf-args.c printf-parse.c propername.c quotearg.c rawmemchr.c
+ safe-read.c safe-write.c stpcpy.c stpncpy.c strchrnul.c striconv.c
+ striconveh.c striconveha.c strnlen1.c trim.c gcd.c gl_linkedhash_list.c
+ uniconv/u8-conv-from-enc.c unictype/ctype_space.c unilbrk/lbrktables.c
+ unilbrk/u8-possible-linebreaks.c unilbrk/u8-width-linebreaks.c
+ unilbrk/ulc-common.c unilbrk/ulc-width-linebreaks.c unistr/u16-mbtouc-aux.c
+ unistr/u16-mbtouc.c unistr/u8-check.c unistr/u8-mblen.c
+ unistr/u8-mbtouc-aux.c unistr/u8-mbtouc-unsafe-aux.c
+ unistr/u8-mbtouc-unsafe.c unistr/u8-mbtouc.c unistr/u8-mbtoucr.c
+ unistr/u8-prev.c unistr/u8-uctomb-aux.c unistr/u8-uctomb.c uniwidth/width.c
+ vasnprintf.c vasprintf.c wcwidth.c xasprintf.c xconcat-filename.c xerror.c
+ xmalloc.c xstrdup.c xstriconv.c xstriconveh.c xvasprintf.c
+ libxml/DOCBparser.c libxml/HTMLparser.c libxml/HTMLtree.c libxml/SAX.c
+ libxml/SAX2.c libxml/c14n.c libxml/catalog.c libxml/chvalid.c
+ libxml/debugXML.c libxml/dict.c libxml/encoding.c libxml/entities.c
+ libxml/error.c libxml/globals.c libxml/hash.c libxml/legacy.c libxml/list.c
+ libxml/nanoftp.c libxml/nanohttp.c libxml/parser.c libxml/parserInternals.c
+ libxml/pattern.c libxml/relaxng.c libxml/schematron.c libxml/threads.c
+ libxml/tree.c libxml/trionan.c libxml/uri.c libxml/valid.c libxml/xinclude.c
+ libxml/xlink.c libxml/xmlIO.c libxml/xmlmemory.c libxml/xmlmodule.c
+ libxml/xmlreader.c libxml/xmlregexp.c libxml/xmlsave.c libxml/xmlschemas.c
+ libxml/xmlschemastypes.c libxml/xmlstring.c libxml/xmlunicode.c
+ libxml/xmlwriter.c libxml/xpath.c libxml/xpointer.c fatal-signal.c
+ copy-file.c read-file.c ftello.c utime.c gettime.c utimens.c)
+PREFIX_LIST_ITEMS(GLIBC_SOURCE "gettext-tools/gnulib-lib/")
+
+file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/gettext-tools/gnulib-lib/configmake.h "#define PKGDATADIR \"gettext\"")
+
+set(LIBGLIB_SOURCES
+ ghash.c glist.c gmessages.c gprimes.c gstrfuncs.c gstring.c)
+PREFIX_LIST_ITEMS(LIBGLIB_SOURCES "libtextstyle/lib/glib/")
+
+set(LIBTEXTSTYLE_SOURCE
+ gl_array_list.h gl_array_list.c binary-io.h
+ binary-io.c c-ctype.h c-ctype.c c-strcase.h c-strcasecmp.c
+ c-strncasecmp.c concat-filename.c dirname-lgpl.c
+ basename-lgpl.c stripslash.c exitfail.c fatal-signal.h
+ fatal-signal.c fd-hook.c fd-ostream.c file-ostream.c
+ full-write.h full-write.c getprogname.h getprogname.c
+ gettext.h hash.h hash.c html-ostream.c html-styled-ostream.c
+ iconv-ostream.c gl_list.h gl_list.c math.c memory-ostream.c
+ minmax.h noop-styled-ostream.c ostream.c safe-read.c
+ safe-write.c sig-handler.c size_max.h styled-ostream.c
+ term-ostream.c term-style-control.c term-styled-ostream.c
+ unistd.c xalloc.h xmalloc.c xstrdup.c
+ xconcat-filename.c gl_xlist.h gl_xlist.c xsize.h xsize.c
+ xvasprintf.h xvasprintf.c xasprintf.c color.h color.c misc.h
+ misc.c version.c isatty.c fsync.c tparm.c tputs.c)
+PREFIX_LIST_ITEMS(LIBTEXTSTYLE_SOURCE "libtextstyle/lib/")
+
+configure_file(
+ libtextstyle/lib/stdbool.mini.h
+ ${CMAKE_CURRENT_BINARY_DIR}/libtextstyle/lib/textstyle/stdbool.h
+ COPYONLY)
+
+set(LIBCROCO_SOURCES
+ cr-additional-sel.c cr-attr-sel.c cr-cascade.c cr-declaration.c
+ cr-doc-handler.c cr-enc-handler.c cr-fonts.c cr-input.c cr-num.c
+ cr-om-parser.c cr-parser.c cr-parsing-location.c cr-prop-list.c cr-pseudo.c
+ cr-rgb.c cr-sel-eng.c cr-selector.c cr-simple-sel.c cr-statement.c
+ cr-string.c cr-style.c cr-stylesheet.c cr-term.c cr-tknzr.c cr-token.c
+ cr-utils.c)
+PREFIX_LIST_ITEMS(LIBCROCO_SOURCES "libtextstyle/lib/libcroco/")
+
+set(libgettextsrc_SOURCES
+ ${libgettextsrc_SOURCES} ${GLIBC_SOURCE} ${LIBGLIB_SOURCES}
+ ${LIBTEXTSTYLE_SOURCE} ${LIBCROCO_SOURCES})
+
+macro(CONFIGURE_HEADER_FILES HEADER_TEMPLATES_PATH)
+ set(HEADER_TEMPLATES_ABS_PATH "${CMAKE_CURRENT_SOURCE_DIR}/${HEADER_TEMPLATES_PATH}")
+ file(GLOB_RECURSE HEADER_TEMPLATES "${HEADER_TEMPLATES_ABS_PATH}/*.in.h")
+ list(REMOVE_ITEM HEADER_TEMPLATES "${HEADER_TEMPLATES_ABS_PATH}/stdint.in.h")
+ list(REMOVE_ITEM HEADER_TEMPLATES "${HEADER_TEMPLATES_ABS_PATH}/wchar.in.h")
+ foreach(HEADER_TEMPLATE ${HEADER_TEMPLATES})
+ file(READ ${HEADER_TEMPLATE} HEADER_CONTENT)
+ string(REPLACE "/* The definition of _GL_ARG_NONNULL is copied here. */" "#include \"arg-nonnull.h\"" HEADER_CONTENT "${HEADER_CONTENT}")
+ string(REPLACE "/* The definition of _GL_WARN_ON_USE is copied here. */" "#include \"warn-on-use.h\"" HEADER_CONTENT "${HEADER_CONTENT}")
+ string(REPLACE "/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */" "#include \"c++defs.h\"" HEADER_CONTENT "${HEADER_CONTENT}")
+ string(REPLACE "@GNULIB_LSTAT@" "1" HEADER_CONTENT "${HEADER_CONTENT}")
+ string(REPLACE "@GNULIB_MBSINIT@" "1" HEADER_CONTENT "${HEADER_CONTENT}")
+ string(REPLACE "@GNULIB_SIGACTION@" "1" HEADER_CONTENT "${HEADER_CONTENT}")
+ string(REPLACE "@GNULIB_SIGPROCMASK@" "1" HEADER_CONTENT "${HEADER_CONTENT}")
+ string(REPLACE "@GNULIB_STPCPY@" "1" HEADER_CONTENT "${HEADER_CONTENT}")
+ string(REPLACE "@GNULIB_STPNCPY@" "1" HEADER_CONTENT "${HEADER_CONTENT}")
+ string(REPLACE "@GNULIB_STRCHRNUL@" "1" HEADER_CONTENT "${HEADER_CONTENT}")
+ string(REPLACE "@HAVE_ISWCNTRL@" "1" HEADER_CONTENT "${HEADER_CONTENT}")
+ string(REPLACE "@HAVE_WCTYPE_T@" "1" HEADER_CONTENT "${HEADER_CONTENT}")
+ string(REPLACE "@HAVE_STRUCT_TIMEVAL@" "1" HEADER_CONTENT "${HEADER_CONTENT}")
+ string(REPLACE "@HAVE_WINSOCK2_H@" "1" HEADER_CONTENT "${HEADER_CONTENT}")
+ string(REPLACE "@DLL_VARIABLE@" "" HEADER_CONTENT "${HEADER_CONTENT}")
+ string(REPLACE "@HAVE_NEWLOCALE@" "0" HEADER_CONTENT "${HEADER_CONTENT}")
+ string(REPLACE "@PRAGMA_COLUMNS@" "" HEADER_CONTENT "${HEADER_CONTENT}")
+ string(REPLACE "#if @GNULIB_UTIME@" "#if 1\n#define utime gl_utime" HEADER_CONTENT "${HEADER_CONTENT}")
+ string(REPLACE "@HAVE_UTIME@" "1" HEADER_CONTENT "${HEADER_CONTENT}")
+ string(REPLACE "@HAVE_LONG_LONG_INT@" "1" HEADER_CONTENT "${HEADER_CONTENT}")
+
+ string(REGEX REPLACE "^${HEADER_TEMPLATES_ABS_PATH}/" "" HEADER_PATH "${HEADER_TEMPLATE}")
+ string(REPLACE ".in" "" HEADER_PATH ${HEADER_PATH})
+ string(REPLACE "_" "/" HEADER_PATH ${HEADER_PATH})
+ # find_file will create a cache entry for the variable
+ # SYSTEM_HEADER, so reset it before each call
+ set(SYSTEM_HEADER "SYSTEM_HEADER-NOTFOUND")
+ find_file(SYSTEM_HEADER ${HEADER_PATH} PATHS "${LIBICONV_INCLUDE_DIRS}")
+ if(SYSTEM_HEADER)
+ # Gnulib uses #include_next to extend system header files,
+ # but MSVC doesn't support it, so a regular include directive
+ # with a relative path is used instead
+ string(REGEX REPLACE ".*/(.*/${HEADER_PATH})" "../\\1"
+ INCLUDE_PATH "${SYSTEM_HEADER}")
+ string(REGEX REPLACE "@INCLUDE_NEXT[^@]*@ @NEXT_[^@\n]+@"
+ "include <${INCLUDE_PATH}>" HEADER_CONTENT "${HEADER_CONTENT}")
+ endif()
+
+ # Default any remaining template variables to 0
+ string(REGEX REPLACE "@[^@\n]+@" "0" HEADER_CONTENT "${HEADER_CONTENT}")
+
+ file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/${HEADER_TEMPLATES_PATH}/${HEADER_PATH}" "${HEADER_CONTENT}")
+ endforeach()
+endmacro()
+
+CONFIGURE_HEADER_FILES("gettext-tools/gnulib-lib")
+CONFIGURE_HEADER_FILES("libtextstyle/lib")
+
+add_library(libgettextsrc ${libgettextsrc_SOURCES})
+target_link_libraries(libgettextsrc ${LIBICONV_LIBRARIES})
+set_property(TARGET libgettextsrc APPEND PROPERTY COMPILE_DEFINITIONS
+ LIBTEXTSTYLE_DLL_VARIABLE=)
+
+set(msgmerge_SOURCES
+ msgmerge.c msgl-fsearch.c lang-table.c plural-count.c)
+PREFIX_LIST_ITEMS(msgmerge_SOURCES "gettext-tools/src/")
+
+add_executable(msgmerge ${msgmerge_SOURCES})
+target_link_libraries(msgmerge libgettextsrc)
+add_dependencies(msgmerge libgettextsrc libintl)
+
+set(msgfmt_SOURCES
+ msgfmt.c write-mo.c write-java.c write-csharp.c write-resources.c write-tcl.c
+ write-qt.c write-desktop.c write-xml.c
+ ../../gettext-runtime/intl/hash-string.c)
+PREFIX_LIST_ITEMS(msgfmt_SOURCES "gettext-tools/src/")
+
+add_executable(msgfmt ${msgfmt_SOURCES})
+target_link_libraries(msgfmt libgettextsrc)
+add_dependencies(msgfmt libgettextsrc libintl)
+
+set(xgettext_SOURCES
+ xgettext.c xg-pos.c xg-encoding.c xg-mixed-string.c xg-arglist-context.c
+ xg-arglist-callshape.c xg-arglist-parser.c xg-message.c x-c.c x-po.c x-sh.c
+ x-python.c x-lisp.c x-elisp.c x-librep.c x-scheme.c x-smalltalk.c x-java.c
+ x-csharp.c x-awk.c x-ycp.c x-tcl.c x-perl.c x-php.c x-rst.c x-lua.c
+ x-javascript.c x-vala.c x-desktop.c)
+PREFIX_LIST_ITEMS(xgettext_SOURCES "gettext-tools/src/")
+
+add_executable(xgettext ${xgettext_SOURCES})
+target_link_libraries(xgettext libgettextsrc)
+add_dependencies(xgettext libgettextsrc libintl)
+
+set_property(TARGET msgmerge msgfmt xgettext libgettextsrc APPEND PROPERTY
+ INCLUDE_DIRECTORIES
+ ${CMAKE_CURRENT_SOURCE_DIR}/gettext-runtime/intl
+ ${CMAKE_CURRENT_SOURCE_DIR}/gettext-tools/libgettextpo
+ ${CMAKE_CURRENT_SOURCE_DIR}/gettext-tools/gnulib-lib
+ ${CMAKE_CURRENT_SOURCE_DIR}/gettext-tools/gnulib-lib/libcroco
+ ${CMAKE_CURRENT_SOURCE_DIR}/build-aux/snippet
+ ${CMAKE_CURRENT_SOURCE_DIR}/libtextstyle/lib
+ ${CMAKE_CURRENT_SOURCE_DIR}/libtextstyle/lib/libcroco
+ ${CMAKE_CURRENT_BINARY_DIR}/gettext-runtime/intl
+ ${CMAKE_CURRENT_BINARY_DIR}/gettext-tools
+ ${CMAKE_CURRENT_BINARY_DIR}/gettext-tools/gnulib-lib
+ ${CMAKE_CURRENT_BINARY_DIR}/libtextstyle/lib
+ ${CMAKE_CURRENT_BINARY_DIR}/libtextstyle/lib/textstyle
+ ${LIBICONV_INCLUDE_DIRS})
+
+include(GNUInstallDirs)
+
+install(FILES
+ ${CMAKE_CURRENT_BINARY_DIR}/gettext-runtime/intl/libgnuintl.h
+ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
+ RENAME libintl.h)
+
+install(TARGETS libintl msgmerge msgfmt xgettext
+ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
+ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
+ PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
+ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
diff --git a/cmake.deps/cmake/LibiconvCMakeLists.txt b/cmake.deps/cmake/LibiconvCMakeLists.txt
new file mode 100644
index 0000000000..8ad3cc9352
--- /dev/null
+++ b/cmake.deps/cmake/LibiconvCMakeLists.txt
@@ -0,0 +1,97 @@
+cmake_minimum_required(VERSION 2.8.12)
+project(libiconv C)
+
+include_directories(
+ ${CMAKE_CURRENT_SOURCE_DIR}
+ ${CMAKE_CURRENT_SOURCE_DIR}/srclib
+ ${CMAKE_CURRENT_BINARY_DIR}
+ ${CMAKE_CURRENT_BINARY_DIR}/srclib
+ ${CMAKE_CURRENT_SOURCE_DIR}/build-aux/snippet)
+
+configure_file(config.h.in config.h)
+file(READ "${CMAKE_CURRENT_BINARY_DIR}/config.h" CONFIG_CONTENT)
+string(REPLACE "#undef EILSEQ" "" CONFIG_CONTENT "${CONFIG_CONTENT}")
+string(REPLACE "#undef HAVE_MBRTOWC" "#define HAVE_MBRTOWC 1" CONFIG_CONTENT "${CONFIG_CONTENT}")
+string(REPLACE "#undef HAVE_MBSINIT" "#define HAVE_MBSINIT 1" CONFIG_CONTENT "${CONFIG_CONTENT}")
+string(REPLACE "#undef HAVE_WCRTOMB" "#define HAVE_WCRTOMB 1" CONFIG_CONTENT "${CONFIG_CONTENT}")
+string(REPLACE "#undef HAVE_DECL___ARGV" "#define HAVE_DECL___ARGV 1" CONFIG_CONTENT "${CONFIG_CONTENT}")
+string(REPLACE "#undef HAVE_WORKING_O_NOFOLLOW" "#define HAVE_WORKING_O_NOFOLLOW 0" CONFIG_CONTENT "${CONFIG_CONTENT}")
+string(REPLACE "#undef ICONV_CONST" "#define ICONV_CONST const" CONFIG_CONTENT "${CONFIG_CONTENT}")
+string(REPLACE "#undef WORDS_LITTLEENDIAN" "#define WORDS_LITTLEENDIAN 1" CONFIG_CONTENT "${CONFIG_CONTENT}")
+string(REPLACE "#undef HAVE_DECL_STRERROR_R" "#define HAVE_DECL_STRERROR_R 0" CONFIG_CONTENT "${CONFIG_CONTENT}")
+string(REPLACE "#undef mode_t" "#define mode_t int" CONFIG_CONTENT "${CONFIG_CONTENT}")
+string(REPLACE "#undef ssize_t" "#include <BaseTsd.h>\n#define ssize_t SSIZE_T" CONFIG_CONTENT "${CONFIG_CONTENT}")
+file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/config.h" "${CONFIG_CONTENT}")
+
+set(BROKEN_WCHAR_H 0)
+set(HAVE_VISIBILITY 0)
+set(HAVE_WCHAR_T 1)
+set(ICONV_CONST "const")
+set(USE_MBSTATE_T 0)
+configure_file(libcharset/include/localcharset.h.build.in localcharset.h)
+configure_file(include/iconv.h.build.in iconv.h)
+
+add_definitions(-DLIBDIR -D_CRT_SECURE_NO_WARNINGS)
+
+add_library(libcharset libcharset/lib/localcharset.c)
+
+add_library(libiconv lib/iconv.c)
+target_link_libraries(libiconv libcharset)
+
+add_executable(iconv src/iconv.c srclib/progname.c srclib/getprogname.c
+ srclib/safe-read.c srclib/uniwidth/width.c srclib/error.c srclib/xmalloc.c
+ srclib/basename-lgpl.c)
+target_link_libraries(iconv libiconv)
+
+set(HEADER_TEMPLATES_PATH "srclib")
+set(HEADER_TEMPLATES_ABS_PATH "${CMAKE_CURRENT_SOURCE_DIR}/${HEADER_TEMPLATES_PATH}")
+file(GLOB_RECURSE HEADER_TEMPLATES "${HEADER_TEMPLATES_ABS_PATH}/*.in.h")
+list(REMOVE_ITEM HEADER_TEMPLATES "${HEADER_TEMPLATES_ABS_PATH}/stdint.in.h")
+list(REMOVE_ITEM HEADER_TEMPLATES "${HEADER_TEMPLATES_ABS_PATH}/wchar.in.h")
+foreach(HEADER_TEMPLATE ${HEADER_TEMPLATES})
+ file(READ ${HEADER_TEMPLATE} HEADER_CONTENT)
+ string(REPLACE "/* The definition of _GL_ARG_NONNULL is copied here. */" "#include \"arg-nonnull.h\"" HEADER_CONTENT "${HEADER_CONTENT}")
+ string(REPLACE "/* The definition of _GL_WARN_ON_USE is copied here. */" "#include \"warn-on-use.h\"" HEADER_CONTENT "${HEADER_CONTENT}")
+ string(REPLACE "/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */" "#include \"c++defs.h\"" HEADER_CONTENT "${HEADER_CONTENT}")
+ string(REPLACE "@GNULIB_LSTAT@" "1" HEADER_CONTENT "${HEADER_CONTENT}")
+ string(REPLACE "@GNULIB_SIGACTION@" "1" HEADER_CONTENT "${HEADER_CONTENT}")
+ string(REPLACE "@GNULIB_SIGPROCMASK@" "1" HEADER_CONTENT "${HEADER_CONTENT}")
+ string(REPLACE "@HAVE_ISWCNTRL@" "1" HEADER_CONTENT "${HEADER_CONTENT}")
+ string(REPLACE "@HAVE_WCTYPE_T@" "1" HEADER_CONTENT "${HEADER_CONTENT}")
+ string(REPLACE "@PRAGMA_COLUMNS@" "" HEADER_CONTENT "${HEADER_CONTENT}")
+
+ string(REGEX REPLACE "^${HEADER_TEMPLATES_ABS_PATH}/" "" HEADER_PATH "${HEADER_TEMPLATE}")
+ string(REPLACE ".in" "" HEADER_PATH ${HEADER_PATH})
+ string(REPLACE "_" "/" HEADER_PATH ${HEADER_PATH})
+ # find_file will create a cache entry for the variable
+ # SYSTEM_HEADER, so reset it before each call
+ set(SYSTEM_HEADER "SYSTEM_HEADER-NOTFOUND")
+ find_file(SYSTEM_HEADER ${HEADER_PATH} PATHS "${LIBICONV_INCLUDE_DIRS}")
+ if(SYSTEM_HEADER)
+ # Gnulib uses #include_next to extend system header files,
+ # but MSVC doesn't support it, so a regular include directive
+ # with a relative path is used instead
+ string(REGEX REPLACE ".*/(.*/${HEADER_PATH})" "../\\1"
+ INCLUDE_PATH "${SYSTEM_HEADER}")
+ string(REGEX REPLACE "@INCLUDE_NEXT[^@]*@ @NEXT_[^@\n]+@"
+ "include <${INCLUDE_PATH}>" HEADER_CONTENT "${HEADER_CONTENT}")
+ endif()
+
+ # Default any remaining template variables to 0
+ string(REGEX REPLACE "@[^@\n]+@" "0" HEADER_CONTENT "${HEADER_CONTENT}")
+
+ file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/${HEADER_TEMPLATES_PATH}/${HEADER_PATH}" "${HEADER_CONTENT}")
+endforeach()
+
+include(GNUInstallDirs)
+
+install(FILES
+ ${CMAKE_CURRENT_BINARY_DIR}/iconv.h
+ ${CMAKE_CURRENT_BINARY_DIR}/localcharset.h
+ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
+
+install(TARGETS libcharset libiconv iconv
+ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
+ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
+ PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
+ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
diff --git a/cmake.deps/cmake/LibuvCMakeLists.txt b/cmake.deps/cmake/LibuvCMakeLists.txt
new file mode 100644
index 0000000000..0432319834
--- /dev/null
+++ b/cmake.deps/cmake/LibuvCMakeLists.txt
@@ -0,0 +1,33 @@
+cmake_minimum_required(VERSION 2.8.12)
+project(libuv LANGUAGES C)
+
+file(GLOB UV_SOURCES_COMMON src/*.c)
+file(GLOB UV_SOURCES_WIN src/win/*.c)
+
+add_library(uv ${UV_SOURCES_COMMON} ${UV_SOURCES_WIN})
+target_compile_definitions(uv PRIVATE WIN32_LEAN_AND_MEAN "_WIN32_WINNT=0x0600")
+target_link_libraries(uv iphlpapi psapi shell32 userenv ws2_32)
+target_include_directories(uv PUBLIC ./include PRIVATE ./src)
+if(BUILD_SHARED_LIBS)
+ set_target_properties(uv PROPERTIES DEFINE_SYMBOL BUILDING_UV_SHARED)
+endif()
+
+install(FILES
+ include/uv.h
+ DESTINATION include)
+
+install(FILES
+ include/uv/errno.h
+ include/uv/threadpool.h
+ include/uv/tree.h
+ include/uv/version.h
+ include/uv/win.h
+ DESTINATION include/uv)
+
+include(GNUInstallDirs)
+install(TARGETS uv
+ PUBLIC_HEADER
+ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
+ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
+ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
+ PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
diff --git a/cmake.deps/cmake/Libvterm-tbl2inc_c.cmake b/cmake.deps/cmake/Libvterm-tbl2inc_c.cmake
new file mode 100644
index 0000000000..7a82f4248b
--- /dev/null
+++ b/cmake.deps/cmake/Libvterm-tbl2inc_c.cmake
@@ -0,0 +1,163 @@
+cmake_minimum_required(VERSION 2.8.12)
+
+set(HEX_ALPHABET "0123456789abcdef")
+
+function(ConvertToHex dec hex)
+ while(dec GREATER 0)
+ math(EXPR _val "${dec} % 16")
+ math(EXPR dec "${dec} / 16")
+ string(SUBSTRING ${HEX_ALPHABET} ${_val} 1 _val)
+ set(_res "${_val}${_res}")
+ endwhile()
+ # Pad the result with the number of zeros
+ # specified by the optional third argument
+ if(${ARGC} EQUAL 3)
+ set(padding ${ARGV2})
+ string(LENGTH ${_res} _resLen)
+ if(_resLen LESS ${padding})
+ math(EXPR _neededPadding "${padding} - ${_resLen}")
+ foreach(i RANGE 1 ${_neededPadding})
+ set(_res "0${_res}")
+ endforeach()
+ endif()
+ endif()
+ set(${hex} "0x${_res}" PARENT_SCOPE)
+endfunction()
+
+function(ConvertFromHex hex dec)
+ string(TOLOWER ${hex} hex)
+ string(LENGTH "${hex}" _strlen)
+ set(_res 0)
+ while(_strlen GREATER 0)
+ math(EXPR _res "${_res} * 16")
+ string(SUBSTRING "${hex}" 0 1 NIBBLE)
+ string(SUBSTRING "${hex}" 1 -1 hex)
+ string(FIND ${HEX_ALPHABET} ${NIBBLE} value)
+ if(value EQUAL -1)
+ message(FATAL_ERROR "Invalid hex character '${NIBBLE}'")
+ endif()
+ math(EXPR _res "${_res} + ${value}")
+ string(LENGTH "${hex}" _strlen)
+ endwhile()
+ set(${dec} ${_res} PARENT_SCOPE)
+endfunction()
+
+# Based on http://www.json.org/JSON_checker/utf8_decode.c
+function(DecodeUtf8 hexBytes codePoint)
+ string(SUBSTRING ${hexBytes} 0 2 hexByte1)
+ ConvertFromHex(${hexByte1} byte1)
+ # Zero continuations (0 to 127)
+ math(EXPR out "${byte1} & 128")
+ if(out EQUAL 0)
+ set(${codePoint} ${byte1} PARENT_SCOPE)
+ return()
+ endif()
+ # One continuation (128 to 2047)
+ math(EXPR out "${byte1} & 224")
+ if(out EQUAL 192)
+ string(SUBSTRING ${hexBytes} 2 2 hexByte2)
+ ConvertFromHex(${hexByte2} byte2)
+ math(EXPR result "((${byte1} & 31) << 6) | ${byte2}")
+ if(result GREATER 127)
+ set(${codePoint} ${result} PARENT_SCOPE)
+ return()
+ endif()
+ else()
+ # Two continuations (2048 to 55295 and 57344 to 65535)
+ math(EXPR result "${byte1} & 240")
+ if(result EQUAL 224)
+ string(SUBSTRING ${hexBytes} 2 2 hexByte2)
+ string(SUBSTRING ${hexBytes} 4 2 hexByte3)
+ ConvertFromHex(${hexByte2} byte2)
+ ConvertFromHex(${hexByte3} byte3)
+ math(EXPR result "${byte2} | ${byte3}")
+ if(result GREATER -1)
+ math(EXPR result "((${byte1} & 15) << 12) | (${byte2} << 6) | ${byte3}")
+ if((result GREATER 2047) AND (result LESS 55296 OR result GREATER 57343))
+ set(${codePoint} ${result} PARENT_SCOPE)
+ return()
+ endif()
+ endif()
+ else()
+ # Three continuations (65536 to 1114111)
+ math(EXPR result "${byte1} & 248")
+ if(result EQUAL 224)
+ string(SUBSTRING ${hexBytes} 2 2 hexByte2)
+ string(SUBSTRING ${hexBytes} 4 2 hexByte3)
+ string(SUBSTRING ${hexBytes} 6 2 hexByte4)
+ ConvertFromHex(${hexByte2} byte2)
+ ConvertFromHex(${hexByte3} byte3)
+ ConvertFromHex(${hexByte4} byte4)
+ math(EXPR result "${byte2} | ${byte3} | ${byte4}")
+ if(result GREATER -1)
+ math(EXPR result "((c & 7) << 18) | (c1 << 12) | (c2 << 6) | c3")
+ if((result GREATER 65535) AND (result LESS 1114112))
+ set(${codePoint} ${result} PARENT_SCOPE)
+ return()
+ endif()
+ endif()
+ endif()
+ endif()
+ endif()
+ message(FATAL_ERROR "Invalid UTF-8 encoding")
+endfunction()
+
+set(inputFile ${CMAKE_ARGV3})
+set(outputFile ${CMAKE_ARGV4})
+# Get the file contents in text and hex-encoded format because
+# CMake doesn't provide functions for converting between the two
+file(READ "${inputFile}" contents)
+file(READ "${inputFile}" hexContents HEX)
+
+# Convert the text contents into a list of lines by escaping
+# the list separator ';' and then replacing new line characters
+# with the list separator
+string(REGEX REPLACE ";" "\\\\;" contents ${contents})
+string(REGEX REPLACE "\n" ";" contents ${contents})
+
+get_filename_component(encname ${inputFile} NAME_WE)
+set(output
+ "static const struct StaticTableEncoding encoding_${encname} = {\n"
+ " { .decode = &decode_table },\n"
+ " {")
+set(hexIndex 0)
+foreach(line ${contents})
+ string(LENGTH ${line} lineLength)
+ # Convert "A" to 0x41
+ string(FIND ${line} "\"" beginQuote)
+ if(NOT ${beginQuote} EQUAL -1)
+ string(FIND ${line} "\"" endQuote REVERSE)
+ if(${beginQuote} EQUAL ${endQuote})
+ message(FATAL_ERROR "Line contains only one quote")
+ endif()
+ math(EXPR beginHexQuote "${hexIndex} + (${beginQuote} + 1)*2")
+ math(EXPR endHexQuote "${hexIndex} + (${endQuote} + 1)*2")
+ math(EXPR quoteLen "${endHexQuote} - ${beginHexQuote} - 1")
+ string(SUBSTRING ${hexContents} ${beginHexQuote} ${quoteLen} hexQuote)
+ DecodeUtf8(${hexQuote} codePoint)
+ ConvertToHex(${codePoint} hexCodePoint 4)
+ STRING(REGEX REPLACE "\"(.+)\"" ${hexCodePoint} line ${line})
+ endif()
+ # Strip comment
+ string(REGEX REPLACE "[ \t\n]*#.*" "" line ${line})
+ # Convert 3/1 to [0x31]
+ string(REGEX REPLACE "^([0-9]+)/([0-9]+).*" "\\1;\\2" numbers ${line})
+ list(GET numbers 0 upperBits)
+ list(GET numbers 1 lowerBits)
+ math(EXPR res "${upperBits}*16 + ${lowerBits}")
+ ConvertToHex(${res} hex 2)
+ string(REGEX REPLACE "^([0-9]+)/([0-9]+)" "[${hex}]" line ${line})
+ # Convert U+0041 to 0x0041
+ string(REPLACE "U+" "0x" line ${line})
+ # Indent and append a comma
+ set(line " ${line},")
+ set(output "${output}\n${line}")
+ # Increment the index by the number of characters in the line,
+ # plus one for the new line character then multiple by two for the hex digit index
+ math(EXPR hexIndex "${hexIndex} + 2*(${lineLength} + 1)")
+endforeach()
+set(output "${output}\n"
+ " }\n"
+ "}\;\n")
+
+file(WRITE ${outputFile} ${output})
diff --git a/cmake.deps/cmake/LibvtermCMakeLists.txt b/cmake.deps/cmake/LibvtermCMakeLists.txt
new file mode 100644
index 0000000000..16c4d542c4
--- /dev/null
+++ b/cmake.deps/cmake/LibvtermCMakeLists.txt
@@ -0,0 +1,92 @@
+cmake_minimum_required(VERSION 2.8.12)
+project(libvterm LANGUAGES C)
+
+include(GNUInstallDirs)
+find_package(Perl)
+
+if(MSVC)
+ add_compile_options(/W3)
+ add_definitions(-D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_DEPRECATE)
+else()
+ add_compile_options(-Wall -std=c99)
+endif()
+
+# Generate includes from tables
+file(GLOB TBL_FILES ${CMAKE_SOURCE_DIR}/src/encoding/*.tbl)
+set(TBL_FILES_HEADERS)
+foreach(file ${TBL_FILES})
+ get_filename_component(basename ${file} NAME_WE)
+ set(tname encoding/${basename}.inc)
+ add_custom_command(OUTPUT
+ COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/encoding/
+ COMMAND ${CMAKE_COMMAND} -P ${CMAKE_SOURCE_DIR}/tbl2inc_c.cmake ${file} ${CMAKE_BINARY_DIR}/${tname}
+ COMMENT "Generating ${tname}"
+ OUTPUT ${CMAKE_BINARY_DIR}/${tname}
+ )
+ list(APPEND TBL_FILES_HEADERS ${tname})
+ # Only used for verifying that the output of tbl2inc_c.cmake is correct
+ set(tname encoding-test/${basename}.inc)
+ add_custom_command(OUTPUT
+ COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/encoding-test/
+ COMMAND ${PERL_EXECUTABLE} -CSD ${CMAKE_SOURCE_DIR}/tbl2inc_c.pl ${file} > ${CMAKE_BINARY_DIR}/${tname}
+ COMMENT "Generating ${tname}"
+ OUTPUT ${CMAKE_BINARY_DIR}/${tname}
+ )
+endforeach()
+
+include_directories(${CMAKE_SOURCE_DIR}/include)
+include_directories(${CMAKE_BINARY_DIR})
+
+file(GLOB VTERM_SOURCES ${CMAKE_SOURCE_DIR}/src/*.c)
+add_library(vterm ${VTERM_SOURCES} ${TBL_FILES_HEADERS})
+install(TARGETS vterm ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
+
+add_library(vterm-shared SHARED ${VTERM_SOURCES} ${TBL_FILES_HEADERS})
+set_target_properties(vterm-shared PROPERTIES
+ OUTPUT_NAME vterm
+ SOVERSION 0)
+install(TARGETS vterm-shared
+ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
+ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
+
+install(FILES include/vterm.h include/vterm_keycodes.h
+ DESTINATION include)
+
+if(NOT WIN32)
+ file(GLOB BIN_SOURCES ${CMAKE_SOURCE_DIR}/bin/*.c)
+ foreach(EXE_C ${BIN_SOURCES})
+ get_filename_component(target_name ${EXE_C} NAME_WE)
+ add_executable(${target_name} ${EXE_C})
+ target_link_libraries(${target_name} vterm)
+ install(TARGETS ${target_name} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
+ endforeach()
+endif()
+
+# Tests
+add_executable(harness EXCLUDE_FROM_ALL t/harness.c)
+target_link_libraries(harness vterm)
+set_target_properties(harness PROPERTIES
+ # run-test.pl expects to find the harness in t/.libs/
+ RUNTIME_OUTPUT_DIRECTORY t/.libs)
+
+if(Perl_FOUND)
+ file(GLOB TESTFILES ${CMAKE_SOURCE_DIR}/t/*.test)
+ add_custom_target(check)
+ foreach(testfile ${TESTFILES})
+ get_filename_component(target_name ${testfile} NAME_WE)
+ add_custom_target(${target_name}
+ COMMAND ${PERL_EXECUTABLE} ${CMAKE_SOURCE_DIR}/t/run-test.pl ${testfile}
+ COMMENT "**${target_name} **"
+ DEPENDS harness)
+ add_dependencies(check ${target_name})
+ endforeach()
+
+ foreach(header_path ${TBL_FILES_HEADERS})
+ get_filename_component(header_name ${header_path} NAME)
+ set(perl_header_path ${CMAKE_BINARY_DIR}/encoding-test/${header_name})
+ add_custom_target(test-${header_name}
+ COMMAND ${CMAKE_COMMAND} -E compare_files
+ ${header_path} ${perl_header_path}
+ DEPENDS ${header_path} ${perl_header_path})
+ endforeach()
+endif()
diff --git a/cmake.deps/cmake/RemoveFiles.cmake b/cmake.deps/cmake/RemoveFiles.cmake
new file mode 100644
index 0000000000..88e2bc70a6
--- /dev/null
+++ b/cmake.deps/cmake/RemoveFiles.cmake
@@ -0,0 +1,5 @@
+file(GLOB_RECURSE FILES_TO_REMOVE ${REMOVE_FILE_GLOB})
+
+if(FILES_TO_REMOVE)
+ file(REMOVE ${FILES_TO_REMOVE})
+endif()
diff --git a/cmake.deps/cmake/TargetArch.cmake b/cmake.deps/cmake/TargetArch.cmake
new file mode 100644
index 0000000000..71ea44ec59
--- /dev/null
+++ b/cmake.deps/cmake/TargetArch.cmake
@@ -0,0 +1,23 @@
+# Sets TARGET_ARCH to a normalized name (X86 or X86_64).
+# See https://github.com/axr/solar-cmake/blob/master/TargetArch.cmake
+include(CheckSymbolExists)
+
+# X86
+check_symbol_exists("_M_IX86" "" T_M_IX86)
+check_symbol_exists("__i386__" "" T_I386)
+if(T_M_IX86 OR T_I386)
+set(TARGET_ARCH "X86")
+ return()
+endif()
+
+# X86_64
+check_symbol_exists("_M_AMD64" "" T_M_AMD64)
+check_symbol_exists("__x86_64__" "" T_X86_64)
+check_symbol_exists("__amd64__" "" T_AMD64)
+
+if(T_M_AMD64 OR T_X86_64 OR T_AMD64)
+set(TARGET_ARCH "X86_64")
+ return()
+endif()
+
+message(FATAL_ERROR "Unknown target architecture")
diff --git a/cmake.deps/cmake/TreesitterCMakeLists.txt b/cmake.deps/cmake/TreesitterCMakeLists.txt
new file mode 100644
index 0000000000..9e3ba3eeda
--- /dev/null
+++ b/cmake.deps/cmake/TreesitterCMakeLists.txt
@@ -0,0 +1,21 @@
+cmake_minimum_required(VERSION 2.8.12)
+project(tree-sitter LANGUAGES C)
+
+file(GLOB SRC_FILES ${PROJECT_SOURCE_DIR}/lib/src/*.c)
+foreach(sfile ${SRC_FILES})
+ get_filename_component(f ${sfile} NAME)
+ if(${f} MATCHES "lib.c$")
+ list(REMOVE_ITEM SRC_FILES ${sfile})
+ endif()
+endforeach()
+include_directories(${PROJECT_SOURCE_DIR}/lib/include)
+add_library(tree-sitter ${SRC_FILES})
+
+install(FILES
+ lib/include/tree_sitter/api.h
+ lib/include/tree_sitter/parser.h
+ DESTINATION include/tree_sitter)
+
+include(GNUInstallDirs)
+install(TARGETS tree-sitter
+ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
diff --git a/cmake.deps/cmake/TreesitterParserCMakeLists.txt b/cmake.deps/cmake/TreesitterParserCMakeLists.txt
new file mode 100644
index 0000000000..2808a9ee14
--- /dev/null
+++ b/cmake.deps/cmake/TreesitterParserCMakeLists.txt
@@ -0,0 +1,19 @@
+cmake_minimum_required(VERSION 2.8.12)
+# some parsers have c++ scanner, problem?
+project(parser C) # CXX
+
+add_library(parser
+ MODULE
+ src/parser.c
+)
+set_target_properties(
+ parser
+ PROPERTIES
+ POSITION_INDEPENDENT_CODE ON
+ OUTPUT_NAME ${PARSERLANG}
+ PREFIX ""
+)
+
+include_directories(src)
+
+install(TARGETS parser LIBRARY DESTINATION lib/nvim/parser)
diff --git a/cmake.deps/cmake/UnibiliumCMakeLists.txt b/cmake.deps/cmake/UnibiliumCMakeLists.txt
new file mode 100644
index 0000000000..08a8599352
--- /dev/null
+++ b/cmake.deps/cmake/UnibiliumCMakeLists.txt
@@ -0,0 +1,25 @@
+cmake_minimum_required(VERSION 2.8.12)
+project(unibilium LANGUAGES C)
+
+file(GLOB SRC_FILES ${PROJECT_SOURCE_DIR}/*.c)
+add_library(unibilium ${SRC_FILES})
+set_target_properties(unibilium PROPERTIES PUBLIC_HEADER ${PROJECT_SOURCE_DIR}/unibilium.h
+ VERSION "${VERSION_MAJOR}.${VERSION_MINOR}")
+
+if(NOT WIN32)
+ execute_process(COMMAND "shell ncursesw6-config --terminfo-dirs 2>/dev/null || \
+ ncurses6-config --terminfo-dirs 2>/dev/null || \
+ ncursesw5-config --terminfo-dirs 2>/dev/null || \
+ ncurses5-config --terminfo-dirs 2>/dev/null || \
+ echo '/etc/terminfo:/lib/terminfo:/usr/share/terminfo:/usr/lib/terminfo:/usr/local/share/terminfo:/usr/local/lib/terminfo'"
+ OUTPUT_VARIABLE TERMINFO_DIRS)
+else()
+ set(TERMINFO_DIRS "\"\"")
+endif()
+target_compile_definitions(unibilium PUBLIC TERMINFO_DIRS=${TERMINFO_DIRS})
+
+include(GNUInstallDirs)
+install(TARGETS unibilium
+ PUBLIC_HEADER
+ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
+ PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
diff --git a/cmake.deps/cmake/libtermkeyCMakeLists.txt b/cmake.deps/cmake/libtermkeyCMakeLists.txt
new file mode 100644
index 0000000000..af54c1daec
--- /dev/null
+++ b/cmake.deps/cmake/libtermkeyCMakeLists.txt
@@ -0,0 +1,34 @@
+cmake_minimum_required(VERSION 2.8.12)
+project(libtermkey)
+
+add_definitions(-D _CRT_SECURE_NO_WARNINGS)
+add_definitions(-DHAVE_UNIBILIUM)
+if(NOT MSVC)
+ add_compile_options(-std=c99)
+endif()
+
+include_directories(${PROJECT_BINARY_DIR}/t)
+include_directories(SYSTEM ${UNIBILIUM_INCLUDE_DIRS})
+
+add_library(termkey termkey.c driver-csi.c driver-ti.c)
+set_target_properties(termkey PROPERTIES
+ PUBLIC_HEADER ${PROJECT_SOURCE_DIR}/termkey.h)
+target_link_libraries(termkey ${UNIBILIUM_LIBRARIES})
+
+include(GNUInstallDirs)
+install(TARGETS termkey
+ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
+ PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
+
+enable_testing()
+file(GLOB TESTSOURCES "t/[0-9]*.c")
+foreach(f ${TESTSOURCES})
+ get_filename_component(t ${f} NAME_WE)
+ if(${t} STREQUAL 05read)
+ continue()
+ endif()
+
+ add_executable("test_${t}" ${f} t/taplib.c)
+ target_link_libraries("test_${t}" termkey)
+ add_test("${t}" "test_${t}")
+endforeach()
diff --git a/cmake.deps/patches/libvterm-Remove-VLAs-for-MSVC.patch b/cmake.deps/patches/libvterm-Remove-VLAs-for-MSVC.patch
new file mode 100644
index 0000000000..e999c0fa9b
--- /dev/null
+++ b/cmake.deps/patches/libvterm-Remove-VLAs-for-MSVC.patch
@@ -0,0 +1,50 @@
+From eb386b1d82f7d07363c9133b7aa06902ccd555fe Mon Sep 17 00:00:00 2001
+Date: Tue, 27 Feb 2018 17:54:20 -0600
+Subject: [PATCH] Remove VLAs for MSVC
+
+VLAs are replaced with calls to _alloca() because MSVC does not support them.
+---
+ src/state.c | 7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+diff --git a/src/state.c b/src/state.c
+index 84299df..f9aabb3 100644
+--- a/src/state.c
++++ b/src/state.c
+@@ -1,5 +1,6 @@
+ #include "vterm_internal.h"
+
++#include <malloc.h>
+ #include <stdio.h>
+ #include <string.h>
+
+@@ -236,7 +237,7 @@ static int on_text(const char bytes[], size_t len, void *user)
+ VTermPos oldpos = state->pos;
+
+ // We'll have at most len codepoints
+- uint32_t codepoints[len];
++ uint32_t* codepoints = _alloca(len * sizeof(uint32_t));
+ int npoints = 0;
+ size_t eaten = 0;
+
+@@ -313,7 +314,7 @@ static int on_text(const char bytes[], size_t len, void *user)
+
+ int width = 0;
+
+- uint32_t chars[glyph_ends - glyph_starts + 1];
++ uint32_t* chars = _alloca((glyph_ends - glyph_starts + 1) * sizeof(uint32_t));
+
+ for( ; i < glyph_ends; i++) {
+ chars[i - glyph_starts] = codepoints[i];
+@@ -512,7 +513,7 @@ static int settermprop_int(VTermState *state, VTermProp prop, int v)
+
+ static int settermprop_string(VTermState *state, VTermProp prop, const char *str, size_t len)
+ {
+- char strvalue[len+1];
++ char* strvalue = _alloca(len+1);
+ strncpy(strvalue, str, len);
+ strvalue[len] = 0;
+
+--
+2.16.1.windows.4
+