CompilerConfig.cmake 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. include(CheckCCompilerFlag)
  2. include(CheckCXXCompilerFlag)
  3. set(CMAKE_CXX_STANDARD 17)
  4. set(CMAKE_CXX_STANDARD_REQUIRED ON)
  5. set(CMAKE_CXX_EXTENSIONS OFF)
  6. # CMake < 3.21 only goes up to 11, but it's mostly identical to 17 anyway.
  7. if(${CMAKE_VERSION} VERSION_LESS "3.21.0")
  8. set(CMAKE_C_STANDARD 11)
  9. set(CMAKE_C_STANDARD_REQUIRED ON)
  10. else()
  11. set(CMAKE_C_STANDARD 17)
  12. set(CMAKE_C_STANDARD_REQUIRED ON)
  13. endif()
  14. # TODO/FIXME: Investigate disabling C extensions on Linux/POSIX
  15. if(OS_MACOS OR NOT OS_POSIX)
  16. set(CMAKE_C_EXTENSIONS OFF)
  17. endif()
  18. # Set compile options for MSVC
  19. if(OS_WINDOWS AND MSVC)
  20. if(NOT EXISTS "${CMAKE_BINARY_DIR}/ALL_BUILD.vcxproj.user")
  21. file(
  22. GENERATE
  23. OUTPUT "${CMAKE_BINARY_DIR}/ALL_BUILD.vcxproj.user"
  24. INPUT "${CMAKE_SOURCE_DIR}/cmake/bundle/windows/ALL_BUILD.vcxproj.user.in")
  25. endif()
  26. # CMake 3.24 introduces a bug mistakenly interpreting MSVC as supporting `-pthread`
  27. if(${CMAKE_VERSION} VERSION_EQUAL "3.24.0")
  28. set(THREADS_HAVE_PTHREAD_ARG OFF)
  29. endif()
  30. # Check for Win SDK version 10.0.20348 or above
  31. obs_status(STATUS "Windows API version is ${CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION}")
  32. string(REPLACE "." ";" WINAPI_VER "${CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION}")
  33. list(GET WINAPI_VER 0 WINAPI_VER_MAJOR)
  34. list(GET WINAPI_VER 1 WINAPI_VER_MINOR)
  35. list(GET WINAPI_VER 2 WINAPI_VER_BUILD)
  36. set(WINAPI_COMPATIBLE FALSE)
  37. if(WINAPI_VER_MAJOR EQUAL 10)
  38. if(WINAPI_VER_MINOR EQUAL 0)
  39. if(WINAPI_VER_BUILD GREATER_EQUAL 20348)
  40. set(WINAPI_COMPATIBLE TRUE)
  41. endif()
  42. else()
  43. set(WINAPI_COMPATIBLE TRUE)
  44. endif()
  45. elseif(WINAPI_VER_MAJOR GREATER 10)
  46. set(WINAPI_COMPATIBLE TRUE)
  47. endif()
  48. if(NOT WINAPI_COMPATIBLE)
  49. obs_status(FATAL_ERROR "OBS requires Windows 10 SDK version 10.0.20348.0 and above to compile.\n"
  50. "Please download the most recent Windows 10 SDK in order to compile.")
  51. endif()
  52. add_compile_options(
  53. /Brepro
  54. /MP
  55. /W3
  56. /WX
  57. /wd4127
  58. /wd4201
  59. /wd4456
  60. /wd4457
  61. /wd4458
  62. /wd4459
  63. /wd4595
  64. "$<$<CONFIG:DEBUG>:/DDEBUG=1;/D_DEBUG=1>"
  65. "$<$<CONFIG:RELWITHDEBINFO>:/Ob2>"
  66. /DUNICODE
  67. /D_UNICODE
  68. /D_CRT_SECURE_NO_WARNINGS
  69. /D_CRT_NONSTDC_NO_WARNINGS
  70. /utf-8
  71. /permissive-
  72. /Zc:__cplusplus
  73. /Zc:preprocessor)
  74. add_link_options(
  75. "LINKER:/Brepro" "LINKER:/OPT:REF" "LINKER:/WX" "$<$<NOT:$<EQUAL:${CMAKE_SIZEOF_VOID_P},8>>:LINKER\:/SAFESEH\:NO>"
  76. "$<$<CONFIG:DEBUG>:LINKER\:/INCREMENTAL\:NO>" "$<$<CONFIG:RELWITHDEBINFO>:LINKER\:/INCREMENTAL\:NO;/OPT:ICF>")
  77. else()
  78. find_program(CCACHE_PROGRAM "ccache")
  79. set(CCACHE_SUPPORT
  80. ON
  81. CACHE BOOL "Enable ccache support")
  82. mark_as_advanced(CCACHE_PROGRAM)
  83. if(CCACHE_PROGRAM AND CCACHE_SUPPORT)
  84. set(CMAKE_CXX_COMPILER_LAUNCHER "${CCACHE_PROGRAM}")
  85. set(CMAKE_C_COMPILER_LAUNCHER "${CCACHE_PROGRAM}")
  86. set(CMAKE_OBJC_COMPILER_LAUNCHER "${CCACHE_PROGRAM}")
  87. set(CMAKE_OBJCXX_COMPILER_LAUNCHER "${CCACHE_PROGRAM}")
  88. set(CMAKE_CUDA_COMPILER_LAUNCHER "${CCACHE_PROGRAM}") # CMake 3.9+
  89. endif()
  90. option(CALM_DEPRECATION "Keep deprecated-declarations as warnings" OFF)
  91. #[[
  92. Note about -Wmaybe-uninitialized on GCC, this warning seems to be subject of various regressions and false positives. This
  93. warning is set to not turn into an error.
  94. - https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105562 for 12.1.0
  95. - https://github.com/obsproject/obs-studio/issues/8850 for 13.1.1
  96. ]]
  97. add_compile_options(
  98. -Werror
  99. -Wextra
  100. -Wvla
  101. -Wswitch
  102. -Wno-error=switch
  103. -Wformat
  104. -Wformat-security
  105. -Wunused-parameter
  106. -Wno-unused-function
  107. -Wno-missing-field-initializers
  108. -fno-strict-aliasing
  109. "$<$<COMPILE_LANGUAGE:C>:-Werror-implicit-function-declaration;-Wno-missing-braces>"
  110. "$<$<BOOL:${USE_LIBCXX}>:-stdlib=libc++>"
  111. "$<$<CONFIG:DEBUG>:-DDEBUG=1;-D_DEBUG=1>"
  112. "$<$<COMPILE_LANG_AND_ID:CXX,AppleClang,Clang>:-Wnull-conversion;-fcolor-diagnostics;-Wno-error=shorten-64-to-32>"
  113. "$<$<COMPILE_LANG_AND_ID:C,AppleClang,Clang>:-Wnull-conversion;-fcolor-diagnostics;-Wno-error=shorten-64-to-32>"
  114. "$<$<COMPILE_LANG_AND_ID:CXX,GNU>:-Wconversion-null;-Wno-error=maybe-uninitialized>"
  115. "$<$<COMPILE_LANG_AND_ID:C,GNU>:-Wno-error=maybe-uninitialized>"
  116. "$<$<BOOL:${CALM_DEPRECATION}>:-Wno-error=deprecated-declarations>")
  117. # GCC on aarch64 emits type-limits warnings that do not appear on x86_64
  118. if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64")
  119. add_compile_options(-Wno-error=type-limits)
  120. endif()
  121. if(OBS_CODESIGN_LINKER)
  122. add_link_options("LINKER:$<$<PLATFORM_ID:Darwin>:-adhoc_codesign>")
  123. endif()
  124. if(MINGW)
  125. set(CMAKE_WIDL
  126. "widl"
  127. CACHE INTERNAL "wine IDL header file generation program")
  128. add_compile_definitions("_WIN32_WINNT=0x0600;WINVER=0x0600")
  129. endif()
  130. endif()
  131. if(MSVC_CXX_ARCHITECTURE_ID)
  132. string(TOLOWER ${MSVC_CXX_ARCHITECTURE_ID} LOWERCASE_CMAKE_SYSTEM_PROCESSOR)
  133. else()
  134. string(TOLOWER ${CMAKE_SYSTEM_PROCESSOR} LOWERCASE_CMAKE_SYSTEM_PROCESSOR)
  135. endif()
  136. if(LOWERCASE_CMAKE_SYSTEM_PROCESSOR MATCHES "(i[3-6]86|x86|x64|x86_64|amd64|e2k)")
  137. if(NOT MSVC AND NOT CMAKE_OSX_ARCHITECTURES STREQUAL "arm64")
  138. set(ARCH_SIMD_FLAGS -mmmx -msse -msse2)
  139. endif()
  140. elseif(LOWERCASE_CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)64(le)?")
  141. set(ARCH_SIMD_DEFINES -DNO_WARN_X86_INTRINSICS)
  142. set(ARCH_SIMD_FLAGS -mvsx)
  143. else()
  144. if(CMAKE_C_COMPILER_ID MATCHES "^(Apple)?Clang|GNU" OR CMAKE_CXX_COMPILER_ID MATCHES "^(Apple)?Clang|GNU")
  145. check_c_compiler_flag("-fopenmp-simd" C_COMPILER_SUPPORTS_OPENMP_SIMD)
  146. check_cxx_compiler_flag("-fopenmp-simd" CXX_COMPILER_SUPPORTS_OPENMP_SIMD)
  147. set(ARCH_SIMD_FLAGS
  148. -DSIMDE_ENABLE_OPENMP "$<$<AND:$<COMPILE_LANGUAGE:C>,$<BOOL:C_COMPILER_SUPPORTS_OPENMP_SIMD>>:-fopenmp-simd>"
  149. "$<$<AND:$<COMPILE_LANGUAGE:CXX>,$<BOOL:CXX_COMPILER_SUPPORTS_OPENMP_SIMD>>:-fopenmp-simd>")
  150. endif()
  151. endif()
  152. if(LOWERCASE_CMAKE_SYSTEM_PROCESSOR MATCHES "e2k")
  153. foreach(
  154. TEST_C_FLAG
  155. "-Wno-unused-parameter"
  156. "-Wno-ignored-qualifiers"
  157. "-Wno-pointer-sign"
  158. "-Wno-unused-variable"
  159. "-Wno-sign-compare"
  160. "-Wno-bad-return-value-type"
  161. "-Wno-maybe-uninitialized")
  162. check_c_compiler_flag(${TEST_C_FLAG} C_COMPILER_SUPPORTS_FLAG_${TEST_C_FLAG})
  163. if(C_COMPILER_SUPPORTS_FLAG_${TEST_C_FLAG})
  164. set(CMAKE_C_FLAGS ${CMAKE_C_FLAGS} ${TEST_C_FLAG})
  165. endif()
  166. endforeach()
  167. foreach(TEST_CXX_FLAG "-Wno-invalid-offsetof" "-Wno-maybe-uninitialized")
  168. check_cxx_compiler_flag(${TEST_CXX_FLAG} CXX_COMPILER_SUPPORTS_FLAG_${TEST_CXX_FLAG})
  169. if(CXX_COMPILER_SUPPORTS_FLAG_${TEST_CXX_FLAG})
  170. set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} ${TEST_CXX_FLAG})
  171. endif()
  172. endforeach()
  173. endif()