diff options
Diffstat (limited to 'cmake.deps')
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 + |