Add CheckFortranSourceCompiles module (#14656)
Copy the CheckCSourceCompiles module and port it to Fortran. Extend the FortranOnly test to try using the new module. Suggested-by: Nicolas Bock <nicolasbock@gmail.com>
This commit is contained in:
parent
ebd8fa2256
commit
7386d0d6df
|
@ -23,6 +23,7 @@ All Modules
|
|||
/module/CheckCXXSourceRuns
|
||||
/module/CheckCXXSymbolExists
|
||||
/module/CheckFortranFunctionExists
|
||||
/module/CheckFortranSourceCompiles
|
||||
/module/CheckFunctionExists
|
||||
/module/CheckIncludeFileCXX
|
||||
/module/CheckIncludeFile
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
.. cmake-module:: ../../Modules/CheckFortranSourceCompiles.cmake
|
|
@ -0,0 +1,5 @@
|
|||
add-CheckFortranSourceCompiles
|
||||
------------------------------
|
||||
|
||||
* The :module:`CheckFortranSourceCompiles` module was added to
|
||||
provide a ``CHECK_Fortran_SOURCE_COMPILES`` macro.
|
|
@ -0,0 +1,110 @@
|
|||
#.rst:
|
||||
# CheckFortranSourceCompiles
|
||||
# --------------------------
|
||||
#
|
||||
# Check if given Fortran source compiles and links into an executable::
|
||||
#
|
||||
# CHECK_Fortran_SOURCE_COMPILES(<code> <var> [FAIL_REGEX <fail-regex>])
|
||||
#
|
||||
# The arguments are:
|
||||
#
|
||||
# ``<code>``
|
||||
# Source code to try to compile. It must define a PROGRAM entry point.
|
||||
# ``<var>``
|
||||
# Variable to store whether the source code compiled.
|
||||
# ``<fail-regex>``
|
||||
# Fail if test output matches this regex.
|
||||
#
|
||||
# The following variables may be set before calling this macro to modify
|
||||
# the way the check is run::
|
||||
#
|
||||
# CMAKE_REQUIRED_FLAGS = string of compile command line flags
|
||||
# CMAKE_REQUIRED_DEFINITIONS = list of macros to define (-DFOO=bar)
|
||||
# CMAKE_REQUIRED_INCLUDES = list of include directories
|
||||
# CMAKE_REQUIRED_LIBRARIES = list of libraries to link
|
||||
# CMAKE_REQUIRED_QUIET = execute quietly without messages
|
||||
|
||||
#=============================================================================
|
||||
# Copyright 2005-2009 Kitware, Inc.
|
||||
#
|
||||
# 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.)
|
||||
|
||||
|
||||
|
||||
macro(CHECK_Fortran_SOURCE_COMPILES SOURCE VAR)
|
||||
if(NOT DEFINED "${VAR}")
|
||||
set(_FAIL_REGEX)
|
||||
set(_key)
|
||||
foreach(arg ${ARGN})
|
||||
if("${arg}" MATCHES "^(FAIL_REGEX)$")
|
||||
set(_key "${arg}")
|
||||
elseif(_key)
|
||||
list(APPEND _${_key} "${arg}")
|
||||
else()
|
||||
message(FATAL_ERROR "Unknown argument:\n ${arg}\n")
|
||||
endif()
|
||||
endforeach()
|
||||
set(MACRO_CHECK_FUNCTION_DEFINITIONS
|
||||
"-D${VAR} ${CMAKE_REQUIRED_FLAGS}")
|
||||
if(CMAKE_REQUIRED_LIBRARIES)
|
||||
set(CHECK_Fortran_SOURCE_COMPILES_ADD_LIBRARIES
|
||||
LINK_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES})
|
||||
else()
|
||||
set(CHECK_Fortran_SOURCE_COMPILES_ADD_LIBRARIES)
|
||||
endif()
|
||||
if(CMAKE_REQUIRED_INCLUDES)
|
||||
set(CHECK_Fortran_SOURCE_COMPILES_ADD_INCLUDES
|
||||
"-DINCLUDE_DIRECTORIES:STRING=${CMAKE_REQUIRED_INCLUDES}")
|
||||
else()
|
||||
set(CHECK_Fortran_SOURCE_COMPILES_ADD_INCLUDES)
|
||||
endif()
|
||||
file(WRITE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/src.F"
|
||||
"${SOURCE}\n")
|
||||
|
||||
if(NOT CMAKE_REQUIRED_QUIET)
|
||||
message(STATUS "Performing Test ${VAR}")
|
||||
endif()
|
||||
try_compile(${VAR}
|
||||
${CMAKE_BINARY_DIR}
|
||||
${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/src.F
|
||||
COMPILE_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS}
|
||||
${CHECK_Fortran_SOURCE_COMPILES_ADD_LIBRARIES}
|
||||
CMAKE_FLAGS -DCOMPILE_DEFINITIONS:STRING=${MACRO_CHECK_FUNCTION_DEFINITIONS}
|
||||
"${CHECK_Fortran_SOURCE_COMPILES_ADD_INCLUDES}"
|
||||
OUTPUT_VARIABLE OUTPUT)
|
||||
|
||||
foreach(_regex ${_FAIL_REGEX})
|
||||
if("${OUTPUT}" MATCHES "${_regex}")
|
||||
set(${VAR} 0)
|
||||
endif()
|
||||
endforeach()
|
||||
|
||||
if(${VAR})
|
||||
set(${VAR} 1 CACHE INTERNAL "Test ${VAR}")
|
||||
if(NOT CMAKE_REQUIRED_QUIET)
|
||||
message(STATUS "Performing Test ${VAR} - Success")
|
||||
endif()
|
||||
file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
|
||||
"Performing Fortran SOURCE FILE Test ${VAR} succeded with the following output:\n"
|
||||
"${OUTPUT}\n"
|
||||
"Source file was:\n${SOURCE}\n")
|
||||
else()
|
||||
if(NOT CMAKE_REQUIRED_QUIET)
|
||||
message(STATUS "Performing Test ${VAR} - Failed")
|
||||
endif()
|
||||
set(${VAR} "" CACHE INTERNAL "Test ${VAR}")
|
||||
file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
|
||||
"Performing Fortran SOURCE FILE Test ${VAR} failed with the following output:\n"
|
||||
"${OUTPUT}\n"
|
||||
"Source file was:\n${SOURCE}\n")
|
||||
endif()
|
||||
endif()
|
||||
endmacro()
|
|
@ -43,3 +43,25 @@ add_custom_target(checksayhello ALL
|
|||
COMMAND ${CMAKE_COMMAND} -P ${FortranOnly_SOURCE_DIR}/checksayhello.cmake
|
||||
)
|
||||
add_dependencies(checksayhello sayhello)
|
||||
|
||||
# Exclude this test on IBM XL for now because the check strangely
|
||||
# fails with 'ld: 0706-029 Use a number with the -H flag'.
|
||||
if(NOT CMAKE_Fortran_COMPILER_ID STREQUAL XL)
|
||||
set(err_log ${CMAKE_BINARY_DIR}/CMakeFiles/CMakeError.log)
|
||||
file(REMOVE "${err_log}")
|
||||
include(CheckFortranSourceCompiles)
|
||||
unset(HAVE_PRINT CACHE)
|
||||
CHECK_Fortran_SOURCE_COMPILES([[
|
||||
PROGRAM TEST_HAVE_PRINT
|
||||
PRINT *, 'Hello'
|
||||
END
|
||||
]] HAVE_PRINT)
|
||||
if(NOT HAVE_PRINT)
|
||||
if(EXISTS "${err_log}")
|
||||
file(READ "${err_log}" err)
|
||||
endif()
|
||||
string(REPLACE "\n" "\n " err " ${err}")
|
||||
message(SEND_ERROR "CHECK_Fortran_SOURCE_COMPILES for HAVE_PRINT failed:\n"
|
||||
"${err}")
|
||||
endif()
|
||||
endif()
|
||||
|
|
Loading…
Reference in New Issue