# CMake common compiler options module

include_guard(GLOBAL)

# Set C and C++ language standards to C17 and C++17
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
set(_obs_clang_c_options
    # cmake-format: sortable
    -fno-strict-aliasing
    -Wbool-conversion
    -Wcomma
    -Wconstant-conversion
    -Wdeprecated-declarations
    -Wempty-body
    -Wenum-conversion
    -Werror=return-type
    -Wextra
    -Wformat
    -Wformat-security
    -Wfour-char-constants
    -Winfinite-recursion
    -Wint-conversion
    -Wnewline-eof
    -Wno-conversion
    -Wno-error=deprecated-declarations
    -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-strict-prototypes
    -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
    -Wshadow
    -Wshorten-64-to-32
    -Wuninitialized
    -Wunreachable-code
    -Wunused-parameter
    -Wunused-value
    -Wunused-variable
    -Wvla)

# clang options for C++
set(_obs_clang_cxx_options
    # cmake-format: sortable
    ${_obs_clang_c_options}
    -Wconversion
    -Wdeprecated-implementations
    -Wduplicate-method-match
    -Wfloat-conversion
    -Wfour-char-constants
    -Wimplicit-retain-self
    -Winvalid-offsetof
    -Wmove
    -Wno-c++11-extensions
    -Wno-exit-time-destructors
    -Wno-implicit-atomic-properties
    -Wno-objc-interface-ivars
    -Wno-overloaded-virtual
    -Wrange-loop-analysis)

if(NOT DEFINED CMAKE_COMPILE_WARNING_AS_ERROR)
  set(CMAKE_COMPILE_WARNING_AS_ERROR ON)
endif()
