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/CheckCXXSourceRuns
|
||||||
/module/CheckCXXSymbolExists
|
/module/CheckCXXSymbolExists
|
||||||
/module/CheckFortranFunctionExists
|
/module/CheckFortranFunctionExists
|
||||||
|
/module/CheckFortranSourceCompiles
|
||||||
/module/CheckFunctionExists
|
/module/CheckFunctionExists
|
||||||
/module/CheckIncludeFileCXX
|
/module/CheckIncludeFileCXX
|
||||||
/module/CheckIncludeFile
|
/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
|
COMMAND ${CMAKE_COMMAND} -P ${FortranOnly_SOURCE_DIR}/checksayhello.cmake
|
||||||
)
|
)
|
||||||
add_dependencies(checksayhello sayhello)
|
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