compilerconfig.cmake 3.0 KB

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