From 8a790cba559e22955f35c4089da597de10c406f8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Florian=20M=C3=A4rkl?= <info@florianmaerkl.de>
Date: Sat, 8 Jun 2024 07:47:36 +0200
Subject: [PATCH 1/2] build and install tree-sitter parsers

neovim needs a number of prebuilt parsers in <prefix>/lib/nvim/parser/
or else it will throw errors when opening e.g. ":help".
USE_BUNDLED is also not a valid option for the root cmake build system
anymore, but applies to the one in cmake.deps/.
---
 CMakeLists.txt                                | 13 +++++++++++++
 cmake.deps/cmake/BuildTreesitterParsers.cmake |  4 +++-
 src/nvim/CMakeLists.txt                       | 12 +++++-------
 3 files changed, 21 insertions(+), 8 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index f7c9956325..1b89b6b606 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -102,6 +102,19 @@ endif()
 
 list(INSERT CMAKE_PREFIX_PATH 0 ${DEPS_PREFIX})
 
+# Reading deps.txt adapted from cmake.deps/CMakeLists.txt
+file(READ cmake.deps/deps.txt DEPENDENCIES)
+STRING(REGEX REPLACE "\n" ";" DEPENDENCIES "${DEPENDENCIES}")
+foreach(dep ${DEPENDENCIES})
+  STRING(REGEX REPLACE " " ";" dep "${dep}")
+  list(GET dep 0 name)
+  list(GET dep 1 value)
+  set(${name} ${value})
+endforeach()
+set(DEPS_IGNORE_SHA FALSE)
+list(APPEND DEPS_CMAKE_ARGS -D "CMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}" -D "CMAKE_C_FLAGS=${CMAKE_C_FLAGS}")
+include(cmake.deps/cmake/BuildTreesitterParsers.cmake)
+
 if(APPLE)
   # If the macOS deployment target is not set manually (via $MACOSX_DEPLOYMENT_TARGET),
   # fall back to local system version. Needs to be done both here and in cmake.deps.
diff --git a/cmake.deps/cmake/BuildTreesitterParsers.cmake b/cmake.deps/cmake/BuildTreesitterParsers.cmake
index 060447e6fe..9c3f7165e4 100644
--- a/cmake.deps/cmake/BuildTreesitterParsers.cmake
+++ b/cmake.deps/cmake/BuildTreesitterParsers.cmake
@@ -21,13 +21,15 @@ function(BuildTSParser)
   ExternalProject_Add(${NAME}
     DOWNLOAD_DIR ${DEPS_DOWNLOAD_DIR}/${NAME}
     PATCH_COMMAND ${CMAKE_COMMAND} -E copy
-      ${CMAKE_CURRENT_SOURCE_DIR}/cmake/${TS_CMAKE_FILE}
+      ${CMAKE_CURRENT_LIST_DIR}/${TS_CMAKE_FILE}
       ${DEPS_BUILD_DIR}/src/${NAME}/CMakeLists.txt
     CMAKE_ARGS ${DEPS_CMAKE_ARGS}
       -D PARSERLANG=${TS_LANG}
     ${EXTERNALPROJECT_OPTIONS})
 endfunction()
 
+set(ALL_BUNDLED_TS_PARSER_TARGETS c lua vim vimdoc query markdown) # All parsers built in the lines directly below.
+list(TRANSFORM ALL_BUNDLED_TS_PARSER_TARGETS PREPEND treesitter_)
 foreach(lang c lua vim vimdoc query)
   BuildTSParser(LANG ${lang})
 endforeach()
diff --git a/src/nvim/CMakeLists.txt b/src/nvim/CMakeLists.txt
index 574344e4e0..04bc3cb842 100644
--- a/src/nvim/CMakeLists.txt
+++ b/src/nvim/CMakeLists.txt
@@ -771,13 +771,11 @@ endif()
 
 file(MAKE_DIRECTORY ${BINARY_LIB_DIR})
 
-# install treesitter parser if bundled
-if(EXISTS ${DEPS_PREFIX}/lib/nvim/parser)
-  add_custom_command(
-    TARGET nvim_runtime_deps
-    POST_BUILD
-    COMMAND ${CMAKE_COMMAND} -E ${COPY_DIRECTORY} ${DEPS_PREFIX}/lib/nvim/parser ${BINARY_LIB_DIR}/parser)
-endif()
+add_dependencies(nvim_runtime_deps ${ALL_BUNDLED_TS_PARSER_TARGETS})
+add_custom_command(
+  TARGET nvim_runtime_deps
+  POST_BUILD
+  COMMAND ${CMAKE_COMMAND} -E ${COPY_DIRECTORY} ${DEPS_INSTALL_DIR}/lib/nvim/parser ${BINARY_LIB_DIR}/parser)
 
 install(DIRECTORY ${BINARY_LIB_DIR}
   DESTINATION ${CMAKE_INSTALL_LIBDIR}
-- 
2.48.0

