mirror of
				https://github.com/Z3Prover/z3
				synced 2025-11-04 05:19:11 +00:00 
			
		
		
		
	* sat_literal: make constants constexpr * dlist: rename elem -> list * tbv: use get_bit * additional pdd and rational tests * egraph: callback setters take functions by value This allows to set callbacks without defining a separate variable for the callback lambda. (previous usage does one copy of the function, exactly as before) * cmake: enable compiler error when non-void function does not return value
		
			
				
	
	
		
			160 lines
		
	
	
	
		
			5.9 KiB
		
	
	
	
		
			CMake
		
	
	
	
	
	
			
		
		
	
	
			160 lines
		
	
	
	
		
			5.9 KiB
		
	
	
	
		
			CMake
		
	
	
	
	
	
################################################################################
 | 
						|
# Compiler warning flags
 | 
						|
################################################################################
 | 
						|
# These are passed to relevant compiler provided they are supported
 | 
						|
set(GCC_AND_CLANG_WARNINGS
 | 
						|
  "-Wall"
 | 
						|
)
 | 
						|
set(GCC_ONLY_WARNINGS "")
 | 
						|
set(CLANG_ONLY_WARNINGS "")
 | 
						|
set(MSVC_WARNINGS "/W3")
 | 
						|
 | 
						|
################################################################################
 | 
						|
# Serious warnings
 | 
						|
################################################################################
 | 
						|
# This declares the flags that are passed to the compiler when
 | 
						|
# `WARNINGS_AS_ERRORS` is set to `SERIOUS_ONLY`. Only flags that are supported
 | 
						|
# by the compiler are used.
 | 
						|
#
 | 
						|
# In effect this a "whitelist" approach where we explicitly tell the compiler
 | 
						|
# which warnings we want to be treated as errors. The alternative would be a
 | 
						|
# "blacklist" approach where we ask the compiler to treat all warnings are
 | 
						|
# treated as errors but then we explicitly list which warnings which should be
 | 
						|
# allowed.
 | 
						|
#
 | 
						|
# The "whitelist" approach seems simpiler because we can incrementally add
 | 
						|
# warnings we "think are serious".
 | 
						|
 | 
						|
# TODO: Add more warnings that are considered serious enough that we should
 | 
						|
# treat them as errors.
 | 
						|
set(GCC_AND_CLANG_WARNINGS_AS_ERRORS
 | 
						|
  # https://clang.llvm.org/docs/DiagnosticsReference.html#wodr
 | 
						|
  "-Werror=odr"
 | 
						|
  # https://clang.llvm.org/docs/DiagnosticsReference.html#wreturn-type
 | 
						|
  "-Werror=return-type"
 | 
						|
)
 | 
						|
set(GCC_WARNINGS_AS_ERRORS
 | 
						|
  ""
 | 
						|
)
 | 
						|
set(CLANG_WARNINGS_AS_ERRORS
 | 
						|
  # https://clang.llvm.org/docs/DiagnosticsReference.html#wdelete-non-virtual-dtor
 | 
						|
  "-Werror=delete-non-virtual-dtor"
 | 
						|
  # https://clang.llvm.org/docs/DiagnosticsReference.html#woverloaded-virtual
 | 
						|
  "-Werror=overloaded-virtual"
 | 
						|
  # warn the user if a class with virtual functions has a
 | 
						|
  # non-virtual destructor. This helps catch hard to
 | 
						|
  # track down memory errors
 | 
						|
  "-Werror=non-virtual-dtor"
 | 
						|
  # warn if a null dereference is detected
 | 
						|
  "-Werror=null-dereference"
 | 
						|
  # warn for potential performance problem casts
 | 
						|
  # "-Werror=cast-align"
 | 
						|
  # warn if float is implicit promoted to double
 | 
						|
  # "-Werror=double-promotion"
 | 
						|
  "-Werror=no-unreachable-code-return"
 | 
						|
  # warn the user if a variable declaration shadows one from a parent context
 | 
						|
  # "-Werror=shadow"
 | 
						|
  # warn for c-style casts
 | 
						|
  # "-Werror=old-style-cast"
 | 
						|
  # warn on sign conversions
 | 
						|
  # "-Werror=sign-conversion"
 | 
						|
  # warn on type conversions that may lose data
 | 
						|
  # "-Werror=conversion"
 | 
						|
  # warn on anything being unused
 | 
						|
  # "-Werror=unused"
 | 
						|
)
 | 
						|
 | 
						|
################################################################################
 | 
						|
# Test warning/error flags
 | 
						|
################################################################################
 | 
						|
set(WARNING_FLAGS_TO_CHECK "")
 | 
						|
set(WARNING_AS_ERROR_FLAGS_TO_CHECK "")
 | 
						|
if (CMAKE_CXX_COMPILER_ID MATCHES "GNU")
 | 
						|
  list(APPEND WARNING_FLAGS_TO_CHECK ${GCC_AND_CLANG_WARNINGS})
 | 
						|
  list(APPEND WARNING_FLAGS_TO_CHECK ${GCC_ONLY_WARNINGS})
 | 
						|
  list(APPEND WARNING_AS_ERROR_FLAGS_TO_CHECK ${GCC_AND_CLANG_WARNINGS_AS_ERRORS})
 | 
						|
  list(APPEND WARNING_AS_ERROR_FLAGS_TO_CHECK ${GCC_WARNINGS_AS_ERRORS})
 | 
						|
elseif (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
 | 
						|
  list(APPEND WARNING_FLAGS_TO_CHECK ${GCC_AND_CLANG_WARNINGS})
 | 
						|
  list(APPEND WARNING_FLAGS_TO_CHECK ${CLANG_ONLY_WARNINGS})
 | 
						|
  list(APPEND WARNING_AS_ERROR_FLAGS_TO_CHECK ${GCC_AND_CLANG_WARNINGS_AS_ERRORS})
 | 
						|
  list(APPEND WARNING_AS_ERROR_FLAGS_TO_CHECK ${CLANG_WARNINGS_AS_ERRORS})
 | 
						|
elseif (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
 | 
						|
  list(APPEND WARNING_FLAGS_TO_CHECK ${MSVC_WARNINGS})
 | 
						|
 | 
						|
  # CMake's default flags include /W3 already so remove them if
 | 
						|
  # they already exist.
 | 
						|
  if (CMAKE_CXX_FLAGS MATCHES "/W3")
 | 
						|
    string(REPLACE "/W3" "" _cmake_cxx_flags_remove_w3 "${CMAKE_CXX_FLAGS}")
 | 
						|
    set(CMAKE_CXX_FLAGS "${_cmake_cxx_flags_remove_w3}" CACHE STRING "" FORCE)
 | 
						|
  endif()
 | 
						|
else()
 | 
						|
  message(AUTHOR_WARNING "Unknown compiler")
 | 
						|
endif()
 | 
						|
 | 
						|
# Loop through flags and use the ones which the compiler supports
 | 
						|
foreach (flag ${WARNING_FLAGS_TO_CHECK})
 | 
						|
  z3_add_cxx_flag("${flag}")
 | 
						|
endforeach()
 | 
						|
 | 
						|
# TODO: Remove this eventually.
 | 
						|
# Detect legacy `WARNINGS_AS_ERRORS` boolean option and covert to new
 | 
						|
# to new option type.
 | 
						|
get_property(
 | 
						|
  WARNINGS_AS_ERRORS_CACHE_VAR_TYPE
 | 
						|
  CACHE
 | 
						|
  WARNINGS_AS_ERRORS
 | 
						|
  PROPERTY
 | 
						|
  TYPE
 | 
						|
)
 | 
						|
if (WARNINGS_AS_ERRORS_CACHE_VAR_TYPE STREQUAL "BOOL")
 | 
						|
  message(WARNING "Detected legacy WARNINGS_AS_ERRORS option. Upgrading")
 | 
						|
  set(WARNINGS_AS_ERRORS_DEFAULT "${WARNINGS_AS_ERRORS}")
 | 
						|
  # Delete old entry
 | 
						|
  unset(WARNINGS_AS_ERRORS CACHE)
 | 
						|
else()
 | 
						|
  set(WARNINGS_AS_ERRORS_DEFAULT "SERIOUS_ONLY")
 | 
						|
endif()
 | 
						|
 | 
						|
set(WARNINGS_AS_ERRORS
 | 
						|
  ${WARNINGS_AS_ERRORS_DEFAULT}
 | 
						|
  CACHE STRING
 | 
						|
  "Treat warnings as errors. ON, OFF, or SERIOUS_ONLY"
 | 
						|
)
 | 
						|
 # Set GUI options
 | 
						|
set_property(
 | 
						|
  CACHE
 | 
						|
  WARNINGS_AS_ERRORS
 | 
						|
  PROPERTY STRINGS
 | 
						|
  "ON;OFF;SERIOUS_ONLY"
 | 
						|
)
 | 
						|
 | 
						|
if (WARNINGS_AS_ERRORS STREQUAL "ON")
 | 
						|
  message(STATUS "Treating compiler warnings as errors")
 | 
						|
  if ((CMAKE_CXX_COMPILER_ID MATCHES "Clang") OR (CMAKE_CXX_COMPILER_ID MATCHES "GNU"))
 | 
						|
    list(APPEND Z3_COMPONENT_CXX_FLAGS "-Werror")
 | 
						|
  elseif (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
 | 
						|
    list(APPEND Z3_COMPONENT_CXX_FLAGS "/WX")
 | 
						|
  else()
 | 
						|
    message(AUTHOR_WARNING "Unknown compiler")
 | 
						|
  endif()
 | 
						|
elseif (WARNINGS_AS_ERRORS STREQUAL "SERIOUS_ONLY")
 | 
						|
  message(STATUS "Treating only serious compiler warnings as errors")
 | 
						|
  # Loop through the flags
 | 
						|
  foreach (flag ${WARNING_AS_ERROR_FLAGS_TO_CHECK})
 | 
						|
    # Add globally because some flags need to be passed at link time.
 | 
						|
    z3_add_cxx_flag("${flag}" GLOBAL)
 | 
						|
  endforeach()
 | 
						|
elseif (WARNINGS_AS_ERRORS STREQUAL "OFF")
 | 
						|
  message(STATUS "Not treating compiler warnings as errors")
 | 
						|
  if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
 | 
						|
    # Warnings as errors is off by default for MSVC so setting this
 | 
						|
    # is not necessary but this duplicates the behaviour of the old
 | 
						|
    # build system.
 | 
						|
    list(APPEND Z3_COMPONENT_CXX_FLAGS "/WX-")
 | 
						|
  endif()
 | 
						|
else()
 | 
						|
  message(FATAL_ERROR
 | 
						|
    "WARNINGS_AS_ERRORS set to unsupported value \"${WARNINGS_AS_ERRORS}\""
 | 
						|
  )
 | 
						|
endif()
 |