Browse Source

cmake: Enable suggested default Xcode build settings for macOS builds

Also updates Ninja-based clang settings to ensure builds fail on same
compilation issues.
PatTheMav 2 years ago
parent
commit
29dc42decd
2 changed files with 109 additions and 31 deletions
  1. 75 18
      cmake/macos/compilerconfig.cmake
  2. 34 13
      cmake/macos/xcode.cmake

+ 75 - 18
cmake/macos/compilerconfig.cmake

@@ -30,20 +30,77 @@ set(CMAKE_VISIBILITY_INLINES_HIDDEN TRUE)
 
 # Add default C and C++ compiler options if Xcode generator is not used
 if(NOT XCODE)
-  list(
-    APPEND
-    _obs_c_options
-    -Werror
-    -Wextra
-    -Wvla
-    -Wswitch
-    -Wformat-security
-    -Wunused-parameter
-    -Wno-unused-function
-    -Wno-missing-field-initializers
-    -Wformat
-    -fno-strict-aliasing
-    -Wno-error=shorten-64-to-32)
+  set(_obs_c_options
+      # cmake-format: sortable
+      -fno-strict-aliasing
+      -Wbool-conversion
+      -Wcomma
+      -Wconstant-conversion
+      -Wdeprecated-declarations
+      -Wempty-body
+      -Wenum-conversion
+      -Werror
+      -Werror=block-capture-autoreleasing
+      -Werror=return-type
+      -Wextra
+      -Wformat
+      -Wformat-security
+      -Wfour-char-constants
+      -Winfinite-recursion
+      -Wint-conversion
+      -Wnewline-eof
+      -Wno-conversion
+      -Wno-float-conversion
+      -Wno-implicit-fallthrough
+      -Wno-missing-braces
+      -Wno-missing-field-initializers
+      -Wno-missing-prototypes
+      -Wno-semicolon-before-method-body
+      -Wno-shadow
+      -Wno-sign-conversion
+      -Wno-trigraphs
+      -Wno-unknown-pragmas
+      -Wno-unused-function
+      -Wno-unused-label
+      -Wnon-literal-null-conversion
+      -Wobjc-literal-conversion
+      -Wparentheses
+      -Wpointer-sign
+      -Wquoted-include-in-framework-header
+      -Wshorten-64-to-32
+      -Wsign-compare
+      -Wstrict-prototypes
+      -Wswitch
+      -Wuninitialized
+      -Wunreachable-code
+      -Wunused-parameter
+      -Wunused-value
+      -Wunused-variable
+      -Wvla)
+
+  set(_obs_cxx_options
+      # cmake-format: sortable
+      -Warc-repeated-use-of-weak
+      -Wconversion
+      -Wdeprecated-implementations
+      -Wduplicate-method-match
+      -Wfloat-conversion
+      -Wfour-char-constants
+      -Wimplicit-retain-self
+      -Winvalid-offsetof
+      -Wmove
+      -Wno-arc-maybe-repeated-use-of-weak
+      -Wno-exit-time-destructors
+      -Wno-implicit-atomic-properties
+      -Wno-non-virtual-dtor
+      -Wno-objc-interface-ivars
+      -Wno-overloaded-virtual
+      -Wno-selector
+      -Wno-strict-selector-match
+      -Wprotocol
+      -Wrange-loop-analysis
+      -Wshadow
+      -Wundeclared-selector)
 
   # Enable stripping of dead symbols when not building for Debug configuration
   set(_release_configs RelWithDebInfo Release MinSizeRel)
@@ -51,19 +108,19 @@ if(NOT XCODE)
     add_link_options(LINKER:-dead_strip)
   endif()
 
-  add_compile_options("$<$<COMPILE_LANGUAGE:C>:${_obs_c_options}>" "$<$<COMPILE_LANGUAGE:CXX>:${_obs_c_options}>"
-                      "$<$<AND:$<COMPILE_LANGUAGE:Swift>,$<CONFIG:DEBUG>>:-Onone>")
+  add_compile_options("$<$<COMPILE_LANGUAGE:C>:${_obs_c_options}>"
+                      "$<$<COMPILE_LANGUAGE:CXX>:${_obs_c_options} ${_obs_cxx_options}>")
 
   option(ENABLE_COMPILER_TRACE "Enable clang time-trace (requires Ninja)" OFF)
   mark_as_advanced(ENABLE_COMPILER_TRACE)
 
   # Add time trace option to compiler, if enabled.
   if(ENABLE_COMPILER_TRACE AND CMAKE_GENERATOR STREQUAL "Ninja")
-    add_compile_options($<$<COMPILE_LANGUAGE:C>:-ftime-trace> $<$<COMPILE_LANGUAGE:CXX>:-ftime-trace>)
+    add_compile_options($<$<NOT:$<COMPILE_LANGUAGE:Swift>>:-ftime-trace>)
   else()
     set(ENABLE_COMPILER_TRACE
         OFF
-        CACHE STRING "Enable clang time-trace (requires Ninja)" FORCE)
+        CACHE BOOL "Enable clang time-trace (requires Ninja)" FORCE)
   endif()
 
   # Enable color diagnostics for AppleClang

+ 34 - 13
cmake/macos/xcode.cmake

@@ -75,23 +75,26 @@ 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)
 
-# Strip generated and installed products only in Release or MinSizeRel configuration
-set(CMAKE_XCODE_ATTRIBUTE_STRIP_INSTALLED_PRODUCT[variant=Release] YES)
-set(CMAKE_XCODE_ATTRIBUTE_STRIP_INSTALLED_PRODUCT[variant=MinSizeRel] YES)
-
 # Make all symbols hidden by default
 set(CMAKE_XCODE_ATTRIBUTE_GCC_SYMBOLS_PRIVATE_EXTERN YES)
 set(CMAKE_XCODE_ATTRIBUTE_GCC_INLINES_ARE_PRIVATE_EXTERN YES)
 
-# Strip unused code in Release or MinSizeRel configuration only
-set(CMAKE_XCODE_ATTRIBUTE_DEAD_CODE_STRIPPING[variant=Release] YES)
-set(CMAKE_XCODE_ATTRIBUTE_DEAD_CODE_STRIPPING[variant=MinSizeRel] YES)
+# Strip unused code
+set(CMAKE_XCODE_ATTRIBUTE_DEAD_CODE_STRIPPING YES)
 
 # Display mangled names in Debug configuration
 set(CMAKE_XCODE_ATTRIBUTE_LINKER_DISPLAYS_MANGLED_NAMES[variant=Debug] YES)
 
+# Build active architecture only in Debug configuration
+set(CMAKE_XCODE_ATTRIBUTE_ONLY_ACTIVE_ARCH[variant=Debug] YES)
+
+# Enable testability in Debug configuration
+set(CMAKE_XCODE_ATTRIBUTE_ENABLE_TESTABILITY[variant=Debug] YES)
+
 # Disable using ARC in ObjC by default (OBS does not support this - yet)
 set(CMAKE_XCODE_ATTRIBUTE_CLANG_ENABLE_OBJC_ARC NO)
+# Enable weak references in manual retain release
+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
@@ -107,33 +110,51 @@ set(CMAKE_XCODE_ATTRIBUTE_ENABLE_STRICT_OBJC_MSGSEND YES)
 
 # Set default warnings for ObjC and C++
 set(CMAKE_XCODE_ATTRIBUTE_CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING YES_ERROR)
-set(CMAKE_XCODE_ATTRIBUTE_CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION NO)
+set(CMAKE_XCODE_ATTRIBUTE_CLANG_WARN_BOOL_CONVERSION YES)
 set(CMAKE_XCODE_ATTRIBUTE_CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS YES)
+set(CMAKE_XCODE_ATTRIBUTE_CLANG_WARN_COMMA YES)
+set(CMAKE_XCODE_ATTRIBUTE_CLANG_WARN_CONSTANT_CONVERSION YES)
+set(CMAKE_XCODE_ATTRIBUTE_CLANG_WARN_EMPTY_BODY YES)
+set(CMAKE_XCODE_ATTRIBUTE_CLANG_WARN_ENUM_CONVERSION YES)
+set(CMAKE_XCODE_ATTRIBUTE_CLANG_WARN_INFINITE_RECURSION YES)
+set(CMAKE_XCODE_ATTRIBUTE_CLANG_WARN_INT_CONVERSION YES)
+set(CMAKE_XCODE_ATTRIBUTE_CLANG_WARN_NON_LITERAL_NULL_CONVERSION YES)
+set(CMAKE_XCODE_ATTRIBUTE_CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF YES)
+set(CMAKE_XCODE_ATTRIBUTE_CLANG_WARN_OBJC_LITERAL_CONVERSION YES)
 set(CMAKE_XCODE_ATTRIBUTE_CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK YES)
+set(CMAKE_XCODE_ATTRIBUTE_CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER YES)
 set(CMAKE_XCODE_ATTRIBUTE_CLANG_WARN_RANGE_LOOP_ANALYSIS YES)
-set(CMAKE_XCODE_ATTRIBUTE_CLANG_WARN_EMPTY_BODY YES)
+set(CMAKE_XCODE_ATTRIBUTE_CLANG_WARN_STRICT_PROTOTYPES NO)
+set(CMAKE_XCODE_ATTRIBUTE_CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION NO)
+set(CMAKE_XCODE_ATTRIBUTE_CLANG_WARN_SUSPICIOUS_MOVE YES)
+set(CMAKE_XCODE_ATTRIBUTE_CLANG_WARN_UNREACHABLE_CODE YES)
+set(CMAKE_XCODE_ATTRIBUTE_CLANG_WARN__DUPLICATE_METHOD_MATCH YES)
 
 # Set default warnings for C and C++
+set(CMAKE_XCODE_ATTRIBUTE_GCC_NO_COMMON_BLOCKS YES)
+set(CMAKE_XCODE_ATTRIBUTE_GCC_WARN_64_TO_32_BIT_CONVERSION YES)
 set(CMAKE_XCODE_ATTRIBUTE_GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS NO)
 set(CMAKE_XCODE_ATTRIBUTE_GCC_WARN_ABOUT_MISSING_NEWLINE YES)
 set(CMAKE_XCODE_ATTRIBUTE_GCC_WARN_ABOUT_RETURN_TYPE YES_ERROR)
 set(CMAKE_XCODE_ATTRIBUTE_GCC_WARN_CHECK_SWITCH_STATEMENTS YES)
 set(CMAKE_XCODE_ATTRIBUTE_GCC_WARN_FOUR_CHARACTER_CONSTANTS YES)
-set(CMAKE_XCODE_ATTRIBUTE_GCC_WARN_SIGN_COMPARE YES)
 set(CMAKE_XCODE_ATTRIBUTE_GCC_WARN_SHADOW NO)
+set(CMAKE_XCODE_ATTRIBUTE_GCC_WARN_SIGN_COMPARE YES)
+set(CMAKE_XCODE_ATTRIBUTE_GCC_WARN_TYPECHECK_CALLS_TO_PRINTF YES)
+set(CMAKE_XCODE_ATTRIBUTE_GCC_WARN_UNDECLARED_SELECTOR YES)
+set(CMAKE_XCODE_ATTRIBUTE_GCC_WARN_UNINITIALIZED_AUTOS YES)
 set(CMAKE_XCODE_ATTRIBUTE_GCC_WARN_UNUSED_FUNCTION NO)
 set(CMAKE_XCODE_ATTRIBUTE_GCC_WARN_UNUSED_PARAMETER YES)
 set(CMAKE_XCODE_ATTRIBUTE_GCC_WARN_UNUSED_VALUE YES)
 set(CMAKE_XCODE_ATTRIBUTE_GCC_WARN_UNUSED_VARIABLE YES)
-set(CMAKE_XCODE_ATTRIBUTE_GCC_WARN_TYPECHECK_CALLS_TO_PRINTF 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)
 
-# Disable color diagnostics
-set(CMAKE_COLOR_DIAGNOSTICS FALSE)
+# Enable color diagnostics
+set(CMAKE_COLOR_DIAGNOSTICS TRUE)
 
 # Disable usage of RPATH in build or install configurations
 set(CMAKE_SKIP_RPATH TRUE)