From 967900e2e9031ac77cf50ef9d9b15e60fb8c4d3e Mon Sep 17 00:00:00 2001
From: Leonid Yuriev <leo@yuriev.ru>
Date: Tue, 3 Sep 2019 19:13:26 +0300
Subject: [PATCH] mdbx-cmake: refine/fix MDBX_BUILD_TARGET for Windows.

---
 cmake/compiler.cmake      | 32 +++++++++++++++++++-------------
 src/CMakeLists.txt        | 23 +++++++++++++++++------
 src/elements/version.c.in |  9 +++++++--
 3 files changed, 43 insertions(+), 21 deletions(-)

diff --git a/cmake/compiler.cmake b/cmake/compiler.cmake
index e58aae64..709e1d25 100644
--- a/cmake/compiler.cmake
+++ b/cmake/compiler.cmake
@@ -152,37 +152,43 @@ endif()
 
 if(CMAKE_COMPILER_IS_ELBRUSC OR CMAKE_SYSTEM_PROCESSOR MATCHES "e2k.*|E2K.*|elbrus.*|ELBRUS.*")
   set(E2K TRUE)
-elseif(MSVC64 OR MINGW64)
+  set(CMAKE_SYSTEM_ARCH "Elbrus")
+elseif((MSVC64 OR MINGW64) AND CMAKE_SIZEOF_VOID_P EQUAL 8)
   set(X86_64 TRUE)
+  set(CMAKE_SYSTEM_ARCH "x86_64")
 elseif(MINGW OR (MSVC AND NOT CMAKE_CROSSCOMPILING))
   set(X86_32 TRUE)
+  set(CMAKE_SYSTEM_ARCH "x86")
 elseif(CMAKE_COMPILER_IS_ELBRUSC OR CMAKE_SYSTEM_PROCESSOR MATCHES "e2k.*|E2K.*|elbrus.*|ELBRUS.*")
   set(E2K TRUE)
-elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "amd64.*|x86_64.*|AMD64.*")
+  set(CMAKE_SYSTEM_ARCH "Elbrus")
+elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "amd64.*|x86_64.*|AMD64.*" AND CMAKE_SIZEOF_VOID_P EQUAL 8)
   set(X86_64 TRUE)
+  set(CMAKE_SYSTEM_ARCH "x86_64")
 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "i686.*|i386.*|x86.*")
   set(X86_32 TRUE)
-elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(aarch64.*|AARCH64.*|ARM64.*)")
+  set(CMAKE_SYSTEM_ARCH "x86")
+elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(aarch64.*|AARCH64.*|ARM64.*)" AND CMAKE_SIZEOF_VOID_P EQUAL 8)
   set(AARCH64 TRUE)
+  set(CMAKE_SYSTEM_ARCH "ARM64")
 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(arm.*|ARM.*)")
   set(ARM32 TRUE)
-elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)64le.*")
+  set(CMAKE_SYSTEM_ARCH "ARM")
+elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)64le.*" AND CMAKE_SIZEOF_VOID_P EQUAL 8)
   set(PPC64LE TRUE)
-elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)64.*")
+  set(CMAKE_SYSTEM_ARCH "PPC64LE")
+elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)64.*" AND CMAKE_SIZEOF_VOID_P EQUAL 8)
   set(PPC64 TRUE)
+  set(CMAKE_SYSTEM_ARCH "PPC64")
 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc).*")
   set(PPC32 TRUE)
-elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(mips|MIPS)64.*")
+  set(CMAKE_SYSTEM_ARCH "PPC")
+elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(mips|MIPS)64.*" AND CMAKE_SIZEOF_VOID_P EQUAL 8)
   set(MIPS64 TRUE)
+  set(CMAKE_SYSTEM_ARCH "MIPS64")
 elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(mips|MIPS).*")
   set(MIPS32 TRUE)
-endif()
-
-# Workaround for 32-bit operating systems on 64-bit x86_64 processor
-if(X86_64 AND CMAKE_SIZEOF_VOID_P EQUAL 4 AND NOT FORCE_X86_64)
-  message(STATUS "sizeof(void) = 4 on x86 / x86_64 processor. Assume 32-bit compilation mode (X86=1)")
-  unset(X86_64)
-  set(X86_32 TRUE)
+  set(CMAKE_SYSTEM_ARCH "MIPS")
 endif()
 
 if(MSVC)
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 5545a098..41e04fd0 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -154,12 +154,23 @@ endif()
 string(STRIP "${CMAKE_C_COMPILER_ID}-${CMAKE_C_COMPILER_VERSION}${MDBX_BUILD_COMPILER}" MDBX_BUILD_COMPILER)
 
 # make a build-target triplet
-if(CMAKE_CONFIGURATION_TYPES)
-  # via per-configuration define
-  add_definitions(-DMDBX_BUILD_TARGET="${CMAKE_SYSTEM_PROCESSOR}-${CMAKE_SYSTEM_NAME}-$<CONFIG>")
-  set(MDBX_BUILD_TARGET "MDBX_BUILD_TARGET")
+if(CMAKE_C_COMPILER_TARGET)
+  set(MDBX_BUILD_TARGET "${CMAKE_C_COMPILER_TARGET}")
+elseif(CMAKE_C_PLATFORM_ID AND NOT CMAKE_C_PLATFORM_ID STREQUAL CMAKE_SYSTEM_NAME)
+  string(STRIP "${CMAKE_C_PLATFORM_ID}-${CMAKE_SYSTEM_NAME}" MDBX_BUILD_TARGET)
+elseif(CMAKE_LIBRARY_ARCHITECTURE)
+  string(STRIP "${CMAKE_LIBRARY_ARCHITECTURE}-${CMAKE_SYSTEM_NAME}" MDBX_BUILD_TARGET)
+elseif(CMAKE_GENERATOR_PLATFORM AND NOT CMAKE_C_PLATFORM_ID STREQUAL CMAKE_SYSTEM_NAME)
+  string(STRIP "${CMAKE_GENERATOR_PLATFORM}-${CMAKE_SYSTEM_NAME}" MDBX_BUILD_TARGET)
+elseif(CMAKE_SYSTEM_ARCH)
+  string(STRIP "${CMAKE_SYSTEM_ARCH}-${CMAKE_SYSTEM_NAME}" MDBX_BUILD_TARGET)
 else()
-  string(STRIP "${CMAKE_SYSTEM_PROCESSOR}-${CMAKE_SYSTEM_NAME}-${CMAKE_BUILD_TYPE}" MDBX_BUILD_TARGET)
+  string(STRIP "${CMAKE_SYSTEM_PROCESSOR}-${CMAKE_SYSTEM_NAME}" MDBX_BUILD_TARGET)
+endif()
+if(CMAKE_CONFIGURATION_TYPES)
+  add_definitions(-DMDBX_BUILD_CONFIG="$<CONFIG>")
+else()
+  add_definitions(-DMDBX_BUILD_CONFIG="${CMAKE_BUILD_TYPE}")
 endif()
 
 # options
@@ -196,7 +207,7 @@ endforeach(item)
 configure_file("${CMAKE_CURRENT_SOURCE_DIR}/elements/version.c.in"
   "${CMAKE_CURRENT_BINARY_DIR}/version.c" ESCAPE_QUOTES)
 configure_file("${CMAKE_CURRENT_SOURCE_DIR}/elements/config.h.in"
-  "${CMAKE_CURRENT_BINARY_DIR}/mdbx-config.h")
+  "${CMAKE_CURRENT_BINARY_DIR}/mdbx-config.h" ESCAPE_QUOTES)
 
 target_compile_definitions(mdbx PRIVATE MDBX_CONFIG_H="${CMAKE_CURRENT_BINARY_DIR}/mdbx-config.h")
 
diff --git a/src/elements/version.c.in b/src/elements/version.c.in
index ce02bcac..a73a4a28 100644
--- a/src/elements/version.c.in
+++ b/src/elements/version.c.in
@@ -36,5 +36,10 @@
      "@MDBX_GIT_DESCRIBE@"}};
 
 /*LIBMDBX_API*/ const mdbx_build_info mdbx_build = {
-    "@MDBX_BUILD_TIMESTAMP@", "${MDBX_BUILD_TARGET}", "@MDBX_OPTIONS_STRING@",
-    "@MDBX_BUILD_COMPILER@", "${MDBX_COMPILE_FLAGS}"};
+    "@MDBX_BUILD_TIMESTAMP@",
+    "${MDBX_BUILD_TARGET}"
+#ifdef DMDBX_BUILD_CONFIG
+    "-" DMDBX_BUILD_CONFIG
+#endif
+    ,
+    "@MDBX_OPTIONS_STRING@", "@MDBX_BUILD_COMPILER@", "${MDBX_COMPILE_FLAGS}"};