I have modified the patch and added error messages for NAG and PGI compilers. I have also fixed the FAIL_REGEX in the module itself to read "not for Fortran" instead of "... for C".
>From 452602f4b125eb89c114d9e1b3db6ee78b04d0b1 Mon Sep 17 00:00:00 2001 From: Nicolas Bock <[email protected]> Date: Mon, 2 Feb 2015 17:07:04 -0700 Subject: [PATCH] New Module: CheckFortranCompilerFlags.cmake This module is based on the existing CheckCCompilerFlags.cmake. --- Modules/CMakeCheckCompilerFlagCommonPatterns.cmake | 5 +- Modules/CheckFortranCompilerFlag.cmake | 65 ++++++++++++++++++++++ 2 files changed, 68 insertions(+), 2 deletions(-) create mode 100644 Modules/CheckFortranCompilerFlag.cmake diff --git a/Modules/CMakeCheckCompilerFlagCommonPatterns.cmake b/Modules/CMakeCheckCompilerFlagCommonPatterns.cmake index 19b2bbc..3141d60 100644 --- a/Modules/CMakeCheckCompilerFlagCommonPatterns.cmake +++ b/Modules/CMakeCheckCompilerFlagCommonPatterns.cmake @@ -21,9 +21,9 @@ macro (CHECK_COMPILER_FLAG_COMMON_PATTERNS _VAR) set(${_VAR} - FAIL_REGEX "unrecognized .*option" # GNU + FAIL_REGEX "[Uu]nrecogni[sz]ed .*option" # GNU, NAG FAIL_REGEX "unknown .*option" # Clang - FAIL_REGEX "ignoring unknown option" # MSVC + FAIL_REGEX "ignoring unknown option" # MSVC, Intel FAIL_REGEX "warning D9002" # MSVC, any lang FAIL_REGEX "option.*not supported" # Intel FAIL_REGEX "invalid argument .*option" # Intel @@ -35,6 +35,7 @@ macro (CHECK_COMPILER_FLAG_COMMON_PATTERNS _VAR) FAIL_REGEX "command option .* contains an incorrect subargument" # XL FAIL_REGEX "not supported in this configuration. ignored" # AIX FAIL_REGEX "File with unknown suffix passed to linker" # PGI + FAIL_REGEX "[Uu]nknown switch" # PGI FAIL_REGEX "WARNING: unknown flag:" # Open64 FAIL_REGEX "Incorrect command line option:" # Borland FAIL_REGEX "Warning: illegal option" # SunStudio 12 diff --git a/Modules/CheckFortranCompilerFlag.cmake b/Modules/CheckFortranCompilerFlag.cmake new file mode 100644 index 0000000..479ff9f --- /dev/null +++ b/Modules/CheckFortranCompilerFlag.cmake @@ -0,0 +1,65 @@ +#.rst: +# CheckCCompilerFlag +# ------------------ +# +# Check whether the Fortran compiler supports a given flag. +# +# CHECK_Fortran_COMPILER_FLAG(<flag> <var>) +# +# :: +# +# <flag> - the compiler flag +# <var> - variable to store the result +# Will be created as an internal cache variable. +# +# This internally calls the check_fortran_source_compiles macro and +# sets CMAKE_REQUIRED_DEFINITIONS to <flag>. See help for +# CheckFortranSourceCompiles for a listing of variables that can +# otherwise modify the build. The result only tells that the compiler +# does not give an error message when it encounters the flag. If the +# flag has any effect or even a specific one is beyond the scope of +# this module. + +#============================================================================= +# Copyright 2006-2011 Kitware, Inc. +# Copyright 2006 Alexander Neundorf <[email protected]> +# Copyright 2011 Matthias Kretz <[email protected]> +# +# Distributed under the OSI-approved BSD License (the "License"); +# see accompanying file Copyright.txt for details. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. +#============================================================================= +# (To distribute this file outside of CMake, substitute the full +# License text for the above reference.) + +include(CheckFortranSourceCompiles) +include(CMakeCheckCompilerFlagCommonPatterns) + +macro (CHECK_Fortran_COMPILER_FLAG _FLAG _RESULT) + set(SAFE_CMAKE_REQUIRED_DEFINITIONS "${CMAKE_REQUIRED_DEFINITIONS}") + set(CMAKE_REQUIRED_DEFINITIONS "${_FLAG}") + + # Normalize locale during test compilation. + set(_CheckFortranCompilerFlag_LOCALE_VARS LC_ALL LC_MESSAGES LANG) + foreach(v ${_CheckFortranCompilerFlag_LOCALE_VARS}) + set(_CheckFortranCompilerFlag_SAVED_${v} "$ENV{${v}}") + set(ENV{${v}} C) + endforeach() + CHECK_COMPILER_FLAG_COMMON_PATTERNS(_CheckFortranCompilerFlag_COMMON_PATTERNS) + CHECK_Fortran_SOURCE_COMPILES(" program test\n stop\n end program" ${_RESULT} + # Some compilers do not fail with a bad flag + FAIL_REGEX "command line option .* is valid for .* but not for Fortran" # GNU + ${_CheckFortranCompilerFlag_COMMON_PATTERNS} + ) + foreach(v ${_CheckFortranCompilerFlag_LOCALE_VARS}) + set(ENV{${v}} ${_CheckFortranCompilerFlag_SAVED_${v}}) + unset(_CheckFortranCompilerFlag_SAVED_${v}) + endforeach() + unset(_CheckFortranCompilerFlag_LOCALE_VARS) + unset(_CheckFortranCompilerFlag_COMMON_PATTERNS) + + set (CMAKE_REQUIRED_DEFINITIONS "${SAFE_CMAKE_REQUIRED_DEFINITIONS}") +endmacro () -- 2.0.5 On Tue, Feb 3, 2015 at 1:21 PM, Nicolas Bock <[email protected]> wrote: > On Tue, Feb 3, 2015 at 1:18 PM, Brad King <[email protected]> wrote: >> On 02/03/2015 07:46 AM, Nicolas Bock wrote: >>> please find attached a patch based on >>> 460f7bcb7d11e905ee025c9d9cc9629d597fa91b. >> >> Thanks. Was this based on CheckCCompilerFlag from that version too? >> > Yes. > >> On 02/01/2015 04:18 AM, Rolf Eike Beer wrote: >>> Also I don't know if it makes sense to check for certain flags that look >>> specific to C++. Which compilers did you use to test? >> >> Agreed. Do you have example failure messages from any compilers? >> > I will collect some. > >> Local testing of GNU Fortran 4.9 shows that bad flags are rejected with >> an error. Do we need the pattern matches for any Fortran compilers? > I have tested with gcc and Intel (ifort). Ifort gives out warnings for > illegal flags, stating that it will ignore them. In my (very basic) > testing the warning lead to test failure of the module, i.e.. it lead > to the correct behavior. I have access to PGI and possibly NAG's > compilers as well and will test whether error messages are caught. > >> >>> + # Some compilers do not fail with a bad flag >>> + FAIL_REGEX "command line option .* is valid for .* but not for C" # >>> GNU >>> + ${_CheckFortranCompilerFlag_COMMON_PATTERNS} >> >> Certainly the "but not for C" message will not show up from a >> Fortran compiler. >> > Oops, yes good point. > >> Thanks, >> -Brad >> -- Powered by www.kitware.com Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ Kitware offers various services to support the CMake community. For more information on each offering, please visit: CMake Support: http://cmake.org/cmake/help/support.html CMake Consulting: http://cmake.org/cmake/help/consulting.html CMake Training Courses: http://cmake.org/cmake/help/training.html Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html Follow this link to subscribe/unsubscribe: http://public.kitware.com/mailman/listinfo/cmake-developers
