summaryrefslogtreecommitdiffstats
path: root/Tests/FortranModules/CMakeLists.txt
blob: 1e5ff89ec2af273f5a2cb527d5ee3ab2e26c1d16 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
cmake_minimum_required (VERSION 3.9)
project(FortranModules Fortran)

if("${CMAKE_Fortran_COMPILER_ID};${CMAKE_Fortran_SIMULATE_ID}" MATCHES "^Intel(LLVM)?;MSVC$")
  string(APPEND CMAKE_Fortran_FLAGS_DEBUG " -Z7")
  string(APPEND CMAKE_Fortran_FLAGS_RELWITHDEBINFO " -Z7")
endif()

if(NOT DEFINED CMake_TEST_NESTED_MAKE_PROGRAM AND NOT CMAKE_GENERATOR MATCHES "Visual Studio")
  set(CMake_TEST_NESTED_MAKE_PROGRAM "${CMAKE_MAKE_PROGRAM}")
endif()

if("x${CMake_TEST_Fortran_SUBMODULES}" STREQUAL "x"
    AND NOT CMAKE_VERSION VERSION_LESS 3.6.20160923 # for CheckFortranSourceCompiles SRC_EXT
    )
  include(CheckFortranSourceCompiles)
  CHECK_Fortran_SOURCE_COMPILES([[
module parent
  interface
    module function id(x)
       real, intent(in) :: x
       real :: id
    end function id
  end interface
end module parent
submodule ( parent ) child
contains
  module procedure id
    id = x
  end procedure id
end submodule child
program main
end program
]] HAVE_SUBMODULES SRC_EXT F90)
  set(CMake_TEST_Fortran_SUBMODULES ${HAVE_SUBMODULES})
elseif(CMake_TEST_Fortran_SUBMODULES)
  message(STATUS "Enabling Fortran submodule tests by explicit request.")
endif()

add_executable(test_module
  test_module_main.f90
  test_module_implementation.f90
  test_module_interface.f90)

add_executable(test_multi_module
  # Place this first so that we do not get "lucky" and find the module provided
  # by compiling `test_multi_module.f90` first.
  test_multi_module_main.f90
  test_multi_module.f90)
set_property(TARGET test_multi_module PROPERTY
  JOB_POOL_COMPILE multi_module_serial)
set_property(GLOBAL APPEND PROPERTY
  JOB_POOLS multi_module_serial=1)

add_executable(test_use_in_comment_fixedform
  test_use_in_comment_fixedform.f)
set_property(SOURCE test_use_in_comment_fixedform.f PROPERTY Fortran_FORMAT FIXED)
add_executable(test_use_in_comment_freeform
  test_use_in_comment_freeform.f90)
set_property(SOURCE test_use_in_comment_freeform.f90 PROPERTY Fortran_FORMAT FREE)

add_executable(test_in_interface
  in_interface/main.f90
  in_interface/module.f90)

add_definitions(-DFOO -DBAR=1)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
add_executable(test_preprocess test_preprocess.F90 test_preprocess_module.F90)

add_executable(test_non_pp_include test_non_pp_include_main.f90)

# Build the external project separately using a custom target.
# Make sure it uses the same build configuration as this test.
get_property(_isMultiConfig GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
if(_isMultiConfig)
  set(External_CONFIG_TYPE -C "${CMAKE_CFG_INTDIR}")
  set(External_BUILD_TYPE)
else()
  set(External_CONFIG_TYPE)
  set(External_BUILD_TYPE -DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE})
endif()
set(External_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/External")
set(External_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/External")
if("${CMAKE_CURRENT_BINARY_DIR}" MATCHES " ")
  # Our build tree has a space, so the build tool supports spaces.
  # Test using modules from a path with spaces.
  string(APPEND External_BINARY_DIR " Build")
endif()
add_custom_command(
  OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/ExternalProject
  COMMAND ${CMAKE_CTEST_COMMAND}
  ARGS ${External_CONFIG_TYPE}
       --build-and-test
       ${External_SOURCE_DIR}
       ${External_BINARY_DIR}
       --build-noclean
       --build-two-config
       --build-project ExtFort
       --build-generator ${CMAKE_GENERATOR}
       --build-generator-platform "${CMAKE_GENERATOR_PLATFORM}"
       --build-generator-toolset "${CMAKE_GENERATOR_TOOLSET}"
       --build-options -DCMAKE_Fortran_COMPILER:STRING=${CMAKE_Fortran_COMPILER}
                       -DCMAKE_Fortran_FLAGS:STRING=${CMAKE_Fortran_FLAGS}
                       -DCMAKE_Fortran_FLAGS_DEBUG:STRING=${CMAKE_Fortran_FLAGS_DEBUG}
                       -DCMAKE_Fortran_FLAGS_RELEASE:STRING=${CMAKE_Fortran_FLAGS_RELEASE}
                       -DCMAKE_Fortran_FLAGS_MINSIZEREL:STRING=${CMAKE_Fortran_FLAGS_MINSIZEREL}
                       -DCMAKE_Fortran_FLAGS_RELWITHDEBINFO:STRING=${CMAKE_Fortran_FLAGS_RELWITHDEBINFO}
                       -DCMAKE_MAKE_PROGRAM:FILEPATH=${CMake_TEST_NESTED_MAKE_PROGRAM}
                       ${External_BUILD_TYPE}
  VERBATIM
  )
add_custom_target(ExternalTarget ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/ExternalProject)

# Test module output directory if available.
if(CMAKE_Fortran_MODDIR_FLAG)
  set(Library_MODDIR "${CMAKE_CURRENT_BINARY_DIR}/Library/modules")
else()
  set(Library_MODDIR "${CMAKE_CURRENT_BINARY_DIR}/Library")
endif()

add_subdirectory(Library)
add_subdirectory(Subdir)
add_subdirectory(Executable)

if(CMake_TEST_Fortran_SUBMODULES)
  add_subdirectory(Submodules)
endif()

add_subdirectory(Issue25112)
add_subdirectory(Issue25223)
if( # Intel Fortran VS Integration breaks on custom targets with Fortran sources
    NOT CMAKE_GENERATOR MATCHES "Visual Studio")
  add_subdirectory(Issue25252)
  add_subdirectory(Issue25252-iface-target)
endif()
add_subdirectory(Issue25252-iface-sources)

add_subdirectory(Issue25365-target-objects)
add_subdirectory(Issue25365-target-objects-iface)

# Issue#25425
add_subdirectory(ModulesViaTargetObjectsSource)
add_subdirectory(ModulesViaSubdirTargetObjectsSource)
add_subdirectory(ModulesViaTargetObjectsLink)
add_subdirectory(ModulesViaSubdirTargetObjectsLink)