1
0
Эх сурвалжийг харах

cmake: Update macOS compiler configuration

Compiler extensions are disabled before the first `project` call to
force CMake into considering compilers to not support GNU extensions
(even though clang and gcc do).

Also sets common clang compiler options so they can be used across all
supported platforms.

`openmp-simd` support is enabled by default as there is no performance
penalty on x86_64 systems and intrinsics are enabled on arm64.

Also implements CMake's `CMAKE_COMPILE_WARNING_AS_ERROR` flag to
enable the desired behavior and configuration time.
PatTheMav 2 жил өмнө
parent
commit
eb3d9963a0

+ 1 - 0
cmake/common/bootstrap.cmake

@@ -26,6 +26,7 @@ endif()
 if(POLICY CMP0090)
   cmake_policy(SET CMP0090 NEW)
 endif()
+
 # Prohibit in-source builds
 if("${CMAKE_CURRENT_BINARY_DIR}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}")
   message(FATAL_ERROR "In-source builds of OBS are not supported. "

+ 1 - 1
cmake/common/ccache.cmake

@@ -13,8 +13,8 @@ if(CCACHE_PROGRAM)
   option(ENABLE_CCACHE "Enable compiler acceleration with ccache" ON)
 
   if(ENABLE_CCACHE)
-    set(CMAKE_CXX_COMPILER_LAUNCHER "${CCACHE_PROGRAM}")
     set(CMAKE_C_COMPILER_LAUNCHER "${CCACHE_PROGRAM}")
+    set(CMAKE_CXX_COMPILER_LAUNCHER "${CCACHE_PROGRAM}")
     set(CMAKE_OBJC_COMPILER_LAUNCHER "${CCACHE_PROGRAM}")
     set(CMAKE_OBJCXX_COMPILER_LAUNCHER "${CCACHE_PROGRAM}")
     set(CMAKE_CUDA_COMPILER_LAUNCHER "${CCACHE_PROGRAM}")

+ 76 - 0
cmake/common/compiler_common.cmake

@@ -1,3 +1,79 @@
 # OBS CMake common compiler options module
 
 include_guard(GLOBAL)
+
+# Set C and C++ language standards to C17 and C++17
+if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.21)
+  set(CMAKE_C_STANDARD 17)
+else()
+  set(CMAKE_C_STANDARD 11)
+endif()
+set(CMAKE_C_STANDARD_REQUIRED TRUE)
+set(CMAKE_CXX_STANDARD 17)
+set(CMAKE_CXX_STANDARD_REQUIRED TRUE)
+
+# Set symbols to be hidden by default for C and C++
+set(CMAKE_C_VISIBILITY_PRESET hidden)
+set(CMAKE_CXX_VISIBILITY_PRESET hidden)
+set(CMAKE_VISIBILITY_INLINES_HIDDEN TRUE)
+
+# clang options for C, C++, ObjC, and ObjC++
+set(_obs_clang_common_options
+    -fno-strict-aliasing
+    -Wno-trigraphs
+    -Wno-missing-field-initializers
+    -Wno-missing-prototypes
+    -Werror=return-type
+    -Wunreachable-code
+    -Wquoted-include-in-framework-header
+    -Wno-missing-braces
+    -Wparentheses
+    -Wswitch
+    -Wno-unused-function
+    -Wno-unused-label
+    -Wunused-parameter
+    -Wunused-variable
+    -Wunused-value
+    -Wempty-body
+    -Wuninitialized
+    -Wno-unknown-pragmas
+    -Wfour-char-constants
+    -Wconstant-conversion
+    -Wno-conversion
+    -Wint-conversion
+    -Wbool-conversion
+    -Wenum-conversion
+    -Wnon-literal-null-conversion
+    -Wsign-compare
+    -Wshorten-64-to-32
+    -Wpointer-sign
+    -Wnewline-eof
+    -Wno-implicit-fallthrough
+    -Wdeprecated-declarations
+    -Wno-sign-conversion
+    -Winfinite-recursion
+    -Wcomma
+    -Wno-strict-prototypes
+    -Wno-semicolon-before-method-body
+    -Wformat-security
+    -Wvla
+    -Wno-error=shorten-64-to-32)
+
+# clang options for C
+set(_obs_clang_c_options ${_obs_clang_common_options} -Wno-shadow -Wno-float-conversion)
+
+# clang options for C++
+set(_obs_clang_cxx_options
+    ${_obs_clang_common_options}
+    -Wno-non-virtual-dtor
+    -Wno-overloaded-virtual
+    -Wno-exit-time-destructors
+    -Wno-shadow
+    -Winvalid-offsetof
+    -Wmove
+    -Werror=block-capture-autoreleasing
+    -Wrange-loop-analysis)
+
+if(NOT DEFINED CMAKE_COMPILE_WARNING_AS_ERROR)
+  set(CMAKE_COMPILE_WARNING_AS_ERROR ON)
+endif()

+ 5 - 0
cmake/common/osconfig.cmake

@@ -5,12 +5,17 @@ include_guard(GLOBAL)
 # Set minimum CMake version specific to host operating system, add OS-specific module directory to default search paths,
 # and set helper variables for OS detection in other CMake list files.
 if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows")
+  set(CMAKE_C_EXTENSIONS FALSE)
+  set(CMAKE_CXX_EXTENSIONS FALSE)
   list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/windows")
   set(OS_WINDOWS TRUE)
 elseif(CMAKE_HOST_SYSTEM_NAME STREQUAL "Darwin")
+  set(CMAKE_C_EXTENSIONS FALSE)
+  set(CMAKE_CXX_EXTENSIONS FALSE)
   list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/macos")
   set(OS_MACOS TRUE)
 elseif(CMAKE_HOST_SYSTEM_NAME MATCHES "Linux|FreeBSD|OpenBSD")
+  set(CMAKE_CXX_EXTENSIONS FALSE)
   list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/linux")
   string(TOUPPER "${CMAKE_HOST_SYSTEM_NAME}" _SYSTEM_NAME_U)
   set(OS_${_SYSTEM_NAME_U} TRUE)

+ 32 - 82
cmake/macos/compilerconfig.cmake

@@ -4,81 +4,28 @@ include_guard(GLOBAL)
 
 include(ccache)
 include(compiler_common)
-include(simd)
 
-# Set C17 / C++17 standards as required and disable extensions
-set(CMAKE_CXX_STANDARD 17)
-set(CMAKE_CXX_STANDARD_REQUIRED ON)
-set(CMAKE_CXX_EXTENSIONS OFF)
+add_compile_options("$<$<NOT:$<COMPILE_LANGUAGE:Swift>>:-fopenmp-simd>")
 
-set(CMAKE_C_STANDARD 17)
-set(CMAKE_C_STANDARD_REQUIRED ON)
-set(CMAKE_C_EXTENSIONS OFF)
-
-# Set symbols to be hidden by default for C and C++
-set(CMAKE_CXX_VISIBILITY_PRESET hidden)
-set(CMAKE_C_VISIBILITY_PRESET hidden)
-set(CMAKE_VISIBILITY_INLINES_HIDDEN TRUE)
-
-# Add default C and C++ compiler options if Xcode generator is not used
-if(NOT XCODE)
-  set(_obs_common_options
-      -fno-strict-aliasing
-      -Werror
-      -Wno-trigraphs
-      -Wno-missing-field-initializers
-      -Wno-missing-prototypes
-      -Werror=return-type
-      -Wunreachable-code
-      -Wquoted-include-in-framework-header
-      -Wno-missing-braces
-      -Wparentheses
-      -Wswitch
-      -Wno-unused-function
-      -Wno-unused-label
-      -Wunused-parameter
-      -Wunused-variable
-      -Wunused-value
-      -Wempty-body
-      -Wuninitialized
-      -Wno-unknown-pragmas
-      -Wfour-char-constants
-      -Wconstant-conversion
-      -Wno-conversion
-      -Wint-conversion
-      -Wbool-conversion
-      -Wenum-conversion
-      -Wnon-literal-null-conversion
-      -Wsign-compare
-      -Wshorten-64-to-32
-      -Wpointer-sign
-      -Wnewline-eof
-      -Wno-implicit-fallthrough
-      -Wdeprecated-declarations
-      -Wno-sign-conversion
-      -Winfinite-recursion
-      -Wcomma
-      -Wno-strict-prototypes
-      -Wno-semicolon-before-method-body
-      -Wformat-security
-      -Wvla
-      -Wno-error=shorten-64-to-32)
-
-  set(_obs_c_options ${_obs_common_options} -Wno-shadow -Wno-float-conversion)
+# Enable selection between arm64 and x86_64 targets
+if(NOT CMAKE_OSX_ARCHITECTURES)
+  set(CMAKE_OSX_ARCHITECTURES
+      arm64
+      CACHE STRING "Build architectures for macOS" FORCE)
+endif()
+set_property(CACHE CMAKE_OSX_ARCHITECTURES PROPERTY STRINGS arm64 x86_64)
 
-  set(_obs_cxx_options
-      ${_obs_common_options}
-      -Wno-non-virtual-dtor
-      -Wno-overloaded-virtual
-      -Wno-exit-time-destructors
-      -Wno-shadow
-      -Winvalid-offsetof
-      -Wmove
-      -Werror=block-capture-autoreleasing
-      -Wrange-loop-analysis)
+if(XCODE)
+  # Enable dSYM generator for release builds
+  string(APPEND CMAKE_C_FLAGS_RELEASE " -g")
+  string(APPEND CMAKE_CXX_FLAGS_RELEASE " -g")
+else()
+  option(ENABLE_COMPILER_TRACE "Enable clang time-trace (requires Ninja)" OFF)
+  mark_as_advanced(ENABLE_COMPILER_TRACE)
 
-  set(_obs_objc_options
-      ${_obs_common_options}
+  # clang options for ObjC
+  set(_obs_clang_objc_options
+      ${_obs_clang_common_options}
       -Wno-implicit-atomic-properties
       -Wno-objc-interface-ivars
       -Warc-repeated-use-of-weak
@@ -96,7 +43,16 @@ if(NOT XCODE)
       -Werror=block-capture-autoreleasing
       -Wrange-loop-analysis)
 
-  set(_obs_objcxx_options ${_obs_objc_options} -Wno-non-virtual-dtor)
+  # clang options for ObjC++
+  set(_obs_clang_objcxx_options ${_obs_clang_objc_options} -Wno-non-virtual-dtor)
+
+  # cmake-format: off
+  add_compile_options(
+    "$<$<COMPILE_LANGUAGE:C>:${_obs_clang_c_options}>"
+    "$<$<COMPILE_LANGUAGE:CXX>:${_obs_clang_cxx_options}>"
+    "$<$<COMPILE_LANGUAGE:OBJC>:${_obs_clang_objc_options}>"
+    "$<$<COMPILE_LANGUAGE:OBJCXX>:${_obs_clang_objcxx_options}>")
+  # cmake-format: on
 
   # Enable stripping of dead symbols when not building for Debug configuration
   set(_release_configs RelWithDebInfo Release MinSizeRel)
@@ -104,12 +60,8 @@ if(NOT XCODE)
     add_link_options(LINKER:-dead_strip)
   endif()
 
-  add_compile_options(
-    "$<$<COMPILE_LANGUAGE:C>:${_obs_c_options}>" "$<$<COMPILE_LANGUAGE:CXX>:${_obs_cxx_options}>"
-    "$<$<COMPILE_LANGUAGE:OBJC>:${_obs_objc_options}>" "$<$<COMPILE_LANGUAGE:OBJCXX>:${_obs_objcxx_options}>")
-
-  option(ENABLE_COMPILER_TRACE "Enable clang time-trace (requires Ninja)" OFF)
-  mark_as_advanced(ENABLE_COMPILER_TRACE)
+  # Enable color diagnostics for AppleClang
+  set(CMAKE_COLOR_DIAGNOSTICS ON)
 
   # Add time trace option to compiler, if enabled.
   if(ENABLE_COMPILER_TRACE AND CMAKE_GENERATOR STREQUAL "Ninja")
@@ -119,9 +71,7 @@ if(NOT XCODE)
         OFF
         CACHE BOOL "Enable clang time-trace (requires Ninja)" FORCE)
   endif()
-
-  # Enable color diagnostics for AppleClang
-  set(CMAKE_COLOR_DIAGNOSTICS ON)
 endif()
 
-add_compile_definitions("$<$<AND:$<COMPILE_LANGUAGE:C,CXX,OBJC,OBJCXX>,$<CONFIG:DEBUG>>:DEBUG;_DEBUG>")
+add_compile_definitions(
+  "$<$<NOT:$<COMPILE_LANGUAGE:Swift>>:$<$<CONFIG:DEBUG>:DEBUG>;$<$<CONFIG:DEBUG>:_DEBUG>;SIMDE_ENABLE_OPENMP>")

+ 2 - 1
cmake/macos/resources/ccache-launcher-c.in

@@ -9,5 +9,6 @@ export CCACHE_DEPEND=true
 export CCACHE_DIRECT=true
 export CCACHE_FILECLONE=true
 export CCACHE_INODECACHE=true
-export CCACHE_SLOPPINESS="modules,include_file_mtime,include_file_ctime,pch_defines,clang_index_store,system_headers"
+export CCACHE_COMPILERCHECK='content'
+export CCACHE_SLOPPINESS='modules,include_file_mtime,include_file_ctime,clang_index_store,system_headers'
 exec "${CMAKE_C_COMPILER_LAUNCHER}" "${CMAKE_C_COMPILER}" "$@"

+ 2 - 1
cmake/macos/resources/ccache-launcher-cxx.in

@@ -9,5 +9,6 @@ export CCACHE_DEPEND=true
 export CCACHE_DIRECT=true
 export CCACHE_FILECLONE=true
 export CCACHE_INODECACHE=true
-export CCACHE_SLOPPINESS="modules,include_file_mtime,include_file_ctime,pch_defines,clang_index_store,system_headers"
+export CCACHE_COMPILERCHECK='content'
+export CCACHE_SLOPPINESS='modules,include_file_mtime,include_file_ctime,clang_index_store,system_headers'
 exec "${CMAKE_CXX_COMPILER_LAUNCHER}" "${CMAKE_CXX_COMPILER}" "$@"

+ 0 - 7
cmake/macos/simd.cmake

@@ -1,7 +0,0 @@
-# OBS CMake macOS SIMD module
-
-# Enable openmp-simd when compiling for arm64
-if(CMAKE_OSX_ARCHITECTURES MATCHES ".*[aA][rR][mM]64e?.*" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "arm64")
-  set(ARCH_SIMD_FLAGS -fopenmp-simd)
-  set(ARCH_SIMD_DEFINES SIMDE_ENABLE_OPENMP)
-endif()

+ 30 - 11
cmake/macos/xcode.cmake

@@ -2,14 +2,17 @@
 
 include_guard(GLOBAL)
 
+set(CMAKE_XCODE_GENERATE_SCHEME TRUE)
+
 # Use a compiler wrapper to enable ccache in Xcode projects
 if(ENABLE_CCACHE AND CCACHE_PROGRAM)
-  configure_file("${CMAKE_SOURCE_DIR}/cmake/macos/resources/ccache-launcher-c.in" ccache-launcher-c)
-  configure_file("${CMAKE_SOURCE_DIR}/cmake/macos/resources/ccache-launcher-cxx.in" ccache-launcher-cxx)
+  configure_file("${CMAKE_CURRENT_SOURCE_DIR}/cmake/macos/resources/ccache-launcher-c.in" ccache-launcher-c)
+  configure_file("${CMAKE_CURRENT_SOURCE_DIR}/cmake/macos/resources/ccache-launcher-cxx.in" ccache-launcher-cxx)
 
-  execute_process(COMMAND chmod a+rx "${CMAKE_BINARY_DIR}/ccache-launcher-c" "${CMAKE_BINARY_DIR}/ccache-launcher-cxx")
-  set(CMAKE_XCODE_ATTRIBUTE_CC "${CMAKE_BINARY_DIR}/ccache-launcher-c")
-  set(CMAKE_XCODE_ATTRIBUTE_CXX "${CMAKE_BINARY_DIR}/ccache-launcher-cxx")
+  execute_process(COMMAND chmod a+rx "${CMAKE_CURRENT_BINARY_DIR}/ccache-launcher-c"
+                          "${CMAKE_CURRENT_BINARY_DIR}/ccache-launcher-cxx")
+  set(CMAKE_XCODE_ATTRIBUTE_CC "${CMAKE_CURRENT_BINARY_DIR}/ccache-launcher-c")
+  set(CMAKE_XCODE_ATTRIBUTE_CXX "${CMAKE_CURRENT_BINARY_DIR}/ccache-launcher-cxx")
   set(CMAKE_XCODE_ATTRIBUTE_LD "${CMAKE_C_COMPILER}")
   set(CMAKE_XCODE_ATTRIBUTE_LDPLUSPLUS "${CMAKE_CXX_COMPILER}")
 endif()
@@ -71,13 +74,17 @@ set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_INJECT_BASE_ENTITLEMENTS[variant=MinSizeRel]
 # Use Swift version 5.0 by default
 set(CMAKE_XCODE_ATTRIBUTE_SWIFT_VERSION 5.0)
 
-# Use DWARF with separate dSYM files when in Release or MinSizeRel configuration
+# Use DWARF with separate dSYM files when in Release or MinSizeRel configuration.
+#
+# * Currently overruled by CMake's Xcode generator, requires adding '-g' flag to raw compiler command line for desired
+#   output configuration. Report to KitWare.
+#
 set(CMAKE_XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT[variant=Debug] dwarf)
 set(CMAKE_XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT[variant=RelWithDebInfo] dwarf)
 set(CMAKE_XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT[variant=Release] dwarf-with-dsym)
 set(CMAKE_XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT[variant=MinSizeRel] dwarf-with-dsym)
 
-# Make all symbols hidden by default
+# Make all symbols hidden by default (currently overriden by CMake's compiler flags)
 set(CMAKE_XCODE_ATTRIBUTE_GCC_SYMBOLS_PRIVATE_EXTERN YES)
 set(CMAKE_XCODE_ATTRIBUTE_GCC_INLINES_ARE_PRIVATE_EXTERN YES)
 
@@ -99,10 +106,20 @@ set(CMAKE_XCODE_ATTRIBUTE_CLANG_ENABLE_OBJC_ARC NO)
 set(CMAKE_XCODE_ATTRIBUTE_CLANG_ENABLE_OBJC_WEAK YES)
 # Disable strict aliasing
 set(CMAKE_XCODE_ATTRIBUTE_GCC_STRICT_ALIASING NO)
-# Set C language default to C17
-set(CMAKE_XCODE_ATTRIBUTE_GCC_C_LANGUAGE_STANDARD c17)
+
+# Set C++ language default to c17
+#
+# * CMake explicitly sets the version via compiler flag when transitive dependencies require specific compiler feature
+#   set, resulting in the flag being added twice. Report to KitWare as a feature request for Xcode generator
+#
+# set(CMAKE_XCODE_ATTRIBUTE_GCC_C_LANGUAGE_STANDARD c17)
+#
 # Set C++ language default to c++17
-set(CMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LANGUAGE_STANDARD c++17)
+#
+# * See above. Report to KitWare as a feature request for Xcode generator
+#
+# set(CMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LANGUAGE_STANDARD c++17)
+
 # Enable support for module imports in ObjC
 set(CMAKE_XCODE_ATTRIBUTE_CLANG_ENABLE_MODULES NO)
 # Enable automatic linking of imported modules in ObjC
@@ -153,7 +170,9 @@ set(CMAKE_XCODE_ATTRIBUTE_GCC_WARN_UNUSED_VARIABLE YES)
 # Add additional warning compiler flags
 set(CMAKE_XCODE_ATTRIBUTE_WARNING_CFLAGS "-Wvla -Wformat-security -Wno-error=shorten-64-to-32")
 
-set(CMAKE_XCODE_ATTRIBUTE_GCC_TREAT_WARNINGS_AS_ERRORS YES)
+if(CMAKE_COMPILE_WARNING_AS_ERROR)
+  set(CMAKE_XCODE_ATTRIBUTE_GCC_TREAT_WARNINGS_AS_ERRORS YES)
+endif()
 
 # Enable color diagnostics
 set(CMAKE_COLOR_DIAGNOSTICS TRUE)

+ 1 - 1
plugins/mac-virtualcam/src/camera-extension/CMakeLists.txt

@@ -43,7 +43,7 @@ set_target_properties(
              XCODE_ATTRIBUTE_OTHER_CODE_SIGN_FLAGS "--timestamp"
              XCODE_ATTRIBUTE_MACOSX_DEPLOYMENT_TARGET 13.0
              XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "com.obsproject.obs-studio.mac-camera-extension"
-             XCODE_ATTRIBUTE_SWIFT_VERSION 5
+             XCODE_ATTRIBUTE_SWIFT_VERSION 5.0
              XCODE_ATTRIBUTE_SKIP_INSTALL YES)
 
 set_target_properties_obs(mac-camera-extension PROPERTIES FOLDER plugins

+ 3 - 4
plugins/mac-virtualcam/src/obs-plugin/CMakeLists.txt

@@ -6,11 +6,10 @@ add_library(mac-virtualcam MODULE)
 add_library(OBS::virtualcam ALIAS mac-virtualcam)
 
 target_sources(mac-virtualcam PRIVATE Defines.h plugin-main.mm OBSDALMachServer.mm OBSDALMachServer.h)
+target_compile_options(mac-virtualcam PRIVATE -fmodules -fcxx-modules)
 
-if(XCODE)
-  target_compile_options(mac-virtualcam PRIVATE -fmodules -fcxx-modules)
-else()
-  target_compile_options(mac-virtualcam PRIVATE -fobjc-arc -fobjc-weak -fmodules -fcxx-modules)
+if(NOT XCODE)
+  target_compile_options(mac-virtualcam PRIVATE -fobjc-arc -fobjc-weak)
 endif()
 
 target_link_libraries(mac-virtualcam PRIVATE OBS::mach-protocol OBS::libobs OBS::frontend-api)