neovim/cmake.deps/cmake/BuildTreesitter.cmake
dundargoc 6e3a69b4cf
build: consistently set build type regardless of generator or platform #19760
Change the default build type to always be Debug, and allow only four
predefined build types: Debug, Release, RelWithDebInfo and MinRelSize.
Furthermore, flags meant for single-configuration generator (make,
ninja) will not be used for multi-configuration generators (visual
studio, Xcode), and flags meant for multi-configuration generators will
not be used for single-configuration generators.

This will allow Debug builds to be built with MSVC which requires that
all dependencies are also built with the Debug build type to avoid
runtime library mismatch.

The correct way to specify build type (for example Release) for
single-configuration generators (Make and Ninja) is to run

cmake -B build -D CMAKE_BUILD_TYPE=Release
cmake --build build

while for multi-configuration generators (Visual Studio, Xcode and Ninja
Multi-Config) is to run

cmake -B build
cmake --build build --config Release

Passing CMAKE_BUILD_TYPE for multi-config generators will now not only
not be used, but also generate a warning for the user.

Co-authored-by: dundargoc <gocundar@gmail.com>
2022-09-06 07:52:39 -07:00

60 lines
2.3 KiB
CMake

# 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}
${BUILD_TYPE_STRING}
-DCMAKE_INSTALL_PREFIX=${DEPS_INSTALL_DIR}
BUILD_COMMAND ${CMAKE_COMMAND} --build . --config $<CONFIG>
INSTALL_COMMAND ${CMAKE_COMMAND} --build . --target install --config $<CONFIG>
)
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)