CompilerConfig.cmake 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  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. # Set compile options for MSVC
  7. if(OS_WINDOWS AND MSVC)
  8. if(NOT EXISTS "${CMAKE_BINARY_DIR}/ALL_BUILD.vcxproj.user")
  9. file(
  10. GENERATE
  11. OUTPUT "${CMAKE_BINARY_DIR}/ALL_BUILD.vcxproj.user"
  12. INPUT "${CMAKE_SOURCE_DIR}/cmake/bundle/windows/ALL_BUILD.vcxproj.user.in"
  13. )
  14. endif()
  15. # Check for Win SDK version 10.0.20348 or above
  16. if(MSVC_VERSION LESS 1920)
  17. message(
  18. INFO
  19. " + OBS-Studio - Windows API version is ${CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION}"
  20. )
  21. string(REPLACE "." ";" WINAPI_VER
  22. "${CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION}")
  23. list(GET WINAPI_VER 0 WINAPI_VER_MAJOR)
  24. list(GET WINAPI_VER 1 WINAPI_VER_MINOR)
  25. list(GET WINAPI_VER 2 WINAPI_VER_BUILD)
  26. set(WINAPI_COMPATIBLE FALSE)
  27. if(WINAPI_VER_MAJOR EQUAL 10)
  28. if(WINAPI_VER_MINOR EQUAL 0)
  29. if(WINAPI_VER_BUILD GREATER_EQUAL 20348)
  30. set(WINAPI_COMPATIBLE TRUE)
  31. endif()
  32. else()
  33. set(WINAPI_COMPATIBLE TRUE)
  34. endif()
  35. elseif(WINAPI_VER_MAJOR GREATER 10)
  36. set(WINAPI_COMPATIBLE TRUE)
  37. endif()
  38. if(NOT WINAPI_COMPATIBLE)
  39. message(
  40. FATAL_ERROR
  41. "OBS: OBS requires Windows 10 SDK version 10.0.20348.0 and above to compile.\n"
  42. " Please download the most recent Windows 10 SDK in order to compile (or update to Visual Studio 2019)."
  43. )
  44. endif()
  45. endif()
  46. add_compile_options(
  47. /MP
  48. /W3
  49. /wd4127
  50. /wd4201
  51. /wd4456
  52. /wd4457
  53. /wd4458
  54. /wd4459
  55. /wd4595
  56. "$<$<CONFIG:DEBUG>:/DDEBUG=1;/D_DEBUG=1>"
  57. "$<$<CONFIG:RELWITHDEBINFO>:/Ob2>"
  58. /DUNICODE
  59. /D_UNICODE
  60. /D_CRT_SECURE_NO_WARNINGS
  61. /D_CRT_NONSTDC_NO_WARNINGS)
  62. add_link_options(
  63. "LINKER:/OPT:REF"
  64. "$<$<NOT:$<EQUAL:${CMAKE_SIZEOF_VOID_P},8>>:LINKER\:/SAFESEH\:NO>"
  65. "$<$<CONFIG:DEBUG>:LINKER\:/INCREMENTAL\:NO>"
  66. "$<$<CONFIG:RELWITHDEBINFO>:LINKER\:/INCREMENTAL\:NO;/OPT:ICF>")
  67. else()
  68. find_program(CCACHE_PROGRAM "ccache")
  69. set(CCACHE_SUPPORT
  70. ON
  71. CACHE BOOL "Enable ccache support")
  72. mark_as_advanced(CCACHE_PROGRAM)
  73. if(CCACHE_PROGRAM AND CCACHE_SUPPORT)
  74. set(CMAKE_CXX_COMPILER_LAUNCHER "${CCACHE_PROGRAM}")
  75. set(CMAKE_C_COMPILER_LAUNCHER "${CCACHE_PROGRAM}")
  76. set(CMAKE_OBJC_COMPILER_LAUNCHER "${CCACHE_PROGRAM}")
  77. set(CMAKE_OBJCXX_COMPILER_LAUNCHER "${CCACHE_PROGRAM}")
  78. set(CMAKE_CUDA_COMPILER_LAUNCHER "${CCACHE_PROGRAM}") # CMake 3.9+
  79. endif()
  80. add_compile_options(
  81. -Wextra
  82. -Wvla
  83. -Wno-unused-function
  84. -Wno-missing-field-initializers
  85. -fno-strict-aliasing
  86. "$<$<COMPILE_LANGUAGE:C>:-Werror-implicit-function-declaration;-Wno-missing-braces>"
  87. "$<$<BOOL:${USE_LIBCXX}>:-stdlib=libc++>"
  88. "$<$<CONFIG:DEBUG>:-DDEBUG=1;-D_DEBUG=1>"
  89. "$<$<COMPILE_LANG_AND_ID:CXX,AppleClang,Clang>:-fcolor-diagnostics>"
  90. "$<$<COMPILE_LANG_AND_ID:C,AppleClang,Clang>:-fcolor-diagnostics>")
  91. if(OBS_CODESIGN_LINKER)
  92. add_link_options("LINKER:$<$<PLATFORM_ID:Darwin>:-adhoc_codesign>")
  93. endif()
  94. if(MINGW)
  95. set(CMAKE_WIDL
  96. "widl"
  97. CACHE INTERNAL "wine IDL header file generation program")
  98. add_compile_definitions("_WIN32_WINNT=0x0600;WINVER=0x0600")
  99. endif()
  100. endif()
  101. if(MSVC_CXX_ARCHITECTURE_ID)
  102. string(TOLOWER ${MSVC_CXX_ARCHITECTURE_ID} LOWERCASE_CMAKE_SYSTEM_PROCESSOR)
  103. else()
  104. string(TOLOWER ${CMAKE_SYSTEM_PROCESSOR} LOWERCASE_CMAKE_SYSTEM_PROCESSOR)
  105. endif()
  106. if(LOWERCASE_CMAKE_SYSTEM_PROCESSOR MATCHES
  107. "(i[3-6]86|x86|x64|x86_64|amd64|e2k)")
  108. if(NOT MSVC AND NOT CMAKE_OSX_ARCHITECTURES STREQUAL "arm64")
  109. set(ARCH_SIMD_FLAGS -mmmx -msse -msse2)
  110. endif()
  111. elseif(LOWERCASE_CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)64(le)?")
  112. set(ARCH_SIMD_DEFINES -DNO_WARN_X86_INTRINSICS)
  113. set(ARCH_SIMD_FLAGS -mvsx)
  114. else()
  115. if(CMAKE_C_COMPILER_ID MATCHES "^(Apple)?Clang|GNU"
  116. OR CMAKE_CXX_COMPILER_ID MATCHES "^(Apple)?Clang|GNU")
  117. check_c_compiler_flag("-fopenmp-simd" C_COMPILER_SUPPORTS_OPENMP_SIMD)
  118. check_cxx_compiler_flag("-fopenmp-simd" CXX_COMPILER_SUPPORTS_OPENMP_SIMD)
  119. set(ARCH_SIMD_FLAGS
  120. -DSIMDE_ENABLE_OPENMP
  121. "$<$<AND:$<COMPILE_LANGUAGE:C>,$<BOOL:C_COMPILER_SUPPORTS_OPENMP_SIMD>>:-fopenmp-simd>"
  122. "$<$<AND:$<COMPILE_LANGUAGE:CXX>,$<BOOL:CXX_COMPILER_SUPPORTS_OPENMP_SIMD>>:-fopenmp-simd>"
  123. )
  124. endif()
  125. endif()
  126. if(LOWERCASE_CMAKE_SYSTEM_PROCESSOR MATCHES "e2k")
  127. foreach(
  128. TEST_C_FLAG
  129. "-Wno-unused-parameter"
  130. "-Wno-ignored-qualifiers"
  131. "-Wno-pointer-sign"
  132. "-Wno-unused-variable"
  133. "-Wno-sign-compare"
  134. "-Wno-bad-return-value-type"
  135. "-Wno-maybe-uninitialized")
  136. check_c_compiler_flag(${TEST_C_FLAG}
  137. C_COMPILER_SUPPORTS_FLAG_${TEST_C_FLAG})
  138. if(C_COMPILER_SUPPORTS_FLAG_${TEST_C_FLAG})
  139. set(CMAKE_C_FLAGS ${CMAKE_C_FLAGS} ${TEST_C_FLAG})
  140. endif()
  141. endforeach()
  142. foreach(TEST_CXX_FLAG "-Wno-invalid-offsetof" "-Wno-maybe-uninitialized")
  143. check_cxx_compiler_flag(${TEST_CXX_FLAG}
  144. CXX_COMPILER_SUPPORTS_FLAG_${TEST_CXX_FLAG})
  145. if(CXX_COMPILER_SUPPORTS_FLAG_${TEST_CXX_FLAG})
  146. set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} ${TEST_CXX_FLAG})
  147. endif()
  148. endforeach()
  149. endif()