[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