From 67aa21505aac5dfbb79571e5d67c3c0c775f7845 Mon Sep 17 00:00:00 2001 From: Roman Tsisyk <roman@tsisyk.com> Date: Wed, 3 Feb 2016 11:02:51 +0300 Subject: [PATCH] Review fixes for #1085 * Detect multilib directories properly * Remove duplicates from package.path/package.cpath * Increase priority of tarantool/ prefixes * Add Debian and Gentoo specific folders --- CMakeLists.txt | 70 ++++++++++++++++++++++++-------------------- cmake/multilib.cmake | 25 ++++++++++++++++ src/lua/init.c | 4 +-- 3 files changed, 66 insertions(+), 33 deletions(-) create mode 100644 cmake/multilib.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index f8588b87f7..f3529ed216 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -193,42 +193,50 @@ set(MODULE_SUFFIX "tarantool") set(MODULE_LIBDIR "${CMAKE_INSTALL_LIBDIR}/${MODULE_SUFFIX}") set(MODULE_LUADIR "${CMAKE_INSTALL_DATADIR}/${MODULE_SUFFIX}") set(MODULE_INCLUDEDIR "${CMAKE_INSTALL_INCLUDEDIR}/${MODULE_SUFFIX}") - -foreach(dir - LIBDIR - LUADIR - INCLUDEDIR - ) - if(NOT IS_ABSOLUTE ${MODULE_${dir}}) - set(MODULE_FULL_${dir} "${CMAKE_INSTALL_PREFIX}/${MODULE_${dir}}") - else() - set(MODULE_FULL_${dir} "${MODULE_${dir}}") - endif() -endforeach() - -list(APPEND MODULE_LUAPATH "${MODULE_FULL_LUADIR}/?.lua") -list(APPEND MODULE_LUAPATH "${MODULE_FULL_LUADIR}/?/init.lua") +set(MODULE_FULL_LIBDIR "${CMAKE_INSTALL_FULL_LIBDIR}/${MODULE_SUFFIX}") +set(MODULE_FULL_LUADIR "${CMAKE_INSTALL_FULL_DATADIR}/${MODULE_SUFFIX}") +set(MODULE_FULL_INCLUDEDIR "${CMAKE_INSTALL_FULL_INCLUDEDIR}/${MODULE_SUFFIX}") + +include(cmake/multilib.cmake) + +set(_datadirs) +list(APPEND _datadirs "/usr/local/share") # LuaRocks +list(APPEND _datadirs "${CMAKE_INSTALL_FULL_DATADIR}") # Install prefix +if(NOT CMAKE_CROSSCOMPILING AND EXISTS "/etc/gentoo-release") + # LuaRocks on Gentoo + list(APPEND _datadirs "/usr/${MULTILIB}/lua/luarocks/share") +endif() +list(APPEND _datadirs "/usr/share") # System packages +list(REMOVE_DUPLICATES _datadirs) +set(MODULE_LUAPATH) foreach(dir - "lua/luarocks/share/lua/5.1" - "lua/5.1") - list(APPEND MODULE_LUAPATH "/usr/${CMAKE_INSTALL_LIBDIR}/${dir}/?.lua") - list(APPEND MODULE_LUAPATH "/usr/${CMAKE_INSTALL_LIBDIR}/${dir}/?/init.lua") + "${MODULE_SUFFIX}" + "lua/5.1") + foreach(prefix IN LISTS _datadirs) + list(APPEND MODULE_LUAPATH "${prefix}/${dir}/?.lua") + list(APPEND MODULE_LUAPATH "${prefix}/${dir}/?/init.lua") + endforeach() endforeach() -list(APPEND MODULE_LIBPATH "${MODULE_FULL_LIBDIR}/?${CMAKE_SHARED_MODULE_SUFFIX}") -if (NOT ${CMAKE_INSTALL_PREFIX} STREQUAL "/usr" AND - NOT ${CMAKE_INSTALL_PREFIX} STREQUAL "/usr/local") - list(APPEND MODULE_LIBPATH "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}") +set(_libdirs) +list(APPEND _libdirs "/usr/local/${MULTILIB}") # LuaRocks +list(APPEND _libdirs "${CMAKE_INSTALL_FULL_LIBDIR}") # Install prefix +if(NOT CMAKE_CROSSCOMPILING AND EXISTS "/etc/debian_version") + # gh-1085: LuaRocks on Debian uses lib instead of lib/x86_64-linux-gnu/ + list(APPEND _libdirs "/usr/local/lib") # LuaRocks on Debian endif() - +if(NOT CMAKE_CROSSCOMPILING AND EXISTS "/etc/gentoo-release") + # LuaRocks on Gentoo + list(APPEND _libdirs "/usr/${MULTILIB}/lua/luarocks/lib") +endif() +list(APPEND _libdirs "/usr/${MULTILIB}") # System packages +list(REMOVE_DUPLICATES _libdirs) +set(MODULE_LIBPATH) foreach(dir - "/usr/local" - "/usr") - foreach(lua_lib - "lua/luarocks/lib/lua/5.1" - "lua/5.1") - list(APPEND MODULE_LIBPATH - "${dir}/${CMAKE_INSTALL_LIBDIR}/${lua_lib}/?${CMAKE_SHARED_MODULE_SUFFIX}") + "${MODULE_SUFFIX}" + "lua/5.1") + foreach(prefix IN LISTS _libdirs) + list(APPEND MODULE_LIBPATH "${prefix}/${dir}/?${CMAKE_SHARED_MODULE_SUFFIX}") endforeach() endforeach() diff --git a/cmake/multilib.cmake b/cmake/multilib.cmake new file mode 100644 index 0000000000..fce4478459 --- /dev/null +++ b/cmake/multilib.cmake @@ -0,0 +1,25 @@ +if(DEFINED MULTILIB) + return() +endif() + +set(_MULTILIB lib) +# Comment from GNUInstallDirs.cmake: +# Override this default 'lib' with 'lib64' iff: +# - we are on Linux system but NOT cross-compiling +# - we are NOT on debian +# - we are on a 64 bits system +# reason is: amd64 ABI: http://www.x86-64.org/documentation/abi.pdf +# For Debian with multiarch, use 'lib/${CMAKE_LIBRARY_ARCHITECTURE}' if +# CMAKE_LIBRARY_ARCHITECTURE is set (which contains e.g. "i386-linux-gnu" +if(CMAKE_SYSTEM_NAME MATCHES "^(Linux|kFreeBSD|GNU)$" AND + NOT CMAKE_CROSSCOMPILING) + if (EXISTS "/etc/debian_version" AND CMAKE_LIBRARY_ARCHITECTURE) + # Debian + set(_MULTILIB "lib/${CMAKE_LIBRARY_ARCHITECTURE}") + elseif(DEFINED CMAKE_SIZEOF_VOID_P AND "${CMAKE_SIZEOF_VOID_P}" EQUAL "8") + # Not debian, rely on CMAKE_SIZEOF_VOID_P: + set(_MULTILIB "lib64") + endif() +endif() + +set(MULTILIB "${_MULTILIB}" CACHE PATH "multilib suffix") diff --git a/src/lua/init.c b/src/lua/init.c index 7ce799b42c..949b65f2de 100644 --- a/src/lua/init.c +++ b/src/lua/init.c @@ -282,7 +282,7 @@ tarantool_lua_setpaths(struct lua_State *L) lua_pushliteral(L, "/.luarocks/share/lua/?/init.lua;"); } lua_pushliteral(L, MODULE_LUAPATH ";"); - lua_getfield(L, top, "path"); + /* overwrite standard paths */ lua_concat(L, lua_gettop(L) - top); lua_setfield(L, top, "path"); @@ -294,7 +294,7 @@ tarantool_lua_setpaths(struct lua_State *L) lua_pushliteral(L, "/.luarocks/lib/lua/?." TARANTOOL_LIBEXT ";"); } lua_pushliteral(L, MODULE_LIBPATH ";"); - lua_getfield(L, top, "cpath"); + /* overwrite standard paths */ lua_concat(L, lua_gettop(L) - top); lua_setfield(L, top, "cpath"); -- GitLab