[cmake-developers] New module: CheckFortranCompilerFlag.cmake

Nicolas Bock nicolasbock at gmail.com
Wed Feb 4 08:21:04 EST 2015


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 <nicolasbock at gmail.com>
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 <neundorf at kde.org>
+# Copyright 2011 Matthias Kretz <kretz at kde.org>
+#
+# 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 <nicolasbock at gmail.com> wrote:
> On Tue, Feb 3, 2015 at 1:18 PM, Brad King <brad.king at kitware.com> 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
>>


More information about the cmake-developers mailing list