diff --git a/CMake/FlagsOverride.cmake b/CMake/FlagsOverride.cmake index 39c55aa62a..d52cf4b153 100644 --- a/CMake/FlagsOverride.cmake +++ b/CMake/FlagsOverride.cmake @@ -1,7 +1,11 @@ if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") - foreach(f CMAKE_C_FLAGS_DEBUG CMAKE_CXX_FLAGS_DEBUG CMAKE_C_FLAGS_RELWITHDEBINFO CMAKE_CXX_FLAGS_RELWITHDEBINFO) - if("${${f}}" MATCHES "/Zi") - string(REGEX REPLACE "/Zi" "/Z7" "${f}" "${${f}}") - endif() - endforeach() -endif() \ No newline at end of file + # The default MSVC flags for Release and RelWithDebInfo are poorly chosen + # (see issue https://gitlab.kitware.com/cmake/cmake/-/issues/20812) + # By default, inlining is disabled for RelWithDebInfo. + # Manually redefine MSVC flags to match Visual Studio defaults + # and ensure that Release builds generate debug info. + foreach(f CMAKE_C_FLAGS_RELWITHDEBINFO CMAKE_C_FLAGS_RELEASE CMAKE_CXX_FLAGS_RELWITHDEBINFO CMAKE_CXX_FLAGS_RELEASE) + # optimize, define NDEBUG, generate debug info + set(${f} "/O2 /DNDEBUG /Z7") + endforeach() +endif() diff --git a/CMakeLists.txt b/CMakeLists.txt index 06137c57e0..e1565844e4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -124,11 +124,6 @@ if (WIN32) elseif (CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64") string(APPEND CMAKE_RUNTIME_OUTPUT_DIRECTORY /ARM64) endif() - - set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}) - set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}) - set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_MINSIZEREL ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}) - set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}) endif() # setup CCache @@ -240,6 +235,12 @@ if(CMAKE_C_COMPILER_ID MATCHES "MSVC") check_and_add_flag(EXCEPTIONS /EHsc) dolphin_compile_definitions(_DEBUG DEBUG_ONLY) + # Enable function-level linking + add_compile_options(/Gy) + # Generate intrinsic functions + add_compile_options(/Oi) + # Disable buffer security check + add_compile_options(/GS-) # Enforce C++ standard conforming conversion rules to catch possible bugs add_compile_options(/permissive-) # Remove unreferenced inline functions/data to reduce link time and catch bugs @@ -259,6 +260,10 @@ if(CMAKE_C_COMPILER_ID MATCHES "MSVC") ) string(APPEND CMAKE_EXE_LINKER_FLAGS " /NXCOMPAT") + # Generate debug data + string(APPEND CMAKE_EXE_LINKER_FLAGS " /DEBUG") + # Eliminate dead code and data + string(APPEND CMAKE_EXE_LINKER_FLAGS " /OPT:REF /OPT:ICF") else() add_definitions(-D_DEFAULT_SOURCE) @@ -327,10 +332,15 @@ if(CMAKE_SYSTEM_NAME MATCHES "Darwin") endif() if(ENABLE_LTO) - check_and_add_flag(LTO -flto) - if(CMAKE_CXX_COMPILER_ID STREQUAL GNU) - set(CMAKE_AR gcc-ar) - set(CMAKE_RANLIB gcc-ranlib) + if(CMAKE_C_COMPILER_ID MATCHES "MSVC") + add_compile_options(/GL) + string(APPEND CMAKE_EXE_LINKER_FLAGS " /LTCG") + else() + check_and_add_flag(LTO -flto) + if(CMAKE_CXX_COMPILER_ID STREQUAL GNU) + set(CMAKE_AR gcc-ar) + set(CMAKE_RANLIB gcc-ranlib) + endif() endif() endif() @@ -844,6 +854,8 @@ include_directories("${PROJECT_BINARY_DIR}/Source/Core") # if(ENABLE_TESTS) message(STATUS "Using static gtest from Externals") + # Force gtest to link the C runtime dynamically on Windows in order to avoid runtime mismatches. + set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) add_subdirectory(Externals/gtest EXCLUDE_FROM_ALL) else() message(STATUS "Unit tests are disabled") diff --git a/Source/Core/DolphinQt/CMakeLists.txt b/Source/Core/DolphinQt/CMakeLists.txt index 41b24a9c26..13c9a3d79a 100644 --- a/Source/Core/DolphinQt/CMakeLists.txt +++ b/Source/Core/DolphinQt/CMakeLists.txt @@ -370,6 +370,11 @@ if(WIN32) COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_SOURCE_DIR}/Data/Sys" "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/Sys" ) + # Copy license.txt + add_custom_command(TARGET dolphin-emu POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_SOURCE_DIR}/license.txt" "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/license.txt" + ) + # Copy qt.conf add_custom_command(TARGET dolphin-emu POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_SOURCE_DIR}/qt.conf.win" "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/qt.conf" @@ -401,6 +406,9 @@ if(WIN32) $,--debug,--release> --no-translations --no-compiler-runtime + --no-system-d3d-compiler + --no-angle + --no-opengl-sw "$" ) endif() @@ -423,7 +431,11 @@ if(GETTEXT_MSGFMT_EXECUTABLE) foreach(po ${LINGUAS}) get_filename_component(lang ${po} NAME_WE) - set(mo_dir ${CMAKE_CURRENT_BINARY_DIR}/${lang}) + if(WIN32) + set(mo_dir ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/Languages/${lang}) + else() + set(mo_dir ${CMAKE_CURRENT_BINARY_DIR}/${lang}) + endif() set(mo ${mo_dir}/dolphin-emu.mo) target_sources(dolphin-emu PRIVATE ${mo}) @@ -439,7 +451,6 @@ if(GETTEXT_MSGFMT_EXECUTABLE) add_custom_command(OUTPUT ${mo} COMMAND ${CMAKE_COMMAND} -E make_directory ${mo_dir} COMMAND ${GETTEXT_MSGFMT_EXECUTABLE} -o ${mo} ${po} - COMMAND ${CMAKE_COMMAND} -E copy ${mo} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/Languages/${lang}/dolphin-emu.mo DEPENDS ${po} ) else()