Added own CMake macro for compiler flag checks (to not depend on CMake version)
authorAndrey Kamaev <no@email>
Tue, 12 Jun 2012 16:11:30 +0000 (16:11 +0000)
committerAndrey Kamaev <no@email>
Tue, 12 Jun 2012 16:11:30 +0000 (16:11 +0000)
cmake/OpenCVCompilerOptions.cmake
cmake/OpenCVUtils.cmake

index 0c7e8a0..67cce54 100644 (file)
@@ -50,15 +50,9 @@ endmacro()
 if(MINGW)
   # http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40838
   # here we are trying to workaround the problem
-  include(CheckCXXCompilerFlag)
-  CHECK_CXX_COMPILER_FLAG(-mstackrealign HAVE_STACKREALIGN_FLAG)
-  if(HAVE_STACKREALIGN_FLAG)
-    set(OPENCV_EXTRA_FLAGS "${OPENCV_EXTRA_FLAGS} -mstackrealign")
-  else()
-    CHECK_CXX_COMPILER_FLAG(-mpreferred-stack-boundary=2 HAVE_PREFERRED_STACKBOUNDARY_FLAG)
-    if(HAVE_PREFERRED_STACKBOUNDARY_FLAG)
-      set(OPENCV_EXTRA_FLAGS "${OPENCV_EXTRA_FLAGS} -mstackrealign")
-    endif()
+  add_extra_compiler_option(-mstackrealign)
+  if(NOT HAVE_CXX_MSTACKREALIGN)
+    add_extra_compiler_option(-mpreferred-stack-boundary=2)
   endif()
 endif()
 
index 638ebc8..a968465 100644 (file)
@@ -32,14 +32,62 @@ macro(ocv_clear_vars)
   endforeach()
 endmacro()
 
-
-include(CheckCXXCompilerFlag)
-include(CheckCCompilerFlag)
+set(OCV_COMPILER_FAIL_REGEX
+    "command line option .* is valid for .* but not for C\\+\\+" # GNU
+    "unrecognized .*option"                     # GNU
+    "unknown .*option"                          # Clang
+    "ignoring unknown option"                   # MSVC
+    "warning D9002"                             # MSVC, any lang
+    "option .*not supported"                    # Intel
+    "[Uu]nknown option"                         # HP
+    "[Ww]arning: [Oo]ption"                     # SunPro
+    "command option .* is not recognized"       # XL
+    "not supported in this configuration; ignored"       # AIX
+    "File with unknown suffix passed to linker" # PGI
+    "WARNING: unknown flag:"                    # Open64
+  )
+
+MACRO(ocv_check_compiler_flag LANG FLAG RESULT)
+  if("_${LANG}_" MATCHES "_CXX_")
+    set(_fname "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/src.cxx")
+    FILE(WRITE "${_fname}" "int main() { return 0;}\n")
+  elseif("_${LANG}_" MATCHES "_C_")
+    set(_fname "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/src.c")
+    FILE(WRITE "${_fname}" "int main(void) { return 0;}\n")
+  else()
+    unset(_fname)
+  endif()
+  if(_fname)
+    MESSAGE(STATUS "Performing Test ${RESULT}")
+    TRY_COMPILE(${RESULT}
+      ${CMAKE_BINARY_DIR}
+      "${_fname}"
+      COMPILE_DEFINITIONS "${FLAG}"
+      OUTPUT_VARIABLE OUTPUT)
+  
+    FOREACH(_regex ${OCV_COMPILER_FAIL_REGEX})
+      IF("${OUTPUT}" MATCHES "${_regex}")
+        SET(${RESULT} 0)
+        break()
+      ENDIF()
+    ENDFOREACH()
+
+    IF(${RESULT})
+      SET(${RESULT} 1 CACHE INTERNAL "Test ${RESULT}")
+      MESSAGE(STATUS "Performing Test ${RESULT} - Success")
+    ELSE(${RESULT})
+      MESSAGE(STATUS "Performing Test ${RESULT} - Failed")
+      SET(${RESULT} "" CACHE INTERNAL "Test ${RESULT}")
+    ENDIF(${RESULT})
+  else()
+    SET(${RESULT} 0)
+  endif()
+ENDMACRO()
 
 macro(ocv_check_flag_support lang flag varname)
   if("_${lang}_" MATCHES "_CXX_")
     set(_lang CXX)
-  elseif("_${lang}_" MATCHES ".*_C_.*")
+  elseif("_${lang}_" MATCHES "_C_")
     set(_lang C)
   else()
     set(_lang ${lang})
@@ -49,13 +97,7 @@ macro(ocv_check_flag_support lang flag varname)
   string(REGEX REPLACE "^(/|-)" "HAVE_${_lang}_" ${varname} "${${varname}}")
   string(REGEX REPLACE " -|-|=| |\\." "_" ${varname} "${${varname}}")
 
-  if(_lang STREQUAL "CXX")
-    CHECK_CXX_COMPILER_FLAG("${ARGN} ${flag}" ${${varname}})
-  elseif(_lang STREQUAL "C")
-    CHECK_C_COMPILER_FLAG("${ARGN} ${flag}" ${${varname}})
-  else()
-    set(${varname} FALSE)
-  endif()
+  ocv_check_compiler_flag("${_lang}" "${ARGN} ${flag}" ${${varname}})
 endmacro()
 
 # turns off warnings