Merge pull request #10620 from phire/cmake_win_fixes

Various fixes for msvc/cmake builds
This commit is contained in:
Admiral H. Curtiss
2022-05-22 03:08:17 +02:00
committed by GitHub
56 changed files with 348 additions and 87 deletions
+4 -49
View File
@@ -18,62 +18,17 @@ if(CMAKE_SYSTEM_NAME MATCHES "Windows")
add_definitions(-D_SILENCE_CXX20_OLD_SHARED_PTR_ATOMIC_SUPPORT_DEPRECATION_WARNING)
endif()
if (MSVC)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX20_STANDARD_COMPILE_OPTION "-std:c++latest")
else()
if (NOT MSVC)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
endif()
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
if (MSVC)
# TODO: Use https://cmake.org/cmake/help/latest/policy/CMP0092.html instead (once we can require CMake >= 3.15)
# Taken from http://www.cmake.org/Wiki/CMake_FAQ#Dynamic_Replace.
foreach(flag_var
CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
MAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
# Replaces /W3 with /W4 in defaults (add_compile_options would cause very annoying warnings here)
string(REPLACE "/W3" "/W4" ${flag_var} "${${flag_var}}")
endforeach()
# Disable some warnings
add_compile_options(
/wd4201 # nonstandard extension used : nameless struct/union
/wd4127 # conditional expression is constant
/wd4100 # 'identifier' : unreferenced formal parameter
/wd4200 # InputCommon fix temp.
/wd4244 # 'conversion' conversion from 'type1' to 'type2', possible loss of data
/wd4121 # 'symbol' : alignment of a member was sensitive to packing
/wd4324 # Padding was added at the end of a structure because you specified a __declspec(align) value.
/wd4714 # function 'function' marked as __forceinline not inlined
/wd4351 # new behavior: elements of array 'array' will be default initialized
# TODO: Enable this warning once possible
/wd4245 # conversion from 'type1' to 'type2', signed/unsigned mismatch
# Currently jits use some annoying code patterns which makes this common
)
# Additional warnings
add_compile_options(
/w44263 # Non-virtual member function hides base class virtual function
/w44265 # Class has virtual functions, but destructor is not virtual
)
# Treat all warnings as errors
add_compile_options(/WX)
# All files are encoded as UTF-8
add_compile_options(/utf-8)
# Use PCH
# Compile PCH
add_subdirectory(PCH)
add_definitions(/I${PCH_DIRECTORY})
add_definitions(/Yu${PCH_PATH})
# Don't include timestamps in binaries
add_link_options(/Brepro)
else()
check_and_add_flag(HAVE_WALL -Wall)
# TODO: would like these but they produce overwhelming amounts of warnings
+5
View File
@@ -83,3 +83,8 @@ PRIVATE
cubeb
SoundTouch
FreeSurround)
if(MSVC)
# Add precompiled header
target_link_libraries(audiocommon PRIVATE use_pch)
endif()
+11 -1
View File
@@ -287,7 +287,7 @@ if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
endif()
if(CMAKE_SYSTEM_NAME STREQUAL "Windows")
target_sources(common PUBLIC HRWrap.h HRWrap.cpp)
target_sources(common PRIVATE HRWrap.h HRWrap.cpp)
endif()
if(USE_UPNP)
@@ -308,3 +308,13 @@ if(UNIX)
elseif(WIN32)
target_link_libraries(common PRIVATE "-INCLUDE:enableCompatPatches")
endif()
if(MSVC)
# Add precompiled header
target_link_libraries(common PRIVATE use_pch)
# We need to disable PCH for this one file, because it's C and our PCH is C++
set_source_files_properties(
${CMAKE_CURRENT_SOURCE_DIR}/ImageC.c
PROPERTIES COMPILE_FLAGS "/Y- /I${CMAKE_SOURCE_DIR}/Source/PCH/nopch")
endif()
+5
View File
@@ -702,3 +702,8 @@ if(UNIX)
MemoryWatcher.h
)
endif()
if(MSVC)
# Add precompiled header
target_link_libraries(core PRIVATE use_pch)
endif()
+5
View File
@@ -77,3 +77,8 @@ PRIVATE
pugixml
ZLIB::ZLIB
)
if(MSVC)
# Add precompiled header
target_link_libraries(discio PRIVATE use_pch)
endif()
+5
View File
@@ -26,6 +26,11 @@ PRIVATE
cpp-optparse
)
if(MSVC)
# Add precompiled header
target_link_libraries(dolphin-nogui PRIVATE use_pch)
endif()
if(USE_DISCORD_PRESENCE)
target_compile_definitions(dolphin-nogui PRIVATE -DUSE_DISCORD_PRESENCE)
endif()
+17 -4
View File
@@ -382,9 +382,6 @@ if (WIN32)
endif()
if (MSVC)
# Don't propogate warnings in qt headers to Dolphin
target_compile_options(dolphin-emu PRIVATE /experimental:external)
target_compile_options(dolphin-emu PRIVATE /external:W0)
set(qtGui "")
set(qtGuiPriv "")
set(qtWidgetsPriv "")
@@ -394,6 +391,15 @@ if (MSVC)
target_compile_options(dolphin-emu PRIVATE "${qtGui}")
target_compile_options(dolphin-emu PRIVATE "${qtGuiPriv}")
target_compile_options(dolphin-emu PRIVATE "${qtWidgets}")
if ("${QT_VERSION_MAJOR}" GREATER_EQUAL 6)
# Qt6 requires RTTI
remove_cxx_flag_from_target(dolphin-emu "/GR-")
target_compile_options(dolphin-emu PRIVATE "/GR")
else()
# Add precompiled header
target_link_libraries(audiocommon PRIVATE use_pch)
endif()
endif()
if(WIN32)
@@ -430,6 +436,13 @@ if(WIN32)
get_filename_component(QT_BINARY_DIRECTORY "${MOC_EXECUTABLE_LOCATION}" DIRECTORY)
find_program(WINDEPLOYQT_EXE windeployqt HINTS "${QT_BINARY_DIRECTORY}")
if ("${QT_VERSION_MAJOR}" LESS 6)
set(NO_ANGLE_PARAM "--no-angle")
else()
# parameter no longer exists in Qt6
set(NO_ANGLE_PARAM "")
endif()
# Note: We set the PATH for the duration of this command so that the
# deployment application is able to locate the Qt libraries to copy.
# if the necessary paths aren't already set beforehand.
@@ -452,7 +465,7 @@ if(WIN32)
--no-translations
--no-compiler-runtime
--no-system-d3d-compiler
--no-angle
"${NO_ANGLE_PARAM}"
--no-opengl-sw
"$<TARGET_FILE:dolphin-emu>"
)
+5
View File
@@ -19,5 +19,10 @@ PRIVATE
cpp-optparse
)
if(MSVC)
# Add precompiled header
target_link_libraries(dolphin-tool PRIVATE use_pch)
endif()
set(CPACK_PACKAGE_EXECUTABLES ${CPACK_PACKAGE_EXECUTABLES} dolphin-tool)
install(TARGETS dolphin-tool RUNTIME DESTINATION ${bindir})
+5
View File
@@ -205,3 +205,8 @@ if(ENABLE_SDL)
message(STATUS "SDL NOT found, disabling SDL input")
endif()
endif()
if(MSVC)
# Add precompiled header
target_link_libraries(inputcommon PRIVATE use_pch)
endif()
+5
View File
@@ -68,3 +68,8 @@ if(USE_DISCORD_PRESENCE)
target_compile_definitions(uicommon PRIVATE -DUSE_DISCORD_PRESENCE)
target_link_libraries(uicommon PRIVATE discord-rpc)
endif()
if(MSVC)
# Add precompiled header
target_link_libraries(uicommon PRIVATE use_pch)
endif()
+6 -1
View File
@@ -10,4 +10,9 @@ target_link_libraries(updatercommon PRIVATE
ZLIB::ZLIB
ed25519
cpp-optparse
)
)
if(MSVC)
# Add precompiled header
target_link_libraries(updatercommon PRIVATE use_pch)
endif()
@@ -29,3 +29,8 @@ PUBLIC
videocommon
videod3dcommon
)
if(MSVC)
# Add precompiled header
target_link_libraries(videod3d PRIVATE use_pch)
endif()
@@ -35,3 +35,8 @@ PUBLIC
videocommon
videod3dcommon
)
if(MSVC)
# Add precompiled header
target_link_libraries(videod3d12 PRIVATE use_pch)
endif()
@@ -12,3 +12,8 @@ PUBLIC
common
videocommon
)
if(MSVC)
# Add precompiled header
target_link_libraries(videod3dcommon PRIVATE use_pch)
endif()
@@ -17,3 +17,8 @@ PUBLIC
common
videocommon
)
if(MSVC)
# Add precompiled header
target_link_libraries(videonull PRIVATE use_pch)
endif()
@@ -33,3 +33,8 @@ PUBLIC
PRIVATE
${X11_LIBRARIES}
)
if(MSVC)
# Add precompiled header
target_link_libraries(videoogl PRIVATE use_pch)
endif()
@@ -41,3 +41,8 @@ PUBLIC
common
videocommon
)
if(MSVC)
# Add precompiled header
target_link_libraries(videosoftware PRIVATE use_pch)
endif()
@@ -62,3 +62,8 @@ SYSTEM PRIVATE
${CMAKE_SOURCE_DIR}/Externals/glslang/SPIRV
${CMAKE_SOURCE_DIR}/Externals/glslang
)
if(MSVC)
# Add precompiled header
target_link_libraries(videovulkan PRIVATE use_pch)
endif()
+5
View File
@@ -180,3 +180,8 @@ if(FFmpeg_FOUND)
)
endif()
endif()
if(MSVC)
# Add precompiled header
target_link_libraries(videocommon PRIVATE use_pch)
endif()
+5
View File
@@ -12,3 +12,8 @@ target_link_libraries(winupdater PRIVATE
)
set_target_properties(winupdater PROPERTIES OUTPUT_NAME "Updater")
if(MSVC)
# Add precompiled header
target_link_libraries(winupdater PRIVATE use_pch)
endif()
+42 -5
View File
@@ -1,6 +1,43 @@
add_library(pch pch.h pch.cpp)
set(PCH_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
set(PCH_NAME ${PCH.pch})
target_compile_options(pch PUBLIC /Ycpch.h /Fp${PCH_DIRECTORY}/${PCH_NAME})
# The PCH that dolphin uses for MSVC is non-standard;
# Instead of having one PCH per module, dolphin has one PCH shared between all modules.
# So we need to implement PCH manually, rather than using the PCH support built into cmake
add_library(build_pch pch.h pch.cpp)
# fmt/format.h is included in the PCH
target_link_libraries(pch PUBLIC fmt::fmt)
target_link_libraries(build_pch PUBLIC fmt::fmt)
# pch.cpp should be compiled with the /Yc command, which creates the precompiled header
target_compile_options(build_pch PRIVATE /Ycpch.h)
# /Fp sets the location of the PCH. By forcing it to a fixed location, all modules
# will share this one PCH. We give it a fixed name so we can depend on it later
target_compile_options(build_pch PUBLIC /Fp$<TARGET_FILE_DIR:build_pch>/dolphin.pch )
# Sharing a PCH breaks pdb files. So we use the /Z7 option to inline the pdb into
# the binary. That also requires us to disable minimal rebuilds.
target_compile_options(build_pch PUBLIC /Z7 /Gm-)
# To get this working with ninja, we need to tell it that compiling pch.cpp generates an extra output
set_source_files_properties(${CMAKE_CURRENT_SOURCE_DIR}/pch.cpp PROPERTIES
OBJECT_OUTPUTS $<TARGET_FILE_DIR:build_pch>/dolphin.pch
)
# and then create a custom target that depends on the pch output
# so that ninja won't start building anything that depends on this
# target before the pch is built
add_custom_target(force_build_pch
DEPENDS $<TARGET_FILE_DIR:build_pch>/dolphin.pch
)
# linking against this interface libary will cause targets to enable PCH
add_library(use_pch INTERFACE)
target_link_libraries(use_pch INTERFACE build_pch)
# targets which use the pch need these compile options
# /Yu - Use precompiled header named "pch.h"
# /FI - Force include "pch.h" at top of every source file
target_compile_options(use_pch INTERFACE /Yupch.h /FIpch.h)
# For ninja, we need to depend on force_build_pch
add_dependencies(use_pch force_build_pch)
+4
View File
@@ -0,0 +1,4 @@
// dummy include to help with disabling pch for a single file
// cmake doesn't provide a clean way to disable MSVC's force include option
// So we can just point it at an empty file instead.