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