CMake: Build third-party deps in Windows

- Update recipes to build with MSVC or cross compile in Unix with Mingw
- For recipes that need to be reused, wrap recipe in CMake function
  using cmake_parse_arguments
- New directory .deps/host is the install root for HOST targets, the old
  .deps/usr is used for TARGET
- In windows disable builds for terminal libraries and jemalloc
- Added cmake script CopyFilesGlob.cmake to copy files using glob
    cmake -DFROM_GLOB=*.h -DTO=/usr/include -P CopyFilesGlob.cmake
- New CMake variables HOSTDEPS_* can be used in cross compile recipes.
  Except when the target is UNIX, since that would break 32bit builds
  in 64bit Unix systems using the Travis 32bit toolchain
This commit is contained in:
Rui Abreu Ferreira 2015-04-16 10:01:08 +01:00 committed by Florian Walch
parent 73dbd14283
commit cca32e64cc
10 changed files with 389 additions and 100 deletions

View File

@ -51,6 +51,22 @@ else()
set(DEPS_C_COMPILER "${CMAKE_C_COMPILER}") set(DEPS_C_COMPILER "${CMAKE_C_COMPILER}")
endif() 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) include(ExternalProject)
set(LIBUV_URL https://github.com/libuv/libuv/archive/v1.5.0.tar.gz) set(LIBUV_URL https://github.com/libuv/libuv/archive/v1.5.0.tar.gz)

View File

@ -1,3 +1,8 @@
if(WIN32)
message(STATUS "Building jemalloc in Windows is not supported (skipping)")
return()
endif()
ExternalProject_Add(jemalloc ExternalProject_Add(jemalloc
PREFIX ${DEPS_BUILD_DIR} PREFIX ${DEPS_BUILD_DIR}
URL ${JEMALLOC_URL} URL ${JEMALLOC_URL}

View File

@ -1,3 +1,7 @@
if(WIN32)
message(STATUS "Building libtermkey in Windows is not supported (skipping)")
return()
endif()
find_package(PkgConfig REQUIRED) find_package(PkgConfig REQUIRED)
ExternalProject_Add(libtermkey ExternalProject_Add(libtermkey

View File

@ -1,4 +1,24 @@
ExternalProject_Add(libuv 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} PREFIX ${DEPS_BUILD_DIR}
URL ${LIBUV_URL} URL ${LIBUV_URL}
DOWNLOAD_DIR ${DEPS_DOWNLOAD_DIR}/libuv DOWNLOAD_DIR ${DEPS_DOWNLOAD_DIR}/libuv
@ -7,12 +27,58 @@ ExternalProject_Add(libuv
-DDOWNLOAD_DIR=${DEPS_DOWNLOAD_DIR}/libuv -DDOWNLOAD_DIR=${DEPS_DOWNLOAD_DIR}/libuv
-DURL=${LIBUV_URL} -DURL=${LIBUV_URL}
-DEXPECTED_SHA256=${LIBUV_SHA256} -DEXPECTED_SHA256=${LIBUV_SHA256}
-DTARGET=libuv -DTARGET=${_libuv_TARGET}
-P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/DownloadAndExtractFile.cmake -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/DownloadAndExtractFile.cmake
CONFIGURE_COMMAND sh ${DEPS_BUILD_DIR}/src/libuv/autogen.sh && 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 ${DEPS_BUILD_DIR}/src/libuv/configure --with-pic --disable-shared
--prefix=${DEPS_INSTALL_DIR} --libdir=${DEPS_INSTALL_DIR}/lib --prefix=${DEPS_INSTALL_DIR} --libdir=${DEPS_INSTALL_DIR}/lib
CC=${DEPS_C_COMPILER} CC=${DEPS_C_COMPILER})
if(UNIX)
BuildLibUv(
CONFIGURE_COMMAND ${UNIX_CFGCMD}
INSTALL_COMMAND ${MAKE_PRG} install) 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) list(APPEND THIRD_PARTY_DEPS libuv)

View File

@ -1,3 +1,8 @@
if(WIN32)
message(STATUS "Building libvterm in Windows is not supported (skipping)")
return()
endif()
ExternalProject_Add(libvterm ExternalProject_Add(libvterm
PREFIX ${DEPS_BUILD_DIR} PREFIX ${DEPS_BUILD_DIR}
URL ${LIBVTERM_URL} URL ${LIBVTERM_URL}

View File

@ -1,4 +1,23 @@
ExternalProject_Add(luajit 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} PREFIX ${DEPS_BUILD_DIR}
URL ${LUAJIT_URL} URL ${LUAJIT_URL}
DOWNLOAD_DIR ${DEPS_DOWNLOAD_DIR}/luajit DOWNLOAD_DIR ${DEPS_DOWNLOAD_DIR}/luajit
@ -7,14 +26,15 @@ ExternalProject_Add(luajit
-DDOWNLOAD_DIR=${DEPS_DOWNLOAD_DIR}/luajit -DDOWNLOAD_DIR=${DEPS_DOWNLOAD_DIR}/luajit
-DURL=${LUAJIT_URL} -DURL=${LUAJIT_URL}
-DEXPECTED_SHA256=${LUAJIT_SHA256} -DEXPECTED_SHA256=${LUAJIT_SHA256}
-DTARGET=luajit -DTARGET=${_luajit_TARGET}
-P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/DownloadAndExtractFile.cmake -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/DownloadAndExtractFile.cmake
CONFIGURE_COMMAND "" CONFIGURE_COMMAND "${_luajit_CONFIGURE_COMMAND}"
BUILD_IN_SOURCE 1 BUILD_IN_SOURCE 1
BUILD_COMMAND "" BUILD_COMMAND "${_luajit_BUILD_COMMAND}"
INSTALL_COMMAND ${MAKE_PRG} CC=${DEPS_C_COMPILER} INSTALL_COMMAND "${_luajit_INSTALL_COMMAND}")
PREFIX=${DEPS_INSTALL_DIR} endfunction()
CFLAGS=-fPIC
set(INSTALLCMD_UNIX ${MAKE_PRG} CFLAGS=-fPIC
CFLAGS+=-DLUAJIT_DISABLE_JIT CFLAGS+=-DLUAJIT_DISABLE_JIT
CFLAGS+=-DLUA_USE_APICHECK CFLAGS+=-DLUA_USE_APICHECK
CFLAGS+=-DLUA_USE_ASSERT CFLAGS+=-DLUA_USE_ASSERT
@ -22,4 +42,46 @@ ExternalProject_Add(luajit
BUILDMODE=static BUILDMODE=static
install) 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) list(APPEND THIRD_PARTY_DEPS luajit)

View File

@ -1,9 +1,27 @@
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) if(MSVC)
list(APPEND LUAROCKS_OPTS message(STATUS "Building busted in Windows is not supported (skipping)")
--with-lua=${DEPS_INSTALL_DIR} else()
--with-lua-include=${DEPS_INSTALL_DIR}/include/luajit-2.0) option(USE_BUNDLED_BUSTED "Use the bundled version of busted to run tests." ON)
endif()
# 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() endif()
ExternalProject_Add(luarocks ExternalProject_Add(luarocks
@ -18,18 +36,55 @@ ExternalProject_Add(luarocks
-DTARGET=luarocks -DTARGET=luarocks
-P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/DownloadAndExtractFile.cmake -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/DownloadAndExtractFile.cmake
BUILD_IN_SOURCE 1 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()
BuildLuarocks(
CONFIGURE_COMMAND ${DEPS_BUILD_DIR}/src/luarocks/configure CONFIGURE_COMMAND ${DEPS_BUILD_DIR}/src/luarocks/configure
--prefix=${DEPS_INSTALL_DIR} --force-config ${LUAROCKS_OPTS} --prefix=${HOSTDEPS_INSTALL_DIR} --force-config ${LUAROCKS_OPTS}
--lua-suffix=jit --lua-suffix=jit
BUILD_COMMAND ""
INSTALL_COMMAND ${MAKE_PRG} bootstrap) INSTALL_COMMAND ${MAKE_PRG} bootstrap)
list(APPEND THIRD_PARTY_DEPS luarocks) 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)
# The path to the luarocks executable set(LUAROCKS_BINARY ${DEPS_INSTALL_DIR}/2.2/luarocks.bat)
set(LUAROCKS_BINARY ${DEPS_BIN_DIR}/luarocks) else()
# Common build arguments for luarocks build message(FATAL_ERROR "Trying to build luarocks in an unsupported system ${CMAKE_SYSTEM_NAME}/${CMAKE_C_COMPILER_ID}")
set(LUAROCKS_BUILDARGS CC=${DEPS_C_COMPILER} LD=${DEPS_C_COMPILER}) endif()
list(APPEND THIRD_PARTY_DEPS luarocks)
if(USE_BUNDLED_LUAJIT) if(USE_BUNDLED_LUAJIT)
add_dependencies(luarocks luajit) add_dependencies(luarocks luajit)
@ -37,29 +92,30 @@ endif()
# Each target depends on the previous module, this serializes all calls to # Each target depends on the previous module, this serializes all calls to
# luarocks since it is unhappy to be called in parallel. # 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} COMMAND ${LUAROCKS_BINARY}
ARGS build lua-messagepack ${LUAROCKS_BUILDARGS} ARGS build lua-messagepack ${LUAROCKS_BUILDARGS}
DEPENDS luarocks) DEPENDS luarocks)
add_custom_target(lua-messagepack 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 # Like before, depend on lua-messagepack to ensure serialization of install
# commands # commands
add_custom_command(OUTPUT ${DEPS_LIB_DIR}/luarocks/rocks/lpeg add_custom_command(OUTPUT ${HOSTDEPS_LIB_DIR}/luarocks/rocks/lpeg
COMMAND ${LUAROCKS_BINARY} COMMAND ${LUAROCKS_BINARY}
ARGS build lpeg ${LUAROCKS_BUILDARGS} ARGS build lpeg ${LUAROCKS_BUILDARGS}
DEPENDS lua-messagepack) DEPENDS lua-messagepack)
add_custom_target(lpeg 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) if(USE_BUNDLED_BUSTED)
# The following are only required if we want to run tests # The following are only required if we want to run tests
# with busted # with busted
add_custom_command(OUTPUT ${HOSTDEPS_LIB_DIR}/luarocks/rocks/stable-busted-deps
add_custom_command(OUTPUT ${DEPS_LIB_DIR}/luarocks/rocks/stable-busted-deps
COMMAND ${LUAROCKS_BINARY} COMMAND ${LUAROCKS_BINARY}
ARGS build lua_cliargs 2.5-1 ${LUAROCKS_BUILDARGS} ARGS build lua_cliargs 2.5-1 ${LUAROCKS_BUILDARGS}
COMMAND ${LUAROCKS_BINARY} COMMAND ${LUAROCKS_BINARY}
@ -82,24 +138,24 @@ if(USE_BUNDLED_BUSTED)
ARGS build xml 1.1.2-1 ${LUAROCKS_BUILDARGS} ARGS build xml 1.1.2-1 ${LUAROCKS_BUILDARGS}
COMMAND ${LUAROCKS_BINARY} COMMAND ${LUAROCKS_BINARY}
ARGS build ansicolors 1.0.2-3 ${LUAROCKS_BUILDARGS} 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) DEPENDS lpeg)
add_custom_target(stable-busted-deps 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} COMMAND ${LUAROCKS_BINARY}
ARGS build https://raw.githubusercontent.com/Olivine-Labs/busted/v2.0.rc8-0/busted-2.0.rc8-0.rockspec ${LUAROCKS_BUILDARGS} 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) DEPENDS stable-busted-deps)
add_custom_target(busted 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} 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) DEPENDS busted libuv)
add_custom_target(nvim-client 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) list(APPEND THIRD_PARTY_DEPS stable-busted-deps busted nvim-client)
endif() endif()

View File

@ -1,3 +1,19 @@
include(CMakeParseArguments)
# 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 ExternalProject_Add(msgpack
PREFIX ${DEPS_BUILD_DIR} PREFIX ${DEPS_BUILD_DIR}
@ -10,13 +26,49 @@ ExternalProject_Add(msgpack
-DEXPECTED_SHA256=${MSGPACK_SHA256} -DEXPECTED_SHA256=${MSGPACK_SHA256}
-DTARGET=msgpack -DTARGET=msgpack
-P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/DownloadAndExtractFile.cmake -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/DownloadAndExtractFile.cmake
CONFIGURE_COMMAND cmake ${DEPS_BUILD_DIR}/src/msgpack 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_ENABLE_CXX=OFF
-DMSGPACK_BUILD_TESTS=OFF -DMSGPACK_BUILD_TESTS=OFF
-DCMAKE_INSTALL_PREFIX=${DEPS_INSTALL_DIR} -DCMAKE_INSTALL_PREFIX=${DEPS_INSTALL_DIR}
-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
"-DCMAKE_C_FLAGS:STRING=${CMAKE_C_COMPILER_ARG1} -fPIC" "-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)
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)

View File

@ -1,3 +1,8 @@
if(WIN32)
message(STATUS "Building Unibilium in Windows is not supported (skipping)")
return()
endif()
ExternalProject_Add(unibilium ExternalProject_Add(unibilium
PREFIX ${DEPS_BUILD_DIR} PREFIX ${DEPS_BUILD_DIR}
URL ${UNIBILIUM_URL} URL ${UNIBILIUM_URL}

18
third-party/cmake/CopyFilesGlob.cmake vendored Normal file
View File

@ -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()