From 6f0d3c0e77bbcd769effed3e5568d9038486f16d Mon Sep 17 00:00:00 2001 From: Rui Abreu Ferreira Date: Fri, 11 Jul 2014 12:12:10 +0100 Subject: [PATCH 1/2] Refactor the lua dependency checking. This is in preparation for the next step, which is to find a suitable lua interpreter, rather than just erroring when an interpreter is found but doesn't have the necessary dependencies. Helped-by: John Szakmeister --- CMakeLists.txt | 28 +++++++--------------------- cmake/LuaHelpers.cmake | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 21 deletions(-) create mode 100644 cmake/LuaHelpers.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index b58f717eb6..97b21d1f14 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -98,29 +98,15 @@ if(NOT EXISTS ${LUA_PRG}) find_program(LUA_PRG lua) endif() -if(EXISTS ${LUA_PRG}) - message(STATUS "Using the lua interpreter ${LUA_PRG}") -else() - message(FATAL_ERROR "A lua interpreter is required for building the Neovim") +include(LuaHelpers) +set(LUA_DEPENDENCIES lpeg cmsgpack) +check_lua_deps(${LUA_PRG} "${LUA_DEPENDENCIES}" LUA_PRG_WORKS) + +if(NOT LUA_PRG_WORKS) + message(FATAL_ERROR "A suitable Lua interpreter was not found") endif() -execute_process(COMMAND ${LUA_PRG} -e "require('lpeg')" - RESULT_VARIABLE LUA_LPEG_MISSING - ERROR_QUIET) - -if(${LUA_LPEG_MISSING}) - message(FATAL_ERROR - "The 'lpeg' lua package is required for building Neovim") -endif() - -execute_process(COMMAND ${LUA_PRG} -e "require('cmsgpack')" - RESULT_VARIABLE LUA_MSGPACK_MISSING - ERROR_QUIET) - -if(${LUA_MSGPACK_MISSING}) - message(FATAL_ERROR - "The 'cmsgpack' lua package is required for building Neovim") -endif() +message(STATUS "Using the Lua interpreter ${LUA_PRG}") add_subdirectory(config) add_subdirectory(src/nvim) diff --git a/cmake/LuaHelpers.cmake b/cmake/LuaHelpers.cmake new file mode 100644 index 0000000000..b1e67e0ca7 --- /dev/null +++ b/cmake/LuaHelpers.cmake @@ -0,0 +1,38 @@ +# +# Functions to help checking for a Lua interpreter +# + +# Check if a module is available in Lua +function(check_lua_module LUA_PRG_PATH MODULE RESULT_VAR) + execute_process(COMMAND ${LUA_PRG_PATH} -e "require('${MODULE}')" + RESULT_VARIABLE module_missing + ERROR_QUIET) + if(module_missing) + message(STATUS + "[${LUA_PRG_PATH}] The '${MODULE}' lua package is required for building Neovim") + set(${RESULT_VAR} False PARENT_SCOPE) + else() + set(${RESULT_VAR} True PARENT_SCOPE) + endif() +endfunction() + +# Check Lua interpreter for dependencies +function(check_lua_deps LUA_PRG_PATH MODULES RESULT_VAR) + # Check if the lua interpreter at the given path + # satisfies all Neovim dependencies + message(STATUS "Checking Lua interpreter ${LUA_PRG_PATH}") + if(NOT EXISTS ${LUA_PRG_PATH}) + message(STATUS + "[${LUA_PRG_PATH}] file not found") + endif() + + foreach(module ${MODULES}) + check_lua_module(${LUA_PRG_PATH} ${module} has_module) + if(NOT has_module) + set(${RESULT_VAR} False PARENT_SCOPE) + return() + endif() + endforeach() + + set(${RESULT_VAR} True PARENT_SCOPE) +endfunction() From 5d44f89a8cdd41531177f041fb73f106c03686d8 Mon Sep 17 00:00:00 2001 From: Rui Abreu Ferreira Date: Fri, 11 Jul 2014 12:12:18 +0100 Subject: [PATCH 2/2] Check dependencies for each lua interpreter. - When USE_BUNDLED=OFF and the system has multiple lua interpreters (luajit AND lua) it may occur that only the later has the needed dependencies (lua-lpeg, lua-cmsgpack). If we pick luajit then finding the dependencies FAILS. - This commit groups detection of the lua interpreter with the lua dependencies it tries to find them for both the interpreters and choses the first one that has them. Helped-by: John Szakmeister --- CMakeLists.txt | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 97b21d1f14..b95f7fd277 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -91,16 +91,26 @@ find_package(Threads REQUIRED) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) -find_program(LUA_PRG luajit) - -# Need a lua interpreter for running the msgapck metadata/dispatch generator -if(NOT EXISTS ${LUA_PRG}) - find_program(LUA_PRG lua) -endif() - +# Find Lua interpreter include(LuaHelpers) set(LUA_DEPENDENCIES lpeg cmsgpack) -check_lua_deps(${LUA_PRG} "${LUA_DEPENDENCIES}" LUA_PRG_WORKS) +if(NOT LUA_PRG) + foreach(CURRENT_LUA_PRG luajit lua) + # If LUA_PRG is set find_program() will not search + unset(LUA_PRG CACHE) + unset(LUA_PRG_WORKS) + find_program(LUA_PRG ${CURRENT_LUA_PRG}) + + if(LUA_PRG) + check_lua_deps(${LUA_PRG} "${LUA_DEPENDENCIES}" LUA_PRG_WORKS) + if(LUA_PRG_WORKS) + break() + endif() + endif() + endforeach() +else() + check_lua_deps(${LUA_PRG} "${LUA_DEPENDENCIES}" LUA_PRG_WORKS) +endif() if(NOT LUA_PRG_WORKS) message(FATAL_ERROR "A suitable Lua interpreter was not found")