Test for compiler features, instead of for specific platforms.

This commit is contained in:
Stephen Kelly 2011-08-11 18:18:19 +02:00
parent 9554e1013e
commit e1f7ee3de7
2 changed files with 24 additions and 18 deletions

View File

@ -115,6 +115,20 @@
include(CMakeParseArguments) include(CMakeParseArguments)
include(CheckCXXCompilerFlag) include(CheckCXXCompilerFlag)
# TODO: Install this macro separately?
macro(_check_cxx_compiler_attribute _ATTRIBUTE _RESULT)
check_cxx_source_compiles("${_ATTRIBUTE} int somefunc() { return 0; } int main() { return somefunc();}" ${_RESULT}
# Some compilers do not fail with a bad flag
FAIL_REGEX "unrecognized .*option" # GNU
FAIL_REGEX "ignoring unknown option" # MSVC
FAIL_REGEX "warning D9002" # MSVC, any lang
FAIL_REGEX "[Uu]nknown option" # HP
FAIL_REGEX "[Ww]arning: [Oo]ption" # SunPro
FAIL_REGEX "command option .* is not recognized" # XL
)
endmacro()
macro(_test_compiler_hidden_visibility) macro(_test_compiler_hidden_visibility)
if (CMAKE_COMPILER_IS_GNUCXX) if (CMAKE_COMPILER_IS_GNUCXX)
@ -141,15 +155,11 @@ macro(_test_compiler_hidden_visibility)
endmacro() endmacro()
macro(_test_compiler_has_deprecated) macro(_test_compiler_has_deprecated)
if (WIN32) _check_cxx_compiler_attribute("__declspec(deprecated)" COMPILER_HAS_DEPRECATED_DECLSPEC)
if (NOT ${CMAKE_CXX_COMPILER_ID} MATCHES Borland) if(COMPILER_HAS_DEPRECATED_DECLSPEC)
set(COMPILER_HAS_DEPRECATED TRUE) set(COMPILER_HAS_DEPRECATED ${COMPILER_HAS_DEPRECATED_DECLSPEC})
endif()
else() else()
# TODO: Test properly for this _check_cxx_compiler_attribute("__attribute__((__deprecated__))" COMPILER_HAS_DEPRECATED)
if(COMPILER_HAS_HIDDEN_VISIBILITY AND USE_COMPILER_HIDDEN_VISIBILITY)
set(COMPILER_HAS_DEPRECATED TRUE)
endif()
endif() endif()
set(COMPILER_HAS_DEPRECATED "${COMPILER_HAS_DEPRECATED}" CACHE INTERNAL "Compiler support for a deprecated attribute") set(COMPILER_HAS_DEPRECATED "${COMPILER_HAS_DEPRECATED}" CACHE INTERNAL "Compiler support for a deprecated attribute")
endmacro() endmacro()
@ -162,14 +172,10 @@ macro(_DO_SET_MACRO_VALUES TARGET_LIBRARY)
set(DEFINE_IMPORT) set(DEFINE_IMPORT)
set(DEFINE_NO_EXPORT) set(DEFINE_NO_EXPORT)
if(WIN32) if (COMPILER_HAS_DEPRECATED_DECLSPEC)
if (COMPILER_HAS_DEPRECATED) set(DEFINE_DEPRECATED "__declspec(deprecated)")
set(DEFINE_DEPRECATED "__declspec(deprecated)") elseif(COMPILER_HAS_DEPRECATED)
endif() set(DEFINE_DEPRECATED "__attribute__ ((__deprecated__))")
else()
if(COMPILER_HAS_DEPRECATED)
set(DEFINE_DEPRECATED "__attribute__ ((__deprecated__))")
endif()
endif() endif()
get_property(type TARGET ${TARGET_LIBRARY} PROPERTY TYPE) get_property(type TARGET ${TARGET_LIBRARY} PROPERTY TYPE)

View File

@ -49,7 +49,7 @@ macro(_do_build Include Library LibrarySource Source)
"if(CMAKE_COMPILER_IS_GNUCXX OR (${CMAKE_CXX_COMPILER_ID} MATCHES Clang))\n" "if(CMAKE_COMPILER_IS_GNUCXX OR (${CMAKE_CXX_COMPILER_ID} MATCHES Clang))\n"
" add_definitions(-Werror)\n" " add_definitions(-Werror)\n"
"else()\n" "else()\n"
" if(MSVC)\n" " if(MSVC AND COMPILER_HAS_DEPRECATED)\n"
# Treat deprecation warnings as errors. # Treat deprecation warnings as errors.
" add_definitions(/we4996)\n" " add_definitions(/we4996)\n"
" endif()\n" " endif()\n"
@ -123,7 +123,7 @@ if (CMAKE_COMPILER_IS_GNUCXX OR (${CMAKE_CXX_COMPILER_ID} MATCHES Clang))
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations")
endif() endif()
if(MSVC) if(MSVC AND COMPILER_HAS_DEPRECATED)
add_definitions(/wd4996) add_definitions(/wd4996)
endif() endif()