|
|
|
cmake_minimum_required (VERSION 2.8)
|
|
|
|
project(FortranOnly Fortran)
|
|
|
|
message("CTEST_FULL_OUTPUT ")
|
|
|
|
|
|
|
|
# create a library with hello and world functions
|
|
|
|
add_library(FortranOnlylib hello.f world.f)
|
|
|
|
set_property(TARGET FortranOnlylib PROPERTY Fortran_FORMAT FIXED)
|
|
|
|
set_property(SOURCE world.f PROPERTY Fortran_FORMAT FREE)
|
|
|
|
|
|
|
|
# create an executable that calls hello and world
|
|
|
|
add_executable(FortranOnly1 testf.f)
|
|
|
|
set_property(TARGET FortranOnly1 PROPERTY OUTPUT_NAME FortranOnly)
|
|
|
|
target_link_libraries(FortranOnly1 FortranOnlylib)
|
|
|
|
|
|
|
|
# Test that Fortran+RC work together.
|
|
|
|
# FIXME: Add .rc in more cases.
|
|
|
|
if(CMAKE_GENERATOR MATCHES "Visual Studio")
|
|
|
|
set(test_rc testRC.rc)
|
|
|
|
endif()
|
|
|
|
|
|
|
|
# create a custom command that runs FortranOnly1 and puts
|
|
|
|
# the output into the file testfhello.txt
|
|
|
|
add_custom_command(OUTPUT ${FortranOnly_BINARY_DIR}/testfhello.txt
|
|
|
|
COMMAND FortranOnly1
|
|
|
|
> testfhello.txt)
|
|
|
|
# create a second executable FortranOnly2 that has
|
|
|
|
# testfhello.txt has an source file so that it will
|
|
|
|
# run the above custom command.
|
|
|
|
add_executable(FortranOnly2 testfhello.txt testf.f ${test_rc})
|
|
|
|
target_link_libraries(FortranOnly2 FortranOnlylib)
|
|
|
|
# create a custom target to check the content of testfhello.txt
|
|
|
|
# by running the cmake script checktestf2.cmake
|
|
|
|
add_custom_target(checktestf2 ALL
|
|
|
|
COMMAND ${CMAKE_COMMAND}
|
|
|
|
-P ${FortranOnly_SOURCE_DIR}/checktestf2.cmake)
|
|
|
|
|
|
|
|
# create a custom target that runs FortranOnly1 executable and creates
|
|
|
|
# a file out.txt that should have hello world in it.
|
|
|
|
add_custom_target(sayhello ALL
|
|
|
|
COMMAND FortranOnly1 > out.txt
|
|
|
|
)
|
|
|
|
# make sure stuff is built in the right order
|
|
|
|
add_dependencies(checktestf2 FortranOnly2)
|
|
|
|
add_dependencies(sayhello FortranOnly1)
|
|
|
|
add_dependencies(FortranOnly2 FortranOnly1)
|
|
|
|
|
|
|
|
# add a custom target that checks that out.txt has the correct
|
|
|
|
# content
|
|
|
|
add_custom_target(checksayhello ALL
|
|
|
|
COMMAND ${CMAKE_COMMAND} -P ${FortranOnly_SOURCE_DIR}/checksayhello.cmake
|
|
|
|
)
|
|
|
|
add_dependencies(checksayhello sayhello)
|
|
|
|
|
|
|
|
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()
|
|
|
|
|
|
|
|
unset(Fortran_BOGUS_FLAG CACHE)
|
|
|
|
include(CheckFortranCompilerFlag)
|
|
|
|
CHECK_Fortran_COMPILER_FLAG(-_this_is_not_a_flag_ Fortran_BOGUS_FLAG)
|
|
|
|
if (Fortran_BOGUS_FLAG)
|
|
|
|
message(SEND_ERROR "CHECK_Fortran_COMPILER_FLAG() succeeded, but should have failed")
|
|
|
|
endif()
|
|
|
|
|
|
|
|
unset(Fortran_RUN_FLAG CACHE)
|
|
|
|
include(CheckFortranSourceRuns)
|
|
|
|
check_fortran_source_runs("program a; end program" Fortran_RUN_FLAG SRC_EXT F90)
|
|
|
|
if(NOT Fortran_RUN_FLAG)
|
|
|
|
message(SEND_ERROR "CHECK_Fortran_SOURCE_RUNS() failed")
|
|
|
|
endif()
|
|
|
|
|
|
|
|
# Test generation of preprocessed sources.
|
|
|
|
if("${CMAKE_GENERATOR}" MATCHES "Makefile" AND CMAKE_MAKE_PROGRAM)
|
|
|
|
if(CMAKE_Fortran_CREATE_PREPROCESSED_SOURCE)
|
|
|
|
# Skip running this part of the test on certain platforms
|
|
|
|
# until they are fixed.
|
|
|
|
set(MAYBE_ALL ALL)
|
|
|
|
list(LENGTH CMAKE_OSX_ARCHITECTURES ARCH_COUNT)
|
|
|
|
if(ARCH_COUNT GREATER 1)
|
|
|
|
# OSX does not support preprocessing more than one architecture.
|
|
|
|
set(MAYBE_ALL)
|
|
|
|
endif()
|
|
|
|
|
|
|
|
add_executable(preprocess preprocess.F)
|
|
|
|
|
|
|
|
# Custom target to try preprocessing invocation.
|
|
|
|
add_custom_target(test_preprocess ${MAYBE_ALL}
|
|
|
|
COMMAND ${CMAKE_COMMAND} -E rm -f CMakeFiles/preprocess.dir/preprocess.F.i
|
|
|
|
COMMAND ${CMAKE_MAKE_PROGRAM} preprocess.i
|
|
|
|
COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_SOURCE_DIR}/test_preprocess.cmake
|
|
|
|
# Remove bogus file some compilers leave behind.
|
|
|
|
COMMAND ${CMAKE_COMMAND} -E rm -f ${CMAKE_CURRENT_SOURCE_DIR}/preprocess.s
|
|
|
|
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
|
|
|
|
)
|
|
|
|
endif()
|
|
|
|
endif()
|
|
|
|
|
|
|
|
# Test that with Intel Fortran we always compile with preprocessor
|
|
|
|
# defines even if splitting the preprocessing and compilation steps.
|
|
|
|
if(CMAKE_Fortran_COMPILER_ID STREQUAL "Intel")
|
|
|
|
add_executable(IntelIfDef IntelIfDef.f)
|
|
|
|
set_property(TARGET IntelIfDef PROPERTY Fortran_FORMAT FIXED)
|
|
|
|
target_compile_definitions(IntelIfDef PRIVATE SOME_DEF)
|
|
|
|
endif()
|
|
|
|
|
|
|
|
# Skip these tests if compiler/version doesn't have preprocessing flags
|
|
|
|
if((CMAKE_Fortran_COMPILER_ID STREQUAL "GNU" AND CMAKE_Fortran_COMPILER_VERSION VERSION_LESS 4.4)
|
|
|
|
OR (CMAKE_Fortran_COMPILER_ID STREQUAL "XL" AND CMAKE_Fortran_COMPILER_VERSION VERSION_LESS 15.1.6))
|
|
|
|
set(test_pp_flags 0)
|
|
|
|
else()
|
|
|
|
set(test_pp_flags 1)
|
|
|
|
endif()
|
|
|
|
|
|
|
|
if(test_pp_flags)
|
|
|
|
# Test that we can always preprocess a target
|
|
|
|
add_executable(preprocess_target preprocess2.f)
|
|
|
|
set_property(TARGET preprocess_target PROPERTY Fortran_PREPROCESS ON)
|
|
|
|
|
|
|
|
# Test that we can preprocess a single source file
|
|
|
|
add_executable(preprocess_source preprocess3.f)
|
|
|
|
set_property(SOURCE preprocess3.f PROPERTY Fortran_PREPROCESS ON)
|
|
|
|
endif()
|
|
|
|
|
|
|
|
# Test that neither the compiler nor CMake performs unnecessary preprocessing.
|
|
|
|
add_library(no_preprocess_target_lower STATIC no_preprocess_target_lower.f)
|
|
|
|
target_compile_options(no_preprocess_target_lower PRIVATE -DINTEGER=nonsense)
|
|
|
|
set_property(TARGET no_preprocess_target_lower PROPERTY Fortran_PREPROCESS OFF)
|
|
|
|
add_library(no_preprocess_source_lower STATIC no_preprocess_source_lower.f)
|
|
|
|
target_compile_options(no_preprocess_source_lower PRIVATE -DINTEGER=nonsense)
|
|
|
|
set_property(SOURCE no_preprocess_source_lower.f PROPERTY Fortran_PREPROCESS OFF)
|
|
|
|
|
|
|
|
# Test that we can explicitly not preprocess a target or source.
|
|
|
|
# This will not work on certain compilers due to either missing a
|
|
|
|
# "don't preprocess" flag, or due to choice of file extension.
|
|
|
|
if(test_pp_flags AND NOT CMAKE_Fortran_COMPILER_ID MATCHES "(Flang|NAG|PGI|SunPro|XL)")
|
|
|
|
add_library(no_preprocess_target STATIC no_preprocess_target_upper.F)
|
|
|
|
target_compile_options(no_preprocess_target PRIVATE -DINTEGER=nonsense)
|
|
|
|
add_library(no_preprocess_source STATIC no_preprocess_source_upper.F)
|
|
|
|
target_compile_options(no_preprocess_source PRIVATE -DINTEGER=nonsense)
|
|
|
|
if(NOT CMAKE_Fortran_COMPILER_ID STREQUAL "Cray"
|
|
|
|
AND NOT "${CMAKE_Fortran_COMPILER_ID};${CMAKE_Fortran_SIMULATE_ID}" STREQUAL "Intel;MSVC")
|
|
|
|
target_sources(no_preprocess_target PRIVATE no_preprocess_target_fpp.fpp)
|
|
|
|
target_sources(no_preprocess_source PRIVATE no_preprocess_source_fpp.fpp)
|
|
|
|
endif()
|
|
|
|
set_property(TARGET no_preprocess_target PROPERTY Fortran_PREPROCESS OFF)
|
|
|
|
set_property(SOURCE no_preprocess_source_upper.F no_preprocess_source_fpp.fpp PROPERTY Fortran_PREPROCESS OFF)
|
|
|
|
endif()
|