[Tarantool-patches] [PATCH luajit 2/8] test: introduce MakeLuaPath.cmake helper
Sergey Bronnikov
sergeyb at tarantool.org
Mon Aug 15 15:08:58 MSK 2022
Igor, thanks for the patch! See my comments inline.
On 11.08.2022 14:17, Igor Munkin wrote:
> While extending test suites it is often required to append additional
> path where Lua or Lua-C auxiliary modules are located to LUA_PATH or
> LUA_CPATH environment variables. Due to insane semicolon interpolation
> in CMake strings (that converts such string to a list as a result), we
> need to escape semicolon in LUA_PATH/LUA_CPATH strings while building
> the resulting value.
>
> After the years of struggling MakeLuaPath.cmake module is introduced to
> make LUA_PATH and LUA_CPATH definition convenient with <make_lua_path>
> helper. This function takes all paths given as a variable list argument,
> joins them in a reverse order by a semicolon and yields the resulting
> string to a specified CMake variable.
>
> Signed-off-by: Igor Munkin<imun at tarantool.org>
> ---
> cmake/MakeLuaPath.cmake | 46 +++++++++++++++++++++++
> test/CMakeLists.txt | 2 +
> test/PUC-Rio-Lua-5.1-tests/CMakeLists.txt | 8 +++-
> test/lua-Harness-tests/CMakeLists.txt | 16 +++++---
> test/tarantool-tests/CMakeLists.txt | 28 ++++++++------
> 5 files changed, 81 insertions(+), 19 deletions(-)
> create mode 100644 cmake/MakeLuaPath.cmake
>
> diff --git a/cmake/MakeLuaPath.cmake b/cmake/MakeLuaPath.cmake
> new file mode 100644
> index 00000000..9a5a3bb8
> --- /dev/null
> +++ b/cmake/MakeLuaPath.cmake
> @@ -0,0 +1,46 @@
> +# make_lua_path provides a convenient way to define LUA_PATH and
> +# LUA_CPATH variables.
> +#
> +# Example usage:
> +#
> +# make_lua_path(LUA_PATH
> +# PATH
> +# ${CMAKE_CURRENT_SOURCE_DIR}/?.lua
> +# ${CMAKE_BINARY_DIR}/?.lua
> +# ./?.lua
> +# )
> +#
> +# This will give you the string:
> +# "./?.lua;${CMAKE_BINARY_DIR}/?.lua;${CMAKE_CURRENT_SOURCE_DIR}/?.lua;;"
> +# XXX: Mind the reverse order of the entries in the result string.
> +
> +function(make_lua_path path)
> + set(prefix ARG)
> + set(noValues)
> + set(singleValues)
> + set(multiValues PATHS)
> +
> + # FIXME: if we update to CMake >= 3.5, can remove this line.
I would replace comment with condition that will check CMake version
and will fail when CMake >= 3.5:
|if (CMAKE_VERSION VERSION_GREATER_EQUAL 35) |
message(FATAL_ERROR "Please remove snippet for CMake < 3.5")
endif()
> + include(CMakeParseArguments)
> + cmake_parse_arguments(${prefix}
> + "${noValues}"
> + "${singleValues}"
> + "${multiValues}"
> + ${ARGN})
> +
> + # XXX: This is the sentinel semicolon having special meaning
> + # for LUA_PATH and LUA_CPATH variables. For more info, see the
> + # link below:
> + #https://www.lua.org/manual/5.1/manual.html#pdf-LUA_PATH
> + set(result "\;")
> +
> + foreach(inc ${ARG_PATHS})
> + # XXX: If one joins two strings with semicolon, the value
> + # automatically becomes a list. I found a single working
> + # solution to make result variable be a string via "escaping"
> + # the semicolon right in string interpolation.
> + set(result "${inc}\;${result}")
> + endforeach()
> +
> + set(${path} "${result}" PARENT_SCOPE)
> +endfunction()
> diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
> index ba25af54..a8262b12 100644
> --- a/test/CMakeLists.txt
> +++ b/test/CMakeLists.txt
> @@ -3,6 +3,8 @@
> # See the rationale in the root CMakeLists.txt.
> cmake_minimum_required(VERSION 3.1 FATAL_ERROR)
>
> +include(MakeLuaPath)
> +
> find_program(LUACHECK luacheck)
> if(LUACHECK)
> # XXX: The tweak below relates to luacheck problem with paths.
> diff --git a/test/PUC-Rio-Lua-5.1-tests/CMakeLists.txt b/test/PUC-Rio-Lua-5.1-tests/CMakeLists.txt
> index 8e825f55..b95e7852 100644
> --- a/test/PUC-Rio-Lua-5.1-tests/CMakeLists.txt
> +++ b/test/PUC-Rio-Lua-5.1-tests/CMakeLists.txt
> @@ -14,7 +14,11 @@ cmake_minimum_required(VERSION 3.1 FATAL_ERROR)
> #https://github.com/tarantool/tarantool/issues/5744
> # Hence, there is no way other than set LUA_PATH environment
> # variable as proposed in the first case.
> -set(LUA_PATH "?\;${CMAKE_CURRENT_SOURCE_DIR}/?.lua")
> +make_lua_path(LUA_PATH
> + PATHS
> + ${CMAKE_CURRENT_SOURCE_DIR}/?.lua
> + "?"
> +)
>
> # Establish PUC-Rio-Lua-5.1-tests-prepare target that contains
> # rules for <libs/*> libraries compilation and creates <libs/P1>
> @@ -38,7 +42,7 @@ add_custom_command(TARGET PUC-Rio-Lua-5.1-tests
> COMMENT "Running PUC-Rio Lua 5.1 tests"
> COMMAND
> env
> - LUA_PATH="${LUA_PATH}\;\;"
> + LUA_PATH="${LUA_PATH}"
> ${LUAJIT_TEST_COMMAND} ${CMAKE_CURRENT_SOURCE_DIR}/all.lua
> WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
> )
> diff --git a/test/lua-Harness-tests/CMakeLists.txt b/test/lua-Harness-tests/CMakeLists.txt
> index 12476171..a57104a5 100644
> --- a/test/lua-Harness-tests/CMakeLists.txt
> +++ b/test/lua-Harness-tests/CMakeLists.txt
> @@ -10,10 +10,16 @@ if(NOT PROVE)
> return()
> endif()
>
> -# Tests create temporary files (see 303-package.t and 411-luajit.t for
> -# example) to require. Also, they require some files from original test
> -# source directory.
> -set(LUA_PATH "./?.lua\;${CMAKE_CURRENT_SOURCE_DIR}/?.lua\;${LUAJIT_SOURCE_DIR}/?.lua\;${LUAJIT_BINARY_DIR}/?.lua")
> +# Tests create temporary files (see 303-package.t and 411-luajit.t
> +# for example) to be required. Also, they require some files from
> +# the original test source directory.
> +make_lua_path(LUA_PATH
> + PATHS
> + ${CMAKE_CURRENT_SOURCE_DIR}/?.lua
> + ${LUAJIT_BINARY_DIR}/?.lua
> + ${LUAJIT_SOURCE_DIR}/?.lua
> + ./?.lua
> +)
> set(LUA_TEST_FLAGS --failures --shuffle)
>
> if(CMAKE_VERBOSE_MAKEFILE)
> @@ -25,7 +31,7 @@ add_custom_command(TARGET lua-Harness-tests
> COMMENT "Running lua-Harness tests"
> COMMAND
> env
> - LUA_PATH="${LUA_PATH}\;"
> + LUA_PATH="${LUA_PATH}"
> ${PROVE} ${CMAKE_CURRENT_SOURCE_DIR}
> --exec '${LUAJIT_TEST_COMMAND} -l profile_luajit21'
> --jobs ${CMAKE_BUILD_PARALLEL_LEVEL}
> diff --git a/test/tarantool-tests/CMakeLists.txt b/test/tarantool-tests/CMakeLists.txt
> index ecda2e63..27866869 100644
> --- a/test/tarantool-tests/CMakeLists.txt
> +++ b/test/tarantool-tests/CMakeLists.txt
> @@ -43,14 +43,11 @@ macro(BuildTestCLib lib sources)
> # semicolon. If one finds the normal way to make it work, feel
> # free to reach me.
> set(TESTLIBS "${lib};${TESTLIBS}" PARENT_SCOPE)
> - # Add the directory where the lib is built to the LUA_CPATH
> - # environment variable, so LuaJIT can find and load it.
> - # XXX: Here we see the other side of the coin. If one joins two
> - # strings with semicolon, the value automatically becomes a
> - # list. I found a single working solution to make LUA_CPATH be
> - # a string via "escaping" the semicolon right in string
> - # interpolation.
> - set(LUA_CPATH "${CMAKE_CURRENT_BINARY_DIR}/?${CMAKE_SHARED_LIBRARY_SUFFIX}\;${LUA_CPATH}" PARENT_SCOPE)
> + # Add the directory where the lib is built to the list with
> + # entries for LUA_CPATH environment variable, so LuaJIT can find
> + # and load it. See the comment about extending the list in the
> + # parent scope few lines above.
> + set(LUA_CPATHS "${CMAKE_CURRENT_BINARY_DIR}/?${CMAKE_SHARED_LIBRARY_SUFFIX};${LUA_CPATHS}" PARENT_SCOPE)
> # Also add this directory to LD_LIBRARY_PATH environment
> # variable, so FFI machinery can find and load it.
> set(LD_LIBRARY_PATH "${CMAKE_CURRENT_BINARY_DIR}:${LD_LIBRARY_PATH}" PARENT_SCOPE)
> @@ -76,14 +73,21 @@ add_subdirectory(misclib-sysprof-capi)
> # in src/ directory and auxiliary tests-related modules are
> # located in the current directory (but tests are run in the
> # binary directory), so LUA_PATH need to be updated.
> -set(LUA_PATH
> - "${CMAKE_CURRENT_SOURCE_DIR}/?.lua\;${PROJECT_SOURCE_DIR}/tools/?.lua\;${PROJECT_SOURCE_DIR}/src/?.lua"
> +make_lua_path(LUA_PATH
> + PATHS
> + ${CMAKE_CURRENT_SOURCE_DIR}/?.lua
> + ${PROJECT_SOURCE_DIR}/tools/?.lua
> + ${PROJECT_SOURCE_DIR}/src/?.lua
> )
> +# Update LUA_CPATH with the library paths collected within
> +# <BuildTestLib> macro.
> +make_lua_path(LUA_CPATH PATHS ${LUA_CPATHS})
> +
> set(LUA_TEST_SUFFIX .test.lua)
> set(LUA_TEST_FLAGS --failures --shuffle)
> set(LUA_TEST_ENV
> - "LUA_PATH=\"${LUA_PATH}\;\;\""
> - "LUA_CPATH=\"${LUA_CPATH}\;\;\""
> + "LUA_PATH=\"${LUA_PATH}\""
> + "LUA_CPATH=\"${LUA_CPATH}\""
> )
>
> if(CMAKE_VERBOSE_MAKEFILE)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.tarantool.org/pipermail/tarantool-patches/attachments/20220815/05756c00/attachment.htm>
More information about the Tarantool-patches
mailing list