1include(CheckCSourceCompiles) 2include(CheckCXXSourceCompiles) 3# We need some extra FAIL_REGEX patterns 4# Note that CHECK_C_SOURCE_COMPILES is a misnomer, it will also link. 5SET(fail_patterns 6 FAIL_REGEX "argument unused during compilation" 7 FAIL_REGEX "unsupported .*option" 8 FAIL_REGEX "unknown .*option" 9 FAIL_REGEX "unrecognized .*option" 10 FAIL_REGEX "ignoring unknown option" 11 FAIL_REGEX "warning:.*ignored" 12 FAIL_REGEX "warning:.*is valid for.*but not for" 13 FAIL_REGEX "warning:.*redefined" 14 FAIL_REGEX "[Ww]arning: [Oo]ption" 15 ) 16#The regex patterns above are not localized, thus LANG=C 17SET(ENV{LANG} C) 18MACRO (MY_CHECK_C_COMPILER_FLAG flag) 19 STRING(REGEX REPLACE "[-,= +]" "_" result "have_C_${flag}") 20 SET(SAVE_CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}") 21 SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} ${flag}") 22 CHECK_C_SOURCE_COMPILES("int main(void) { return 0; }" ${result} 23 ${fail_patterns}) 24 SET(CMAKE_REQUIRED_FLAGS "${SAVE_CMAKE_REQUIRED_FLAGS}") 25ENDMACRO() 26 27MACRO (MY_CHECK_CXX_COMPILER_FLAG flag) 28 STRING(REGEX REPLACE "[-,= +]" "_" result "have_CXX_${flag}") 29 SET(SAVE_CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}") 30 SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} ${flag}") 31 CHECK_CXX_SOURCE_COMPILES("int main(void) { return 0; }" ${result} 32 ${fail_patterns}) 33 SET(CMAKE_REQUIRED_FLAGS "${SAVE_CMAKE_REQUIRED_FLAGS}") 34ENDMACRO() 35 36FUNCTION(MY_CHECK_AND_SET_COMPILER_FLAG flag_to_set) 37 # At the moment this is gcc-only. 38 # Let's avoid expensive compiler tests on Windows: 39 IF(WIN32) 40 RETURN() 41 ENDIF() 42 STRING(REGEX REPLACE "^-Wno-" "-W" flag_to_check ${flag_to_set}) 43 MY_CHECK_C_COMPILER_FLAG(${flag_to_check}) 44 MY_CHECK_CXX_COMPILER_FLAG(${flag_to_check}) 45 STRING(REGEX REPLACE "[-,= +]" "_" result "${flag_to_check}") 46 FOREACH(lang C CXX) 47 IF (have_${lang}_${result}) 48 IF(ARGN) 49 FOREACH(type ${ARGN}) 50 SET(CMAKE_${lang}_FLAGS_${type} "${CMAKE_${lang}_FLAGS_${type}} ${flag_to_set}" PARENT_SCOPE) 51 ENDFOREACH() 52 ELSE() 53 SET(CMAKE_${lang}_FLAGS "${CMAKE_${lang}_FLAGS} ${flag_to_set}" PARENT_SCOPE) 54 ENDIF() 55 ENDIF() 56 ENDFOREACH() 57ENDFUNCTION() 58