compilerconfig.cmake 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. # OBS CMake Windows compiler configuration module
  2. include_guard(GLOBAL)
  3. include(ccache)
  4. include(compiler_common)
  5. if(ENABLE_CCACHE AND CCACHE_PROGRAM)
  6. if(CMAKE_C_COMPILER_ID STREQUAL "MSVC")
  7. file(COPY_FILE ${CCACHE_PROGRAM} "${CMAKE_CURRENT_BINARY_DIR}/cl.exe")
  8. set(
  9. CMAKE_VS_GLOBALS
  10. "CLToolExe=cl.exe"
  11. "CLToolPath=${CMAKE_BINARY_DIR}"
  12. "TrackFileAccess=false"
  13. "UseMultiToolTask=true"
  14. )
  15. # Ccache does not support debug information stored in program database (PDB) files
  16. set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT Embedded)
  17. elseif(CMAKE_C_COMPILER_ID STREQUAL "Clang")
  18. file(COPY_FILE ${CCACHE_PROGRAM} "${CMAKE_CURRENT_BINARY_DIR}/clang-cl.exe")
  19. set(
  20. CMAKE_VS_GLOBALS
  21. "CLToolExe=clang-cl.exe"
  22. "CLToolPath=${CMAKE_BINARY_DIR}"
  23. "TrackFileAccess=false"
  24. "UseMultiToolTask=true"
  25. )
  26. endif()
  27. endif()
  28. # CMake 3.24 introduces a bug mistakenly interpreting MSVC as supporting the '-pthread' compiler flag
  29. if(CMAKE_VERSION VERSION_EQUAL 3.24.0)
  30. set(THREADS_HAVE_PTHREAD_ARG FALSE)
  31. endif()
  32. # CMake 3.25 changed the way symbol generation is handled on Windows
  33. if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.25.0)
  34. if(CMAKE_C_COMPILER_ID STREQUAL "MSVC")
  35. set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT ProgramDatabase)
  36. else()
  37. set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT Embedded)
  38. endif()
  39. endif()
  40. message(DEBUG "Current Windows API version: ${CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION}")
  41. if(CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION_MAXIMUM)
  42. message(DEBUG "Maximum Windows API version: ${CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION_MAXIMUM}")
  43. endif()
  44. if(CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION VERSION_LESS 10.0.20348)
  45. message(
  46. FATAL_ERROR
  47. "OBS requires Windows SDK version 10.0.20348.0 or more recent.\n"
  48. "Please download and install the most recent Windows SDK."
  49. )
  50. endif()
  51. set(_obs_msvc_c_options /MP /Zc:__cplusplus /Zc:preprocessor)
  52. set(_obs_msvc_cpp_options /MP /Zc:__cplusplus /Zc:preprocessor)
  53. if(CMAKE_CXX_STANDARD GREATER_EQUAL 20)
  54. list(APPEND _obs_msvc_cpp_options /Zc:char8_t-)
  55. endif()
  56. add_compile_options(
  57. /W3
  58. /utf-8
  59. /Brepro
  60. /permissive-
  61. "$<$<COMPILE_LANG_AND_ID:C,MSVC>:${_obs_msvc_c_options}>"
  62. "$<$<COMPILE_LANG_AND_ID:CXX,MSVC>:${_obs_msvc_cpp_options}>"
  63. "$<$<COMPILE_LANG_AND_ID:C,Clang>:${_obs_clang_c_options}>"
  64. "$<$<COMPILE_LANG_AND_ID:CXX,Clang>:${_obs_clang_cxx_options}>"
  65. $<$<NOT:$<CONFIG:Debug>>:/Gy>
  66. $<$<NOT:$<CONFIG:Debug>>:/Oi>
  67. )
  68. add_compile_definitions(
  69. NOMINMAX
  70. UNICODE
  71. _UNICODE
  72. _CRT_SECURE_NO_WARNINGS
  73. _CRT_NONSTDC_NO_WARNINGS
  74. $<$<CONFIG:DEBUG>:DEBUG>
  75. $<$<CONFIG:DEBUG>:_DEBUG>
  76. )
  77. # Visual Studio sets "/LTCG:INCREMENTAL" when "Whole Program Optimization" is enabled for a x86 or x64 target. To
  78. # ensure "proper" link-time optimization, the LTCG flag has to be explicitly added here.
  79. add_link_options(
  80. $<$<OR:$<CONFIG:Release>,$<CONFIG:MinSizeRel>>:/LTCG>
  81. $<$<OR:$<CONFIG:Release>,$<CONFIG:MinSizeRel>>:/OPT:REF>
  82. $<$<OR:$<CONFIG:Release>,$<CONFIG:MinSizeRel>>:/OPT:ICF>
  83. /DEBUG
  84. /Brepro
  85. )
  86. if(CMAKE_COMPILE_WARNING_AS_ERROR)
  87. add_link_options(/WX)
  88. endif()