From 20374b2a3d09c4caa621bfb2e50ca9e1d2022916 Mon Sep 17 00:00:00 2001
From: Daniel Lyubomirov <dennislt@gmail.com>
Date: Fri, 12 Jun 2020 21:39:39 +0300
Subject: [PATCH] Fix windows build

---
 cpp/CMakeLists.txt                        | 29 +++++++++++++++--------
 cpp/src/CMakeLists.txt                    | 25 +++++++++++++++----
 cpp/src/csandbox.cc                       |  2 --
 cpp/src/vereign/restapi/post_result.hh    |  6 +++++
 cpp/tests/integration/integration_test.cc |  2 +-
 cpp/vendor/CMakeLists.txt                 | 21 +++++++++-------
 cpp/vendor/boost.cmake                    |  2 +-
 cpp/vendor/grpc.cmake                     |  7 ++++++
 8 files changed, 67 insertions(+), 27 deletions(-)

diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt
index 81ddf56..b347034 100644
--- a/cpp/CMakeLists.txt
+++ b/cpp/CMakeLists.txt
@@ -29,18 +29,25 @@ else()
 endif()
 
 if (CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
-  add_definitions(-D_WIN32_WINNT=0x0601)
-  set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Release>:Release>")
-  set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
+  # add_definitions(-D_WIN32_WINNT=0x0601)
+  add_definitions(-D_WIN32_WINNT=0x0A00)
+
+  # set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreadedDLL$<$<CONFIG:Release>:Release>")
+  # set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreadedDLL$<$<CONFIG:Debug>:Debug>")
+
+  set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreadedDLL")
+  if (CMAKE_BUILD_TYPE STREQUAL "Debug")
+    set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreadedDebugDLL")
+  endif()
 
   set(CMAKE_C_FLAGS "/DNDEBUG /DWIN32 /D_WINDOWS /W3")
   set(CMAKE_CXX_FLAGS "/DNDEBUG /DWIN32 /D_WINDOWS /W3 /GR /EHsc")
 
-  set(CMAKE_C_FLAGS_DEBUG "/MTd /Zi /Ob0 /Od /RTC1")
-  set(CMAKE_CXX_FLAGS_DEBUG "/MTd /Zi /Ob0 /Od /RTC1")
+  set(CMAKE_C_FLAGS_DEBUG "/MDd /Zi /Ob0 /Od /RTC1")
+  set(CMAKE_CXX_FLAGS_DEBUG "/MDd /Zi /Ob0 /Od /RTC1")
 
-  set(CMAKE_CXX_FLAGS_RELEASE "/Gd /MT /O2 /Oi /Ot /Gy /Zi /GL")
-  set(CMAKE_C_FLAGS_RELEASE "/Gd /MT /O2 /Oi /Ot /Gy /Zi /GL")
+  set(CMAKE_CXX_FLAGS_RELEASE "/Gd /MD /O2 /Oi /Ot /Gy /Zi /GL")
+  set(CMAKE_C_FLAGS_RELEASE "/Gd /MD /O2 /Oi /Ot /Gy /Zi /GL")
 
   if (CMAKE_BUILD_TYPE STREQUAL "Release")
     set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /DEBUG /OPT:REF /OPT:ICF /LTCG")
@@ -64,7 +71,7 @@ endif()
 
 set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
 
-set(CMAKE_CXX_STANDARD 14)
+set(CMAKE_CXX_STANDARD 17)
 set(CMAKE_CXX_EXTENSIONS OFF)
 
 message("Generator: " "${CMAKE_GENERATOR}")
@@ -81,7 +88,8 @@ message("CXX dll linker flags: " "${CMAKE_SHARED_LINKER_FLAGS}")
 message("CXX static linker flags: " "${CMAKE_STATIC_LINKER_FLAGS}")
 
 string(TOLOWER "${CMAKE_BUILD_TYPE}" _build_type)
-set(VENDOR_INSTALL_DIR ${CMAKE_SOURCE_DIR}/cmake-install-vendor-${_build_type} CACHE STRING "vendor directory")
+set(VENDOR_INSTALL_DIR ${CMAKE_SOURCE_DIR}/cmake-install-vendor-debug CACHE STRING "vendor directory")
+# set(VENDOR_INSTALL_DIR ${CMAKE_SOURCE_DIR}/cmake-install-vendor-${_build_type} CACHE STRING "vendor directory")
 message(STATUS "Using vendor install dir: ${VENDOR_INSTALL_DIR}")
 #set(VENDOR_INSTALL_DIR /home/daniel/workspace/local)
 set(_cmake_prefix_paths
@@ -109,7 +117,7 @@ find_package(
   1.72.0
   EXACT
   REQUIRED
-  COMPONENTS regex thread system
+  COMPONENTS regex thread system date_time
 )
 
 find_package(Protobuf CONFIG REQUIRED)
@@ -161,6 +169,7 @@ message(STATUS "summary of build options:
     EXE_LINKER_FLAGS: ${CMAKE_EXE_LINKER_FLAGS_${_build_type}} ${CMAKE_EXE_LINKER_FLAGS}
     WARNCFLAGS:       ${WARNCFLAGS}
     CXX1XCXXFLAGS:    ${CXX1XCXXFLAGS}
+    CMAKE_MSVC_RUNTIME_LIBRARY: ${CMAKE_MSVC_RUNTIME_LIBRARY}
   Libs:
     fmt:            ${fmt_FOUND} [${fmt_VERSION}] (DIR='${fmt_DIR}')
     OpenSSL:        ${OpenSSL_FOUND} [${OPENSSL_VERSION}] (LIBS='${OPENSSL_LIBRARIES}')
diff --git a/cpp/src/CMakeLists.txt b/cpp/src/CMakeLists.txt
index 20c17f3..ed74694 100644
--- a/cpp/src/CMakeLists.txt
+++ b/cpp/src/CMakeLists.txt
@@ -2,11 +2,15 @@ if (fmt_FOUND)
   get_target_property(FMT_INCLUDE_DIR fmt::fmt INTERFACE_INCLUDE_DIRECTORIES)
 endif()
 
+if (CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
+  add_definitions(-DNOGDI)
+endif()
+
 include_directories(
   ${CMAKE_CURRENT_BINARY_DIR}
   ${CMAKE_SOURCE_DIR}/src
   ${VENDOR_INSTALL_DIR}/include
-  ${VENDOR_INSTALL_DIR}/boost/include
+  ${Boost_INCLUDE_DIRS}
   ${FMT_INCLUDE_DIR}
   ${CMAKE_SOURCE_DIR}/proto/cpp
 )
@@ -55,7 +59,10 @@ list(APPEND VEREIGNLIB_SRC ${GENERATED_SERVICES_SRC})
 
 add_library(vereignlib STATIC ${VEREIGNLIB_SRC})
 set_property(TARGET vereignlib PROPERTY POSITION_INDEPENDENT_CODE ON)
-target_link_libraries(vereignlib PRIVATE nlohmann_json::nlohmann_json)
+target_link_libraries(vereignlib PRIVATE
+  nlohmann_json::nlohmann_json
+  fmt::fmt
+)
 target_link_libraries(vereignlib PUBLIC
   vereignproto
   gRPC::grpc++_reflection
@@ -68,7 +75,14 @@ add_library(vereign SHARED
 target_include_directories(vereign
   PRIVATE ${CMAKE_SOURCE_DIR}/include
 )
-target_link_libraries(vereign PRIVATE vereignlib)
+target_link_libraries(vereign PRIVATE
+  vereignlib
+  $<$<CXX_COMPILER_ID:MSVC>:Boost::date_time>
+)
+if (CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
+  # Set the DLLEXPORT variable to export symbols
+  target_compile_definitions(vereign PRIVATE WIN_EXPORT)
+endif()
 
 set(csandbox_sources
   csandbox.cc
@@ -80,7 +94,10 @@ set(csandbox_sources
 add_executable(csandbox ${csandbox_sources})
 
 target_link_libraries(csandbox
-  vereign
+  PRIVATE vereignlib
+  $<$<CXX_COMPILER_ID:MSVC>:Boost::date_time>
+  # Boost::thread
+  # vereign
   # fmt::fmt
   # Boost::regex
   # Threads::Threads
diff --git a/cpp/src/csandbox.cc b/cpp/src/csandbox.cc
index 7a1eb95..561cf21 100644
--- a/cpp/src/csandbox.cc
+++ b/cpp/src/csandbox.cc
@@ -1,6 +1,4 @@
-#include <iostream>
 
 auto main(int argc, char* argv[]) -> int {
-  std::cout << "hello" << std::endl;
   return 0;
 }
diff --git a/cpp/src/vereign/restapi/post_result.hh b/cpp/src/vereign/restapi/post_result.hh
index 6d31f5b..a975f0e 100644
--- a/cpp/src/vereign/restapi/post_result.hh
+++ b/cpp/src/vereign/restapi/post_result.hh
@@ -12,12 +12,18 @@ struct PostResult {
   RequestPtr Request;
   ResponsePtr Response;
 
+  PostResult()
+    : Request{nullptr},
+      Response{nullptr}
+  {}
+
   PostResult(RequestPtr req, ResponsePtr resp)
     : Request{std::move(req)},
       Response{std::move(resp)}
   {}
 
   PostResult(PostResult&& other) = default;
+  PostResult& operator=(PostResult&& other) = default;
 
   PostResult(const PostResult&) = delete;
   PostResult& operator=(const PostResult&) = delete;
diff --git a/cpp/tests/integration/integration_test.cc b/cpp/tests/integration/integration_test.cc
index d89c6d2..dddb58f 100644
--- a/cpp/tests/integration/integration_test.cc
+++ b/cpp/tests/integration/integration_test.cc
@@ -107,7 +107,7 @@ TEST_CASE("vereign_service_start") {
   SECTION("invalid listen address") {
     vereign_error* err = nullptr;
     auto service = vereign_service_start(
-      "invalid",
+      "##$$",
       "",
       "",
       "",
diff --git a/cpp/vendor/CMakeLists.txt b/cpp/vendor/CMakeLists.txt
index 79268ff..3f64020 100644
--- a/cpp/vendor/CMakeLists.txt
+++ b/cpp/vendor/CMakeLists.txt
@@ -1,26 +1,29 @@
 cmake_minimum_required (VERSION 3.16.5)
 
-if(WIN32)
+if (WIN32)
   set(CMAKE_IGNORE_PATH "C:/Strawberry/c/bin")
 endif()
 
 project (vereign-vendor)
 
-if(CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
+if (CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
   add_definitions(-D_WIN32_WINNT=0x0601)
 
   set(CMAKE_C_FLAGS "/DNDEBUG /DWIN32 /D_WINDOWS /W3")
   set(CMAKE_CXX_FLAGS "/DNDEBUG /DWIN32 /D_WINDOWS /W3 /GR /EHsc")
 
-  set(CMAKE_C_FLAGS_DEBUG "/MTd /Zi /Ob0 /Od /RTC1")
-  set(CMAKE_CXX_FLAGS_DEBUG "/MTd /Zi /Ob0 /Od /RTC1")
+  set(CMAKE_C_FLAGS_DEBUG "/MDd /Zi /Ob0 /Od /RTC1")
+  set(CMAKE_CXX_FLAGS_DEBUG "/MDd /Zi /Ob0 /Od /RTC1")
 
-  set(CMAKE_CXX_FLAGS_RELEASE "/Gd /MT /O2 /Oi /Ot /Gy /Zi /GL")
-  set(CMAKE_C_FLAGS_RELEASE "/Gd /MT /O2 /Oi /Ot /Gy /Zi /GL")
+  set(CMAKE_CXX_FLAGS_RELEASE "/Gd /MD /O2 /Oi /Ot /Gy /Zi /GL")
+  set(CMAKE_C_FLAGS_RELEASE "/Gd /MD /O2 /Oi /Ot /Gy /Zi /GL")
 
-  set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded")
-  if(CMAKE_BUILD_TYPE STREQUAL "Debug")
-    set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreadedDebug")
+  set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Release>:Release>")
+  set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>DLL")
+
+  set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreadedDLL")
+  if (CMAKE_BUILD_TYPE STREQUAL "Debug")
+    set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreadedDebugDLL")
   endif()
 endif()
 
diff --git a/cpp/vendor/boost.cmake b/cpp/vendor/boost.cmake
index e0dfc1c..430902d 100644
--- a/cpp/vendor/boost.cmake
+++ b/cpp/vendor/boost.cmake
@@ -1,6 +1,6 @@
 include(ExternalProject)
 
-set(_boost_libs regex system thread)
+set(_boost_libs regex system thread date_time)
 
 if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
   list(TRANSFORM _boost_libs PREPEND --with-)
diff --git a/cpp/vendor/grpc.cmake b/cpp/vendor/grpc.cmake
index db85269..a33a809 100644
--- a/cpp/vendor/grpc.cmake
+++ b/cpp/vendor/grpc.cmake
@@ -18,6 +18,13 @@ ExternalProject_Add(grpclib
   -DCMAKE_CXX_COMPILER:STRING=${CMAKE_CXX_COMPILER}
   -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
   -DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE}
+  -DCMAKE_MSVC_RUNTIME_LIBRARY:STRING=${CMAKE_MSVC_RUNTIME_LIBRARY}
+  -DCMAKE_C_FLAGS:STRING=${CMAKE_C_FLAGS}
+  -DCMAKE_CXX_FLAGS:STRING=${CMAKE_CXX_FLAGS}
+  -DCMAKE_C_FLAGS_DEBUG:STRING=${CMAKE_C_FLAGS_DEBUG}
+  -DCMAKE_CXX_FLAGS_DEBUG:STRING=${CMAKE_CXX_FLAGS_DEBUG}
+  -DCMAKE_C_FLAGS_RELEASE:STRING=${CMAKE_C_FLAGS_RELEASE}
+  -DCMAKE_CXX_FLAGS_RELEASE:STRING=${CMAKE_CXX_FLAGS_RELEASE}
   -DBUILD_SHARED_LIBS:BOOL=OFF
   -DgRPC_SSL_PROVIDER:STRING=package
   -DOPENSSL_USE_STATIC_LIBS:BOOL=ON
-- 
GitLab