summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2016-07-14 13:24:14 (GMT)
committerCMake Topic Stage <kwrobot@kitware.com>2016-07-14 13:24:14 (GMT)
commit4e427f4949fbc5d965acce7aebf21d738e39daa8 (patch)
treef5847e57b2a8598f31eb4243b5d7c3036ad8a376
parent6f36dce0cf1eebd26a734b441c0e2412cafe6fc1 (diff)
parent73e9f36ea6a64fa1a5f2f8ab39c5981b2a64aa5e (diff)
downloadCMake-4e427f4949fbc5d965acce7aebf21d738e39daa8.zip
CMake-4e427f4949fbc5d965acce7aebf21d738e39daa8.tar.gz
CMake-4e427f4949fbc5d965acce7aebf21d738e39daa8.tar.bz2
Merge topic 'FindOpenMP-updates'
73e9f36e FindOpenMP: Detect version (specification date) from compiler 8f1103c0 FindOpenMP: Cleanup all variables unconditionally ec963f04 FindOpenMP: Improve documentation formatting
-rw-r--r--Help/release/dev/FindOpenMP-updates.rst5
-rw-r--r--Modules/FindOpenMP.cmake121
2 files changed, 116 insertions, 10 deletions
diff --git a/Help/release/dev/FindOpenMP-updates.rst b/Help/release/dev/FindOpenMP-updates.rst
new file mode 100644
index 0000000..cb29a71
--- /dev/null
+++ b/Help/release/dev/FindOpenMP-updates.rst
@@ -0,0 +1,5 @@
+FindOpenMP-updates
+------------------
+
+* The :module:`FindOpenMP` module learned to detect the OpenMP
+ version (specification date) from the compiler.
diff --git a/Modules/FindOpenMP.cmake b/Modules/FindOpenMP.cmake
index ee4bdd6..a788832 100644
--- a/Modules/FindOpenMP.cmake
+++ b/Modules/FindOpenMP.cmake
@@ -12,17 +12,27 @@
#
# 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_Fortran_FLAGS``
+# Flags to add to the Fortran compiler for OpenMP support.
+# ``OPENMP_FOUND``
+# True if openmp is detected.
#
-# 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_Fortran_FLAGS - flags to add to the Fortran compiler for OpenMP support
-# OPENMP_FOUND - true if openmp is detected
+# The following internal variables are set, if detected:
#
+# ``OpenMP_C_SPEC_DATE``
+# Specification date of OpenMP version of C compiler.
+# ``OpenMP_CXX_SPEC_DATE``
+# Specification date of OpenMP version of CXX compiler.
+# ``OpenMP_Fortran_SPEC_DATE``
+# Specification date of OpenMP version of Fortran compiler.
#
-#
-# Supported compilers can be found at
-# http://openmp.org/wp/openmp-compilers/
+# The specification dates are formatted as integers of the form
+# ``CCYYMM`` where these represent the decimal digits of the century,
+# year, and month.
#=============================================================================
# Copyright 2009 Kitware, Inc.
@@ -122,6 +132,75 @@ set(OpenMP_Fortran_TEST_SOURCE
"
)
+set(OpenMP_C_CXX_CHECK_VERSION_SOURCE
+"
+#include <stdio.h>
+#include <omp.h>
+const char ompver_str[] = { 'I', 'N', 'F', 'O', ':', 'O', 'p', 'e', 'n', 'M',
+ 'P', '-', 'd', 'a', 't', 'e', '[',
+ ('0' + ((_OPENMP/100000)%10)),
+ ('0' + ((_OPENMP/10000)%10)),
+ ('0' + ((_OPENMP/1000)%10)),
+ ('0' + ((_OPENMP/100)%10)),
+ ('0' + ((_OPENMP/10)%10)),
+ ('0' + ((_OPENMP/1)%10)),
+ ']', '\\0' };
+int main(int argc, char *argv[])
+{
+ printf(\"%s\\n\", ompver_str);
+ return 0;
+}
+")
+
+set(OpenMP_Fortran_CHECK_VERSION_SOURCE
+"
+ program omp_ver
+ use omp_lib
+ integer, parameter :: zero = ichar('0')
+ integer, parameter :: ompv = openmp_version
+ character, dimension(24), parameter :: ompver_str =&
+ (/ 'I', 'N', 'F', 'O', ':', 'O', 'p', 'e', 'n', 'M', 'P', '-',&
+ 'd', 'a', 't', 'e', '[',&
+ char(zero + mod(ompv/100000, 10)),&
+ char(zero + mod(ompv/10000, 10)),&
+ char(zero + mod(ompv/1000, 10)),&
+ char(zero + mod(ompv/100, 10)),&
+ char(zero + mod(ompv/10, 10)),&
+ char(zero + mod(ompv/1, 10)), ']' /)
+ print *, ompver_str
+ end program omp_ver
+")
+
+function(_OPENMP_GET_SPEC_DATE LANG SPEC_DATE)
+ set(WORK_DIR ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/FindOpenMP)
+ if("${LANG}" STREQUAL "C")
+ set(SRC_FILE ${WORK_DIR}/ompver.c)
+ file(WRITE ${SRC_FILE} "${OpenMP_C_CXX_CHECK_VERSION_SOURCE}")
+ elseif("${LANG}" STREQUAL "CXX")
+ set(SRC_FILE ${WORK_DIR}/ompver.cpp)
+ file(WRITE ${SRC_FILE} "${OpenMP_C_CXX_CHECK_VERSION_SOURCE}")
+ else() # ("${LANG}" STREQUAL "Fortran")
+ set(SRC_FILE ${WORK_DIR}/ompver.f90)
+ file(WRITE ${SRC_FILE} "${OpenMP_Fortran_CHECK_VERSION_SOURCE}")
+ endif()
+
+ set(BIN_FILE ${WORK_DIR}/ompver_${LANG}.bin)
+ try_compile(OpenMP_TRY_COMPILE_RESULT ${CMAKE_BINARY_DIR} ${SRC_FILE}
+ CMAKE_FLAGS "-DCOMPILE_DEFINITIONS:STRING=${OpenMP_${LANG}_FLAGS}"
+ COPY_FILE ${BIN_FILE})
+
+ if(${OpenMP_TRY_COMPILE_RESULT})
+ file(STRINGS ${BIN_FILE} specstr LIMIT_COUNT 1 REGEX "INFO:OpenMP-date")
+ set(regex_spec_date ".*INFO:OpenMP-date\\[0*([^]]*)\\].*")
+ if("${specstr}" MATCHES "${regex_spec_date}")
+ set(${SPEC_DATE} "${CMAKE_MATCH_1}" PARENT_SCOPE)
+ endif()
+ endif()
+
+ unset(OpenMP_TRY_COMPILE_RESULT CACHE)
+endfunction()
+
+
# check c compiler
if(CMAKE_C_COMPILER_LOADED)
# if these are set then do not try to find them again,
@@ -153,6 +232,12 @@ if(CMAKE_C_COMPILER_LOADED)
list(APPEND _OPENMP_REQUIRED_VARS OpenMP_C_FLAGS)
unset(OpenMP_C_FLAG_CANDIDATES)
+
+ if (NOT OpenMP_C_SPEC_DATE)
+ _OPENMP_GET_SPEC_DATE("C" OpenMP_C_SPEC_DATE_INTERNAL)
+ set(OpenMP_C_SPEC_DATE "${OpenMP_C_SPEC_DATE_INTERNAL}" CACHE
+ INTERNAL "C compiler's OpenMP specification date")
+ endif()
endif()
# check cxx compiler
@@ -189,7 +274,12 @@ if(CMAKE_CXX_COMPILER_LOADED)
list(APPEND _OPENMP_REQUIRED_VARS OpenMP_CXX_FLAGS)
unset(OpenMP_CXX_FLAG_CANDIDATES)
- unset(OpenMP_CXX_TEST_SOURCE)
+
+ if (NOT OpenMP_CXX_SPEC_DATE)
+ _OPENMP_GET_SPEC_DATE("CXX" OpenMP_CXX_SPEC_DATE_INTERNAL)
+ set(OpenMP_CXX_SPEC_DATE "${OpenMP_CXX_SPEC_DATE_INTERNAL}" CACHE
+ INTERNAL "C++ compiler's OpenMP specification date")
+ endif()
endif()
# check Fortran compiler
@@ -223,7 +313,12 @@ if(CMAKE_Fortran_COMPILER_LOADED)
list(APPEND _OPENMP_REQUIRED_VARS OpenMP_Fortran_FLAGS)
unset(OpenMP_Fortran_FLAG_CANDIDATES)
- unset(OpenMP_Fortran_TEST_SOURCE)
+
+ if (NOT OpenMP_Fortran_SPEC_DATE)
+ _OPENMP_GET_SPEC_DATE("Fortran" OpenMP_Fortran_SPEC_DATE_INTERNAL)
+ set(OpenMP_Fortran_SPEC_DATE "${OpenMP_Fortran_SPEC_DATE_INTERNAL}" CACHE
+ INTERNAL "Fortran compiler's OpenMP specification date")
+ endif()
endif()
set(CMAKE_REQUIRED_QUIET ${CMAKE_REQUIRED_QUIET_SAVE})
@@ -240,3 +335,9 @@ if(_OPENMP_REQUIRED_VARS)
else()
message(SEND_ERROR "FindOpenMP requires C or CXX language to be enabled")
endif()
+
+unset(OpenMP_C_TEST_SOURCE)
+unset(OpenMP_CXX_TEST_SOURCE)
+unset(OpenMP_Fortran_TEST_SOURCE)
+unset(OpenMP_C_CXX_CHECK_VERSION_SOURCE)
+unset(OpenMP_Fortran_CHECK_VERSION_SOURCE)