From 5b9a5493c5151fe326b495c944687fc690598ef5 Mon Sep 17 00:00:00 2001
From: James Rowe <jroweboy@gmail.com>
Date: Thu, 26 Mar 2015 04:00:49 -0600
Subject: [PATCH] Updated the copy commands to run on post_build and use
 generator expressions to simplify the code as well

---
 CMakeLists.txt              | 16 +++++------
 src/citra_qt/CMakeLists.txt | 53 ++++++++++++++++++-------------------
 2 files changed, 34 insertions(+), 35 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 64907a271..5cae66dec 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -12,29 +12,29 @@ else()
     add_definitions(/D_CRT_SECURE_NO_WARNINGS)
     # set up output paths for executable binaries (.exe-files, and .dll-files on DLL-capable platforms)
     set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
-    set(CMAKE_CONFIGURATION_TYPES Debug Release RelWithDebInfo CACHE TYPE INTERNAL)
+    set(CMAKE_CONFIGURATION_TYPES Debug Release RelWithDebInfo CACHE STRING "" FORCE)
 
     # Tweak optimization settings
     # As far as I can tell, there's no way to override the CMake defaults while leaving user
     # changes intact, so we'll just clobber everything and say sorry.
     message(STATUS "Cache compiler flags ignored, please edit CMakeLists.txt to change the flags.")
-    # /MP - Multi-threaded compilation
-    # /Ox - Full optimization
+    # /O2 - Optimization level 2
     # /Oy- - Don't omit frame pointer
     # /GR- - Disable RTTI
     # /GS- - No stack buffer overflow checks
     # /EHsc - C++-only exception handling semantics
-    set(optimization_flags "/MP /Ox /Oy- /GR- /GS- /EHsc")
+    set(optimization_flags "/O2 /Oy- /GR- /GS- /EHsc")
+    # /MP - Multi-threaded compilation
     # /Zi - Output debugging information
     # /Zo - enahnced debug info for optimized builds
     # /MDd - Multi-threaded Debug Runtime DLL
     set(CMAKE_C_FLAGS_DEBUG   "/MP /MDd /Zi" CACHE STRING "" FORCE)
     set(CMAKE_CXX_FLAGS_DEBUG "/MP /MDd /Zi" CACHE STRING "" FORCE)
     # /MD - Multi-threaded runtime DLL
-    set(CMAKE_C_FLAGS_RELEASE   "${optimization_flags} /MD" CACHE STRING "" FORCE)
-    set(CMAKE_CXX_FLAGS_RELEASE "${optimization_flags} /MD" CACHE STRING "" FORCE)
-    set(CMAKE_C_FLAGS_RELWITHDEBINFO   "${optimization_flags} /MD /Zi /Zo" CACHE STRING "" FORCE)
-    set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${optimization_flags} /MD /Zi /Zo" CACHE STRING "" FORCE)
+    set(CMAKE_C_FLAGS_RELEASE   "${optimization_flags} /MP /MD" CACHE STRING "" FORCE)
+    set(CMAKE_CXX_FLAGS_RELEASE "${optimization_flags} /MP /MD" CACHE STRING "" FORCE)
+    set(CMAKE_C_FLAGS_RELWITHDEBINFO   "${optimization_flags} /MP /MD /Zi /Zo" CACHE STRING "" FORCE)
+    set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${optimization_flags} /MP /MD /Zi /Zo" CACHE STRING "" FORCE)
     
     set(CMAKE_EXE_LINKER_FLAGS_DEBUG "/DEBUG" CACHE STRING "" FORCE)
     set(CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO "/DEBUG" CACHE STRING "" FORCE)
diff --git a/src/citra_qt/CMakeLists.txt b/src/citra_qt/CMakeLists.txt
index 23513d7e2..2545b5d6a 100644
--- a/src/citra_qt/CMakeLists.txt
+++ b/src/citra_qt/CMakeLists.txt
@@ -77,34 +77,33 @@ target_link_libraries(citra-qt ${PLATFORM_LIBRARIES})
 
 if (Qt5_FOUND AND MSVC)
     set(Qt5_DLL_DIR "${Qt5_DIR}/../../../bin")
-    file(GLOB Qt5_DEBUG_DLLS
-        "${Qt5_DLL_DIR}/icudt*.dll"
-        "${Qt5_DLL_DIR}/icuin*.dll"
-        "${Qt5_DLL_DIR}/icuuc*.dll"
-        "${Qt5_DLL_DIR}/Qt5Cored.*"
-        "${Qt5_DLL_DIR}/Qt5Guid.*"
-        "${Qt5_DLL_DIR}/Qt5OpenGLd.*"
-        "${Qt5_DLL_DIR}/Qt5Widgetsd.*"
+    set(Qt5_PLATFORMS_DIR "${Qt5_DIR}/../../../plugins/platforms/")
+    set(Qt5_DLLS
+        icudt*.dll
+        icuin*.dll
+        icuuc*.dll
+        Qt5Core$<$<CONFIG:Debug>:d>.*
+        Qt5Gui$<$<CONFIG:Debug>:d>.*
+        Qt5OpenGL$<$<CONFIG:Debug>:d>.*
+        Qt5Widgets$<$<CONFIG:Debug>:d>.*
     )
-    file(GLOB Qt5_RELEASE_DLLS
-        "${Qt5_DLL_DIR}/icudt*.dll"
-        "${Qt5_DLL_DIR}/icuin*.dll"
-        "${Qt5_DLL_DIR}/icuuc*.dll"
-        "${Qt5_DLL_DIR}/Qt5Core.*"
-        "${Qt5_DLL_DIR}/Qt5Gui.*"
-        "${Qt5_DLL_DIR}/Qt5OpenGL.*"
-        "${Qt5_DLL_DIR}/Qt5Widgets.*"
+    set(DLL_DEST "${CMAKE_BINARY_DIR}/bin/$<CONFIG>/")
+    set(PLATFORMS ${DLL_DEST}platforms/)
+    
+    # windows commandline expects the / to be \ so switch them
+    string(REPLACE "/" "\\" Qt5_DLL_DIR ${Qt5_DLL_DIR})
+    string(REPLACE "/" "\\" Qt5_PLATFORMS_DIR ${Qt5_PLATFORMS_DIR})
+    string(REPLACE "/" "\\" DLL_DEST ${DLL_DEST})
+    string(REPLACE "/" "\\" PLATFORMS ${PLATFORMS})
+    
+    # /NJH /NJS /NDL /NFL /NC /NS /NP - Silence any output
+    # cmake adds an extra check for command success which doesn't work too well with robocopy 
+    # so trick it into thinking the command was successful with the || cmd /c "exit /b 0"
+    add_custom_command(TARGET citra-qt POST_BUILD
+        COMMAND robocopy ${Qt5_DLL_DIR} ${DLL_DEST} ${Qt5_DLLS} /NJH /NJS /NDL /NFL /NC /NS /NP || cmd /c "exit /b 0"
+        COMMAND if not exist ${PLATFORMS} mkdir ${PLATFORMS} 2> nul
+        COMMAND robocopy ${Qt5_PLATFORMS_DIR} ${PLATFORMS} qwindows$<$<CONFIG:Debug>:d>.* /NJH /NJS /NDL /NFL /NC /NS /NP || cmd /c "exit /b 0"
     )
-    # make the output directories ahead of the time and copy in the needed Dlls now
-    file(MAKE_DIRECTORY
-        ${CMAKE_BINARY_DIR}/bin/Debug/
-        ${CMAKE_BINARY_DIR}/bin/Release/
-        ${CMAKE_BINARY_DIR}/bin/RelWithDebInfo/
-    )
-    file(COPY ${Qt5_DEBUG_DLLS} DESTINATION ${CMAKE_BINARY_DIR}/bin/Debug/)
-    file(COPY ${Qt5_RELEASE_DLLS} DESTINATION ${CMAKE_BINARY_DIR}/bin/Release/)
-    file(COPY ${Qt5_RELEASE_DLLS} DESTINATION ${CMAKE_BINARY_DIR}/bin/RelWithDebInfo/)
-    unset(Qt5_RELEASE_DLLS)
-    unset(Qt5_DEBUG_DLLS)
+    unset(Qt5_DLLS)
     unset(Qt5_DLL_DIR)
 endif()