1# Enable warnings for the given target 2# Arguments: 3# target: Non-interface library or executable 4# level: Which warnings to add. Valid values: off, on, all, extra 5# warningsAsErrors: Optional, ON to treat warnings as errors 6# Optionally can pass a bool as warnings-as-errors 7function(boost_add_warnings target level) 8 if(ARGC GREATER 2) 9 set(warningsAsErrors ${ARGV2}) 10 else() 11 set(warningsAsErrors OFF) 12 endif() 13 set(allowed_levels off on all extra pedantic) 14 if(NOT level IN_LIST allowed_levels) 15 message(FATAL_ERROR "${level} is not a valid warning level (${allowed_levels})") 16 endif() 17 if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") 18 set(supression -Wno-long-long) 19 set(warn_off -w) 20 set(warn_on -Wall ${supression}) 21 set(warn_all -Wall ${supression}) 22 set(warn_extra -Wall -Wextra ${supression}) 23 set(warn_pedantic -Wall -Wextra -pedantic ${supression}) 24 set(werror -Werror) 25 elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Intel") 26 set(warn_off -w0) 27 foreach(_lvl IN ITEMS on all extra pedantic) 28 set(warn_${_lvl} -w1) 29 endforeach() 30 set(werror "") 31 elseif(MSVC) 32 set(warn_off /W0) 33 set(warn_on /W3) 34 foreach(_lvl IN ITEMS all extra pedantic) 35 set(warn_${_lvl} /W4) 36 endforeach() 37 set(werror /WX) 38 endif() 39 target_compile_options(${target} PRIVATE ${warn_${level}}) 40 if(warningsAsErrors) 41 target_compile_options(${target} PRIVATE ${werror}) 42 endif() 43endfunction() 44