diff options
Diffstat (limited to 'third-party/cmake/BuildLuarocks.cmake')
-rw-r--r-- | third-party/cmake/BuildLuarocks.cmake | 138 |
1 files changed, 97 insertions, 41 deletions
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() |