Browse Source

ENH: add openmp support

Bill Hoffman 17 years ago
parent
commit
0dd0e2d6e6
1 changed files with 108 additions and 0 deletions
  1. 108 0
      Modules/FindOpenMP.cmake

+ 108 - 0
Modules/FindOpenMP.cmake

@@ -0,0 +1,108 @@
+# - Finds OpenMP support
+# This module can be used to detect OpenMP support in a compiler.
+# If the compiler supports OpenMP, the flags required to compile with
+# openmp support are set.  
+#
+# The following variables are set:
+#   OpenMP_C_FLAGS - flags to add to the C compiler for OpenMP support
+#   OpenMP_CXX_FLAGS - flags to add to the CXX compiler for OpenMP support
+#   OPENMP_FOUND - true if openmp is detected
+#
+# Supported compilers can be found at http://openmp.org/wp/openmp-compilers/
+
+
+# Copyright 2008, 2009 <André Rigland Brodtkorb> [email protected]
+#
+# Redistribution AND use is allowed according to the terms of the New 
+# BSD license. 
+# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
+
+
+include(CheckCSourceCompiles)
+include(CheckCXXSourceCompiles)
+include(FindPackageHandleStandardArgs)
+
+set(OpenMP_C_FLAG_CANDIDATES
+  #Empty, if compiler automatically accepts openmp
+  " "
+  #Intel windows
+  "-Qopenmp" 
+  #Intel
+  "-openmp" 
+  #Sun
+  "-xopenmp"
+  #HP
+  "+Oopenmp"
+  #IBM XL C/c++
+  "-qsmp"
+  #Portland Group
+  "-mp"
+  #Gnu
+  "-fopenmp"
+  #Microsoft Visual Studio
+  "/openmp"
+)
+set(OpenMP_CXX_FLAG_CANDIDATES ${OpenMP_C_FLAG_CANDIDATES})
+
+# sample openmp source code to test
+set(OpenMP_C_TEST_SOURCE 
+"
+#include <omp.h>
+int main() { 
+#ifdef _OpenMP
+  return 0; 
+#else
+  breaks_on_purpose
+#endif
+}
+")
+# use the same source for CXX as C for now
+set(OpenMP_CXX_TEST_SOURCE ${OpenMP_C_TEST_SOURCE})
+# if these are set then do not try to find them again,
+# by avoiding any try_compiles for the flags
+if(DEFINED OpenMP_C_FLAGS AND DEFINED OpenMP_CXX_FLAGS)
+  set(OpenMP_C_FLAG_CANDIDATES)
+  set(OpenMP_CXX_FLAG_CANDIDATES)
+endif(DEFINED OpenMP_C_FLAGS AND DEFINED OpenMP_CXX_FLAGS)
+
+# check c compiler
+foreach(FLAG ${OpenMP_C_FLAG_CANDIDATES})
+  set(SAFE_CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
+  set(CMAKE_REQUIRED_FLAGS "${FLAG}")
+  unset(OpenMP_FLAG_DETECTED CACHE)
+  message(STATUS "Try OpenMP flag = [${FLAG}]")
+  check_c_source_compiles("${OpenMP_CXX_TEST_SOURCE}" OpenMP_FLAG_DETECTED)
+  set(CMAKE_REQUIRED_FLAGS "${SAFE_CMAKE_REQUIRED_FLAGS}")
+  if(OpenMP_FLAG_DETECTED)
+    set(OpenMP_C_FLAGS_INTERNAL "${FLAG}")
+    break()
+  endif(OpenMP_FLAG_DETECTED) 
+endforeach(FLAG ${OpenMP_C_FLAG_CANDIDATES})
+
+# check cxx compiler
+foreach(FLAG ${OpenMP_CXX_FLAG_CANDIDATES})
+  set(SAFE_CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
+  set(CMAKE_REQUIRED_FLAGS "${FLAG}")
+  unset(OpenMP_FLAG_DETECTED CACHE)
+  message(STATUS "Try OpenMP flag = [${FLAG}]")
+  check_cxx_source_compiles("${OpenMP_C_TEST_SOURCE}" OpenMP_FLAG_DETECTED)
+  set(CMAKE_REQUIRED_FLAGS "${SAFE_CMAKE_REQUIRED_FLAGS}")
+  if(OpenMP_FLAG_DETECTED)
+    set(OpenMP_CXX_FLAGS_INTERNAL "${FLAG}")
+    break()
+  endif(OpenMP_FLAG_DETECTED)
+endforeach(FLAG ${OpenMP_CXX_FLAG_CANDIDATES})
+
+set(OpenMP_C_FLAGS "${OpenMP_C_FLAGS_INTERNAL}"
+  CACHE STRING "C compiler flags for OpenMP parallization")
+
+set(OpenMP_CXX_FLAGS "${OpenMP_CXX_FLAGS_INTERNAL}"
+  CACHE STRING "C++ compiler flags for OpenMP parallization")
+# handle the standard arguments for find_package
+find_package_handle_standard_args(OpenMP DEFAULT_MSG 
+  OpenMP_C_FLAGS OpenMP_CXX_FLAGS )
+
+mark_as_advanced(
+  OpenMP_C_FLAGS
+  OpenMP_CXX_FLAGS
+)