aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--third-party/CMakeLists.txt16
-rw-r--r--third-party/cmake/BuildJeMalloc.cmake5
-rw-r--r--third-party/cmake/BuildLibtermkey.cmake4
-rw-r--r--third-party/cmake/BuildLibuv.cmake98
-rw-r--r--third-party/cmake/BuildLibvterm.cmake5
-rw-r--r--third-party/cmake/BuildLuajit.cmake108
-rw-r--r--third-party/cmake/BuildLuarocks.cmake138
-rw-r--r--third-party/cmake/BuildMsgpack.cmake92
-rw-r--r--third-party/cmake/BuildUnibilium.cmake5
-rw-r--r--third-party/cmake/CopyFilesGlob.cmake18
10 files changed, 389 insertions, 100 deletions
diff --git a/third-party/CMakeLists.txt b/third-party/CMakeLists.txt
index 15a9a52efe..d6f208ce48 100644
--- a/third-party/CMakeLists.txt
+++ b/third-party/CMakeLists.txt
@@ -51,6 +51,22 @@ else()
set(DEPS_C_COMPILER "${CMAKE_C_COMPILER}")
endif()
+# Cross compiling: use these for dependencies built for the
+# HOST system, when not crosscompiling these should be the
+# same as DEPS_*. Except when targeting UNIX in which case
+# want all the dependencies to use the same compiler.
+if(CMAKE_CROSSCOMPILING AND NOT UNIX)
+ set(HOSTDEPS_INSTALL_DIR "${CMAKE_BINARY_DIR}/host")
+ set(HOSTDEPS_BIN_DIR "${HOSTDEPS_INSTALL_DIR}/bin")
+ set(HOSTDEPS_LIB_DIR "${HOSTDEPS_INSTALL_DIR}/lib")
+ set(HOSTDEPS_C_COMPILER "${HOST_C_COMPILER}")
+else()
+ 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}")
+endif()
+
include(ExternalProject)
set(LIBUV_URL https://github.com/libuv/libuv/archive/v1.5.0.tar.gz)
diff --git a/third-party/cmake/BuildJeMalloc.cmake b/third-party/cmake/BuildJeMalloc.cmake
index 9756906d97..b02bff166a 100644
--- a/third-party/cmake/BuildJeMalloc.cmake
+++ b/third-party/cmake/BuildJeMalloc.cmake
@@ -1,3 +1,8 @@
+if(WIN32)
+ message(STATUS "Building jemalloc in Windows is not supported (skipping)")
+ return()
+endif()
+
ExternalProject_Add(jemalloc
PREFIX ${DEPS_BUILD_DIR}
URL ${JEMALLOC_URL}
diff --git a/third-party/cmake/BuildLibtermkey.cmake b/third-party/cmake/BuildLibtermkey.cmake
index 882082d349..874b7df104 100644
--- a/third-party/cmake/BuildLibtermkey.cmake
+++ b/third-party/cmake/BuildLibtermkey.cmake
@@ -1,3 +1,7 @@
+if(WIN32)
+ message(STATUS "Building libtermkey in Windows is not supported (skipping)")
+ return()
+endif()
find_package(PkgConfig REQUIRED)
ExternalProject_Add(libtermkey
diff --git a/third-party/cmake/BuildLibuv.cmake b/third-party/cmake/BuildLibuv.cmake
index 3033f82e96..982c8f8067 100644
--- a/third-party/cmake/BuildLibuv.cmake
+++ b/third-party/cmake/BuildLibuv.cmake
@@ -1,18 +1,84 @@
-ExternalProject_Add(libuv
- 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
- -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/DownloadAndExtractFile.cmake
- CONFIGURE_COMMAND 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}
- INSTALL_COMMAND ${MAKE_PRG} install)
+include(CMakeParseArguments)
+
+# 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
+ ""
+ "TARGET"
+ "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}
+ -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/DownloadAndExtractFile.cmake
+ 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}
+ INSTALL_COMMAND ${MAKE_PRG} install)
+
+elseif(MINGW AND CMAKE_CROSSCOMPILING)
+ # Build libuv for the host
+ BuildLibUv(TARGET libuv_host
+ CONFIGURE_COMMAND sh ${DEPS_BUILD_DIR}/src/libuv_host/autogen.sh && ${DEPS_BUILD_DIR}/src/libuv_host/configure --with-pic --disable-shared --prefix=${HOSTDEPS_INSTALL_DIR} CC=${HOST_C_COMPILER}
+ INSTALL_COMMAND ${MAKE_PRG} install)
+
+ # Build libuv for the target
+ BuildLibUv(
+ CONFIGURE_COMMAND ${UNIX_CFGCMD} --host=${CROSS_TARGET}
+ INSTALL_COMMAND ${MAKE_PRG} install)
+
+
+elseif(WIN32 AND MSVC)
+
+ find_package(PythonInterp 2.6 REQUIRED)
+ if(NOT PYTHONINTERP_FOUND OR PYTHON_VERSION_MAJOR GREATER 2)
+ message(FATAL_ERROR "Python2 is required to build libuv on windows, use -DPYTHON_EXECUTABLE to set a python interpreter")
+ endif()
+
+ string(FIND ${CMAKE_GENERATOR} Win64 VS_WIN64)
+ if(VS_WIN64 EQUAL -1)
+ set(VS_ARCH x86)
+ else()
+ set(VS_ARCH x64)
+ endif()
+ BuildLibUv(
+ # By default this creates Debug builds
+ BUILD_COMMAND set PYTHON=${PYTHON_EXECUTABLE} COMMAND ${DEPS_BUILD_DIR}/src/libuv/vcbuild.bat static debug ${VS_ARCH}
+ INSTALL_COMMAND ${CMAKE_COMMAND} -E make_directory ${DEPS_INSTALL_DIR}/lib
+ COMMAND ${CMAKE_COMMAND} -E copy ${DEPS_BUILD_DIR}/src/libuv/Debug/lib/libuv.lib ${DEPS_INSTALL_DIR}/lib
+ COMMAND ${CMAKE_COMMAND} -E make_directory ${DEPS_INSTALL_DIR}/include
+ COMMAND ${CMAKE_COMMAND} -E copy_directory ${DEPS_BUILD_DIR}/src/libuv/include ${DEPS_INSTALL_DIR}/include)
+
+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/third-party/cmake/BuildLibvterm.cmake b/third-party/cmake/BuildLibvterm.cmake
index 6bdb085452..e5963cf6c4 100644
--- a/third-party/cmake/BuildLibvterm.cmake
+++ b/third-party/cmake/BuildLibvterm.cmake
@@ -1,3 +1,8 @@
+if(WIN32)
+ message(STATUS "Building libvterm in Windows is not supported (skipping)")
+ return()
+endif()
+
ExternalProject_Add(libvterm
PREFIX ${DEPS_BUILD_DIR}
URL ${LIBVTERM_URL}
diff --git a/third-party/cmake/BuildLuajit.cmake b/third-party/cmake/BuildLuajit.cmake
index 39207eb8b8..33753fd350 100644
--- a/third-party/cmake/BuildLuajit.cmake
+++ b/third-party/cmake/BuildLuajit.cmake
@@ -1,25 +1,87 @@
-ExternalProject_Add(luajit
- 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
- -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}
- CFLAGS=-fPIC
- CFLAGS+=-DLUAJIT_DISABLE_JIT
- CFLAGS+=-DLUA_USE_APICHECK
- CFLAGS+=-DLUA_USE_ASSERT
- CCDEBUG+=-g
- BUILDMODE=static
- install)
+include(CMakeParseArguments)
+
+# 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"
+ ${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}
+ -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}")
+endfunction()
+
+set(INSTALLCMD_UNIX ${MAKE_PRG} CFLAGS=-fPIC
+ CFLAGS+=-DLUAJIT_DISABLE_JIT
+ CFLAGS+=-DLUA_USE_APICHECK
+ CFLAGS+=-DLUA_USE_ASSERT
+ CCDEBUG+=-g
+ BUILDMODE=static
+ install)
+
+if(UNIX)
+ BuildLuaJit(INSTALL_COMMAND ${INSTALLCMD_UNIX}
+ CC=${DEPS_C_COMPILER} PREFIX=${DEPS_INSTALL_DIR})
+
+elseif(MINGW AND CMAKE_CROSSCOMPILING)
+
+ # Build luajit for the host
+ BuildLuaJit(TARGET luajit_host
+ CONFIGURE_COMMAND ""
+ BUILD_COMMAND ""
+ INSTALL_COMMAND ${INSTALLCMD_UNIX}
+ CC=${HOST_C_COMPILER} PREFIX=${HOSTDEPS_INSTALL_DIR})
+
+ # Build luajit for the target
+ BuildLuaJit(
+ # Similar to Unix + cross - fPIC
+ INSTALL_COMMAND
+ ${MAKE_PRG} PREFIX=${DEPS_INSTALL_DIR}
+ BUILDMODE=static install
+ TARGET_SYS=${CMAKE_SYSTEM_NAME}
+ CROSS=${CROSS_TARGET}-
+ HOST_CC=${HOST_C_COMPILER} HOST_CFLAGS=${HOST_C_FLAGS}
+ HOST_LDFLAGS=${HOST_EXE_LINKER_FLAGS}
+ FILE_T=luajit.exe
+ INSTALL_TSYMNAME=luajit.exe)
+
+elseif(WIN32 AND MSVC)
+
+ BuildLuaJit(
+ BUILD_COMMAND ${CMAKE_COMMAND} -E chdir ${DEPS_BUILD_DIR}/src/luajit/src ${DEPS_BUILD_DIR}/src/luajit/src/msvcbuild.bat static
+ 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.lib ${DEPS_INSTALL_DIR}/bin
+ COMMAND ${CMAKE_COMMAND} -E make_directory ${DEPS_INSTALL_DIR}/lib
+ COMMAND ${CMAKE_COMMAND} -E copy ${DEPS_BUILD_DIR}/src/luajit/src/lua51.lib ${DEPS_INSTALL_DIR}/lib
+ COMMAND ${CMAKE_COMMAND} -E make_directory ${DEPS_INSTALL_DIR}/include/luajit-2.0
+ COMMAND ${CMAKE_COMMAND} -DFROM_GLOB=${DEPS_BUILD_DIR}/src/luajit/src/*.h -DTO=${DEPS_INSTALL_DIR}/include/luajit-2.0 -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/CopyFilesGlob.cmake)
+
+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/third-party/cmake/BuildLuarocks.cmake b/third-party/cmake/BuildLuarocks.cmake
index 5f7e575205..4edcf7d1d3 100644
--- a/third-party/cmake/BuildLuarocks.cmake
+++ b/third-party/cmake/BuildLuarocks.cmake
@@ -1,35 +1,90 @@
-option(USE_BUNDLED_BUSTED "Use the bundled version of busted to run tests." ON)
+# 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 than is mean for cross-compile, use the HOSTDEPS_* variables
+# instead of DEPS_* - check the main CMakeLists.txt for a list.
-if(USE_BUNDLED_LUAJIT)
- list(APPEND LUAROCKS_OPTS
- --with-lua=${DEPS_INSTALL_DIR}
- --with-lua-include=${DEPS_INSTALL_DIR}/include/luajit-2.0)
+if(MSVC)
+ message(STATUS "Building busted in Windows is not supported (skipping)")
+else()
+ option(USE_BUNDLED_BUSTED "Use the bundled version of busted to run tests." ON)
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
- -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/DownloadAndExtractFile.cmake
- BUILD_IN_SOURCE 1
- CONFIGURE_COMMAND ${DEPS_BUILD_DIR}/src/luarocks/configure
- --prefix=${DEPS_INSTALL_DIR} --force-config ${LUAROCKS_OPTS}
- --lua-suffix=jit
- BUILD_COMMAND ""
- INSTALL_COMMAND ${MAKE_PRG} bootstrap)
+# 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})
-list(APPEND THIRD_PARTY_DEPS luarocks)
+ 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
+ -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(MSVC)
+ # In native Win32 don't pass the compiler/linker to luarocks, the bundled
+ # version already knows, and passing them here breaks the build
+ set(LUAROCKS_BUILDARGS CFLAGS=/MT)
+else()
+ set(LUAROCKS_BUILDARGS CC=${HOSTDEPS_C_COMPILER} LD=${HOSTDEPS_C_COMPILER})
+endif()
+
+if(UNIX OR (MINGW AND CMAKE_CROSSCOMPILING))
+
+ if(USE_BUNDLED_LUAJIT)
+ list(APPEND LUAROCKS_OPTS
+ --with-lua=${HOSTDEPS_INSTALL_DIR}
+ --with-lua-include=${HOSTDEPS_INSTALL_DIR}/include/luajit-2.0)
+ endif()
-# The path to the luarocks executable
-set(LUAROCKS_BINARY ${DEPS_BIN_DIR}/luarocks)
-# Common build arguments for luarocks build
-set(LUAROCKS_BUILDARGS CC=${DEPS_C_COMPILER} LD=${DEPS_C_COMPILER})
+ BuildLuarocks(
+ CONFIGURE_COMMAND ${DEPS_BUILD_DIR}/src/luarocks/configure
+ --prefix=${HOSTDEPS_INSTALL_DIR} --force-config ${LUAROCKS_OPTS}
+ --lua-suffix=jit
+ INSTALL_COMMAND ${MAKE_PRG} bootstrap)
+
+elseif(MSVC)
+ # 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.0/
+ /P ${DEPS_INSTALL_DIR} /TREE ${DEPS_INSTALL_DIR}
+ /SCRIPTS ${DEPS_BIN_DIR}
+ /CMOD ${DEPS_BIN_DIR}
+ /LUAMOD ${DEPS_BIN_DIR}/lua)
+
+ set(LUAROCKS_BINARY ${DEPS_INSTALL_DIR}/2.2/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)
@@ -37,29 +92,30 @@ endif()
# Each target depends on the previous module, this serializes all calls to
# luarocks since it is unhappy to be called in parallel.
-add_custom_command(OUTPUT ${DEPS_LIB_DIR}/luarocks/rocks/lua-messagepack
+add_custom_command(OUTPUT ${HOSTDEPS_LIB_DIR}/luarocks/rocks/lua-messagepack
COMMAND ${LUAROCKS_BINARY}
ARGS build lua-messagepack ${LUAROCKS_BUILDARGS}
DEPENDS luarocks)
add_custom_target(lua-messagepack
- DEPENDS ${DEPS_LIB_DIR}/luarocks/rocks/lua-messagepack)
+ DEPENDS ${HOSTDEPS_LIB_DIR}/luarocks/rocks/lua-messagepack)
+list(APPEND THIRD_PARTY_DEPS lua-messagepack)
+
# Like before, depend on lua-messagepack to ensure serialization of install
# commands
-add_custom_command(OUTPUT ${DEPS_LIB_DIR}/luarocks/rocks/lpeg
+add_custom_command(OUTPUT ${HOSTDEPS_LIB_DIR}/luarocks/rocks/lpeg
COMMAND ${LUAROCKS_BINARY}
ARGS build lpeg ${LUAROCKS_BUILDARGS}
DEPENDS lua-messagepack)
add_custom_target(lpeg
- DEPENDS ${DEPS_LIB_DIR}/luarocks/rocks/lpeg)
+ DEPENDS ${HOSTDEPS_LIB_DIR}/luarocks/rocks/lpeg)
-list(APPEND THIRD_PARTY_DEPS lua-messagepack lpeg)
+list(APPEND THIRD_PARTY_DEPS lpeg)
if(USE_BUNDLED_BUSTED)
# The following are only required if we want to run tests
# with busted
-
- add_custom_command(OUTPUT ${DEPS_LIB_DIR}/luarocks/rocks/stable-busted-deps
+ add_custom_command(OUTPUT ${HOSTDEPS_LIB_DIR}/luarocks/rocks/stable-busted-deps
COMMAND ${LUAROCKS_BINARY}
ARGS build lua_cliargs 2.5-1 ${LUAROCKS_BUILDARGS}
COMMAND ${LUAROCKS_BINARY}
@@ -82,24 +138,24 @@ if(USE_BUNDLED_BUSTED)
ARGS build xml 1.1.2-1 ${LUAROCKS_BUILDARGS}
COMMAND ${LUAROCKS_BINARY}
ARGS build ansicolors 1.0.2-3 ${LUAROCKS_BUILDARGS}
- COMMAND touch ${DEPS_LIB_DIR}/luarocks/rocks/stable-busted-deps
+ COMMAND touch ${HOSTDEPS_LIB_DIR}/luarocks/rocks/stable-busted-deps
DEPENDS lpeg)
add_custom_target(stable-busted-deps
- DEPENDS ${DEPS_LIB_DIR}/luarocks/rocks/stable-busted-deps)
+ DEPENDS ${HOSTDEPS_LIB_DIR}/luarocks/rocks/stable-busted-deps)
- add_custom_command(OUTPUT ${DEPS_BIN_DIR}/busted
+ add_custom_command(OUTPUT ${HOSTDEPS_BIN_DIR}/busted
COMMAND ${LUAROCKS_BINARY}
ARGS build https://raw.githubusercontent.com/Olivine-Labs/busted/v2.0.rc8-0/busted-2.0.rc8-0.rockspec ${LUAROCKS_BUILDARGS}
DEPENDS stable-busted-deps)
add_custom_target(busted
- DEPENDS ${DEPS_BIN_DIR}/busted)
+ DEPENDS ${HOSTDEPS_BIN_DIR}/busted)
- add_custom_command(OUTPUT ${DEPS_LIB_DIR}/luarocks/rocks/nvim-client
+ add_custom_command(OUTPUT ${HOSTDEPS_LIB_DIR}/luarocks/rocks/nvim-client
COMMAND ${LUAROCKS_BINARY}
- ARGS build https://raw.githubusercontent.com/neovim/lua-client/0.0.1-12/nvim-client-0.0.1-12.rockspec ${LUAROCKS_BUILDARGS} LIBUV_DIR=${DEPS_INSTALL_DIR}
+ ARGS build https://raw.githubusercontent.com/neovim/lua-client/0.0.1-12/nvim-client-0.0.1-12.rockspec ${LUAROCKS_BUILDARGS} LIBUV_DIR=${HOSTDEPS_INSTALL_DIR}
DEPENDS busted libuv)
add_custom_target(nvim-client
- DEPENDS ${DEPS_LIB_DIR}/luarocks/rocks/nvim-client)
+ DEPENDS ${HOSTDEPS_LIB_DIR}/luarocks/rocks/nvim-client)
list(APPEND THIRD_PARTY_DEPS stable-busted-deps busted nvim-client)
endif()
diff --git a/third-party/cmake/BuildMsgpack.cmake b/third-party/cmake/BuildMsgpack.cmake
index b9036718e6..44f5259655 100644
--- a/third-party/cmake/BuildMsgpack.cmake
+++ b/third-party/cmake/BuildMsgpack.cmake
@@ -1,22 +1,74 @@
+include(CMakeParseArguments)
-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
- -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/DownloadAndExtractFile.cmake
- CONFIGURE_COMMAND cmake ${DEPS_BUILD_DIR}/src/msgpack
- -DMSGPACK_ENABLE_CXX=OFF
- -DMSGPACK_BUILD_TESTS=OFF
- -DCMAKE_INSTALL_PREFIX=${DEPS_INSTALL_DIR}
- -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
- "-DCMAKE_C_FLAGS:STRING=${CMAKE_C_COMPILER_ARG1} -fPIC"
- BUILD_COMMAND ${CMAKE_COMMAND} --build .
- INSTALL_COMMAND ${CMAKE_COMMAND} --build . --target install)
-list(APPEND THIRD_PARTY_DEPS msgpack)
+# 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
+ -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/DownloadAndExtractFile.cmake
+ CONFIGURE_COMMAND "${_msgpack_CONFIGURE_COMMAND}"
+ BUILD_COMMAND "${_msgpack_BUILD_COMMAND}"
+ INSTALL_COMMAND "${_msgpack_INSTALL_COMMAND}")
+endfunction()
+
+set(MSGPACK_CONFIGURE_COMMAND ${CMAKE_COMMAND} ${DEPS_BUILD_DIR}/src/msgpack
+ -DMSGPACK_ENABLE_CXX=OFF
+ -DMSGPACK_BUILD_TESTS=OFF
+ -DCMAKE_INSTALL_PREFIX=${DEPS_INSTALL_DIR}
+ -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
+ "-DCMAKE_C_FLAGS:STRING=${CMAKE_C_COMPILER_ARG1} -fPIC")
+set(MSGPACK_BUILD_COMMAND ${CMAKE_COMMAND} --build .)
+set(MSGPACK_INSTALL_COMMAND ${CMAKE_COMMAND} --build . --target install)
+
+if(MINGW AND CMAKE_CROSSCOMPILING)
+ get_filename_component(TOOLCHAIN ${CMAKE_TOOLCHAIN_FILE} REALPATH)
+ set(MSGPACK_CONFIGURE_COMMAND ${CMAKE_COMMAND} ${DEPS_BUILD_DIR}/src/msgpack
+ -DMSGPACK_ENABLE_CXX=OFF
+ -DMSGPACK_BUILD_TESTS=OFF
+ -DCMAKE_INSTALL_PREFIX=${DEPS_INSTALL_DIR}
+ # Pass toolchain
+ -DCMAKE_TOOLCHAIN_FILE=${TOOLCHAIN}
+ # Hack to avoid -rdynamic in Mingw
+ -DCMAKE_SHARED_LIBRARY_LINK_C_FLAGS="")
+elseif(MSVC)
+ # Same as UNIX without fPIC
+ set(MSGPACK_CONFIGURE_COMMAND ${CMAKE_COMMAND} ${DEPS_BUILD_DIR}/src/msgpack
+ -DMSGPACK_ENABLE_CXX=OFF
+ -DMSGPACK_BUILD_TESTS=OFF
+ -DCMAKE_INSTALL_PREFIX=${DEPS_INSTALL_DIR}
+ -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
+ "-DCMAKE_C_FLAGS:STRING=${CMAKE_C_COMPILER_ARG1}"
+ # Make sure we use the same generator, otherwise we may
+ # accidentaly end up using different MSVC runtimes
+ -DCMAKE_GENERATOR=${CMAKE_GENERATOR}
+ # Use static runtime
+ -DCMAKE_C_FLAGS_DEBUG="-MTd"
+ -DCMAKE_C_FLAGS_RELEASE="-MT")
+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/third-party/cmake/BuildUnibilium.cmake b/third-party/cmake/BuildUnibilium.cmake
index 62f393f94c..4cb0ebfa2f 100644
--- a/third-party/cmake/BuildUnibilium.cmake
+++ b/third-party/cmake/BuildUnibilium.cmake
@@ -1,3 +1,8 @@
+if(WIN32)
+ message(STATUS "Building Unibilium in Windows is not supported (skipping)")
+ return()
+endif()
+
ExternalProject_Add(unibilium
PREFIX ${DEPS_BUILD_DIR}
URL ${UNIBILIUM_URL}
diff --git a/third-party/cmake/CopyFilesGlob.cmake b/third-party/cmake/CopyFilesGlob.cmake
new file mode 100644
index 0000000000..056da32fd4
--- /dev/null
+++ b/third-party/cmake/CopyFilesGlob.cmake
@@ -0,0 +1,18 @@
+# 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()
+
+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()