From ec963f04cb713701dda9f12a433930845e5c2609 Mon Sep 17 00:00:00 2001 From: Brad King Date: Wed, 13 Jul 2016 10:53:37 -0400 Subject: FindOpenMP: Improve documentation formatting Also drop link to OpenMP compilers because our supported list may not include all compilers. --- Modules/FindOpenMP.cmake | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/Modules/FindOpenMP.cmake b/Modules/FindOpenMP.cmake index ee4bdd6..c8f716e 100644 --- a/Modules/FindOpenMP.cmake +++ b/Modules/FindOpenMP.cmake @@ -12,17 +12,14 @@ # # 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 -# -# -# -# Supported compilers can be found at -# http://openmp.org/wp/openmp-compilers/ +# ``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. #============================================================================= # Copyright 2009 Kitware, Inc. -- cgit v0.12 From 8f1103c0fd5e51cbbfc6f66ada72fbead53297d6 Mon Sep 17 00:00:00 2001 From: Brad King Date: Wed, 13 Jul 2016 11:01:01 -0400 Subject: FindOpenMP: Cleanup all variables unconditionally --- Modules/FindOpenMP.cmake | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Modules/FindOpenMP.cmake b/Modules/FindOpenMP.cmake index c8f716e..768db12 100644 --- a/Modules/FindOpenMP.cmake +++ b/Modules/FindOpenMP.cmake @@ -186,7 +186,6 @@ if(CMAKE_CXX_COMPILER_LOADED) list(APPEND _OPENMP_REQUIRED_VARS OpenMP_CXX_FLAGS) unset(OpenMP_CXX_FLAG_CANDIDATES) - unset(OpenMP_CXX_TEST_SOURCE) endif() # check Fortran compiler @@ -220,7 +219,6 @@ if(CMAKE_Fortran_COMPILER_LOADED) list(APPEND _OPENMP_REQUIRED_VARS OpenMP_Fortran_FLAGS) unset(OpenMP_Fortran_FLAG_CANDIDATES) - unset(OpenMP_Fortran_TEST_SOURCE) endif() set(CMAKE_REQUIRED_QUIET ${CMAKE_REQUIRED_QUIET_SAVE}) @@ -237,3 +235,7 @@ 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) -- cgit v0.12 From 73e9f36ea6a64fa1a5f2f8ab39c5981b2a64aa5e Mon Sep 17 00:00:00 2001 From: Sujin Philip Date: Wed, 13 Jul 2016 11:12:38 -0400 Subject: FindOpenMP: Detect version (specification date) from compiler Port changes from VTK commit fda6a31cb9 (Added Improved FindOpenMP module, 2015-04-23). Improve use of try_compile to avoid needing to pass OpenMP flags as libraries. --- Help/release/dev/FindOpenMP-updates.rst | 5 ++ Modules/FindOpenMP.cmake | 102 ++++++++++++++++++++++++++++++++ 2 files changed, 107 insertions(+) create mode 100644 Help/release/dev/FindOpenMP-updates.rst 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 768db12..a788832 100644 --- a/Modules/FindOpenMP.cmake +++ b/Modules/FindOpenMP.cmake @@ -20,6 +20,19 @@ # 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. +# +# 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. @@ -119,6 +132,75 @@ set(OpenMP_Fortran_TEST_SOURCE " ) +set(OpenMP_C_CXX_CHECK_VERSION_SOURCE +" +#include +#include +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, @@ -150,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 @@ -186,6 +274,12 @@ if(CMAKE_CXX_COMPILER_LOADED) list(APPEND _OPENMP_REQUIRED_VARS OpenMP_CXX_FLAGS) unset(OpenMP_CXX_FLAG_CANDIDATES) + + 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 @@ -219,6 +313,12 @@ if(CMAKE_Fortran_COMPILER_LOADED) list(APPEND _OPENMP_REQUIRED_VARS OpenMP_Fortran_FLAGS) unset(OpenMP_Fortran_FLAG_CANDIDATES) + + 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}) @@ -239,3 +339,5 @@ 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) -- cgit v0.12