From 353178c7bb964f9f9ea86fb46571be393fb39245 Mon Sep 17 00:00:00 2001 From: Radovan Bast Date: Sun, 13 May 2018 17:17:31 +0200 Subject: [PATCH] refactor OpenMP module; fixes #247 changes: - append flags if either OPENMP_FOUND OR OpenMP_${_lang}_FOUND - do not set OPENMP_FOUND - make version dependence of workaround for CMake < 3.5 more explicit - do not add_definitions(-DHAVE_OPENMP) - rename to omp-flags.cmake to be more explicit and to not silently drop -DHAVE_OPENMP --- modules/omp-flags.cmake | 66 ++++++++++++++++++++++++++++++++++++++ modules/omp.cmake | 71 ----------------------------------------- 2 files changed, 66 insertions(+), 71 deletions(-) create mode 100644 modules/omp-flags.cmake delete mode 100644 modules/omp.cmake diff --git a/modules/omp-flags.cmake b/modules/omp-flags.cmake new file mode 100644 index 0000000..a387f05 --- /dev/null +++ b/modules/omp-flags.cmake @@ -0,0 +1,66 @@ +# (c) https://github.com/coderefinery/autocmake/blob/master/AUTHORS.md +# licensed under BSD-3: https://github.com/coderefinery/autocmake/blob/master/LICENSE + +#.rst: +# +# Enables OpenMP support. +# +# Variables used:: +# +# ENABLE_OPENMP +# OPENMP_FOUND +# +# Variables modified (provided the corresponding language is enabled):: +# +# CMAKE_Fortran_FLAGS +# CMAKE_C_FLAGS +# CMAKE_CXX_FLAGS +# +# autocmake.yml configuration:: +# +# docopt: "--omp Enable OpenMP parallelization [default: False]." +# define: "'-DENABLE_OPENMP={0}'.format(arguments['--omp'])" + +option(ENABLE_OPENMP "Enable OpenMP parallelization" OFF) + +if(ENABLE_OPENMP) + + if(NOT OPENMP_FOUND) + find_package(OpenMP) + endif() + + foreach(_lang C CXX Fortran) + if(DEFINED CMAKE_${_lang}_COMPILER_ID) + if(OPENMP_FOUND OR OpenMP_${_lang}_FOUND) + set(CMAKE_${_lang}_FLAGS "${CMAKE_${_lang}_FLAGS} ${OpenMP_${_lang}_FLAGS}") + endif() + endif() + endforeach() + + if(CMAKE_VERSION VERSION_LESS "3.5") + if(DEFINED CMAKE_Fortran_COMPILER_ID AND NOT DEFINED OpenMP_Fortran_FLAGS) + # we do this in a pedestrian way because the Fortran support is relatively recent + if(CMAKE_Fortran_COMPILER_ID MATCHES GNU) + set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -fopenmp") + endif() + if(CMAKE_Fortran_COMPILER_ID MATCHES Intel) + if(WIN32) + set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -Qopenmp") + elseif("${CMAKE_Fortran_COMPILER_VERSION}" VERSION_LESS "15.0.0.20140528") + set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -openmp") + else() + set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -qopenmp") + endif() + endif() + if(CMAKE_Fortran_COMPILER_ID MATCHES PGI) + set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -mp") + endif() + if(CMAKE_Fortran_COMPILER_ID MATCHES XL) + set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -qsmp=omp") + endif() + if(CMAKE_Fortran_COMPILER_ID MATCHES Cray) + # do nothing in this case + endif() + endif() + endif() +endif() diff --git a/modules/omp.cmake b/modules/omp.cmake deleted file mode 100644 index f63d8de..0000000 --- a/modules/omp.cmake +++ /dev/null @@ -1,71 +0,0 @@ -# (c) https://github.com/coderefinery/autocmake/blob/master/AUTHORS.md -# licensed under BSD-3: https://github.com/coderefinery/autocmake/blob/master/LICENSE - -#.rst: -# -# Enables OpenMP support. -# -# Variables used:: -# -# ENABLE_OPENMP -# OPENMP_FOUND -# -# Variables modified (provided the corresponding language is enabled):: -# -# CMAKE_Fortran_FLAGS -# CMAKE_C_FLAGS -# CMAKE_CXX_FLAGS -# -# autocmake.yml configuration:: -# -# docopt: "--omp Enable OpenMP parallelization [default: False]." -# define: "'-DENABLE_OPENMP={0}'.format(arguments['--omp'])" - -option(ENABLE_OPENMP "Enable OpenMP parallelization" OFF) - -if(ENABLE_OPENMP) - - if(NOT OPENMP_FOUND) - find_package(OpenMP) - endif() - - if(OPENMP_FOUND) - add_definitions(-DHAVE_OPENMP) - if(DEFINED CMAKE_C_COMPILER_ID) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}") - endif() - if(DEFINED CMAKE_CXX_COMPILER_ID) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}") - endif() - if(DEFINED CMAKE_Fortran_COMPILER_ID) - set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} ${OpenMP_Fortran_FLAGS}") - endif() - endif() - - # this is only needed for CMake below 3.5 - if(DEFINED CMAKE_Fortran_COMPILER_ID AND NOT DEFINED OpenMP_Fortran_FLAGS) - # we do this in a pedestrian way because the Fortran support is relatively recent - if(CMAKE_Fortran_COMPILER_ID MATCHES GNU) - set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -fopenmp") - endif() - if(CMAKE_Fortran_COMPILER_ID MATCHES Intel) - if(WIN32) - set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -Qopenmp") - elseif("${CMAKE_Fortran_COMPILER_VERSION}" VERSION_LESS "15.0.0.20140528") - set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -openmp") - else() - set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -qopenmp") - endif() - endif() - if(CMAKE_Fortran_COMPILER_ID MATCHES PGI) - set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -mp") - endif() - if(CMAKE_Fortran_COMPILER_ID MATCHES XL) - set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -qsmp=omp") - endif() - if(CMAKE_Fortran_COMPILER_ID MATCHES Cray) - # do nothing in this case - endif() - set(OPENMP_FOUND TRUE) - endif() -endif()