blob: 2a65a22ab674c48c0996ddf4db3744669d834268 [file] [log] [blame]
Jean Perier7a6ab392021-10-01 06:58:521#===-- runtime/CMakeLists.txt ----------------------------------------------===#
2#
3# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4# See https://llvm.org/LICENSE.txt for license information.
5# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6#
7#===------------------------------------------------------------------------===#
peter klausler6261c092018-05-16 17:22:338
Martin Storsjöb75a3c92022-07-19 21:47:029if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
Mark de Wevercbaa3592023-05-24 16:12:3210 cmake_minimum_required(VERSION 3.20.0)
Martin Storsjöb75a3c92022-07-19 21:47:0211
David Spickettffc67bb2023-10-02 09:01:1112 project(FlangRuntime C CXX)
Martin Storsjöb75a3c92022-07-19 21:47:0213
14 set(CMAKE_CXX_STANDARD 17)
15 set(CMAKE_CXX_STANDARD_REQUIRED TRUE)
16 set(CMAKE_CXX_EXTENSIONS OFF)
17
18 set(FLANG_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/..")
19
20 set(LLVM_COMMON_CMAKE_UTILS "${FLANG_SOURCE_DIR}/../cmake")
21 set(LLVM_CMAKE_UTILS "${FLANG_SOURCE_DIR}/../llvm/cmake")
Slava Zakharin55c88aa2023-04-24 18:09:5722 set(CLANG_CMAKE_UTILS "${FLANG_SOURCE_DIR}/../clang/cmake")
Martin Storsjöb75a3c92022-07-19 21:47:0223
24 # Add path for custom modules
25 list(INSERT CMAKE_MODULE_PATH 0
26 "${FLANG_SOURCE_DIR}/cmake"
27 "${FLANG_SOURCE_DIR}/cmake/modules"
28 "${LLVM_COMMON_CMAKE_UTILS}"
29 "${LLVM_COMMON_CMAKE_UTILS}/Modules"
30 "${LLVM_CMAKE_UTILS}"
31 "${LLVM_CMAKE_UTILS}/modules"
Slava Zakharin55c88aa2023-04-24 18:09:5732 "${CLANG_CMAKE_UTILS}/modules"
Martin Storsjöb75a3c92022-07-19 21:47:0233 )
34
Slava Zakharin55c88aa2023-04-24 18:09:5735 include(AddClang)
Martin Storsjöb75a3c92022-07-19 21:47:0236 include(AddLLVM)
37 include(AddFlang)
Jonathon Penix7ce775f2023-01-11 17:08:1338 include(HandleLLVMOptions)
Martin Storsjöb75a3c92022-07-19 21:47:0239
40 include(TestBigEndian)
41 test_big_endian(IS_BIGENDIAN)
42 if (IS_BIGENDIAN)
43 add_compile_definitions(FLANG_BIG_ENDIAN=1)
44 else ()
45 add_compile_definitions(FLANG_LITTLE_ENDIAN=1)
46 endif ()
47 include_directories(BEFORE
48 ${FLANG_SOURCE_DIR}/include)
Slava Zakharina468d022024-02-20 20:33:0849
50 # The out of tree builds of the compiler and the Fortran runtime
51 # must use the same setting of FLANG_RUNTIME_F128_MATH_LIB
52 # to be composable. Failure to synchronize this setting may result
53 # in linking errors or fatal failures in F128 runtime functions.
54 set(FLANG_RUNTIME_F128_MATH_LIB "" CACHE STRING
55 "Specifies the target library used for implementing IEEE-754 128-bit float \
56 math in F18 runtime, e.g. it might be libquadmath for targets where \
57 REAL(16) is mapped to __float128, or libm for targets where REAL(16) \
58 is mapped to long double, etc."
59 )
Martin Storsjöb75a3c92022-07-19 21:47:0260endif()
61
Isuru Fernandoea5efd12020-03-12 20:28:3562include(CheckCXXSymbolExists)
63include(CheckCXXSourceCompiles)
Isuru Fernandoea5efd12020-03-12 20:28:3564check_cxx_symbol_exists(strerror_r string.h HAVE_STRERROR_R)
65# Can't use symbol exists here as the function is overloaded in C++
66check_cxx_source_compiles(
67 "#include <string.h>
68 int main() {
69 char buf[4096];
70 return strerror_s(buf, 4096, 0);
71 }
72 "
73 HAVE_DECL_STRERROR_S)
74
Slava Zakharin50d848d2024-03-05 21:36:4875# Check if 128-bit float computations can be done via long double.
76check_cxx_source_compiles(
77 "#include <cfloat>
78 #if LDBL_MANT_DIG != 113
79 #error LDBL_MANT_DIG != 113
80 #endif
81 int main() { return 0; }
82 "
83 HAVE_LDBL_MANT_DIG_113)
84
David Truby15e734f2022-11-18 16:55:5685check_cxx_compiler_flag(-fno-lto FLANG_RUNTIME_HAS_FNO_LTO_FLAG)
86if (FLANG_RUNTIME_HAS_FNO_LTO_FLAG)
87 set(NO_LTO_FLAGS "-fno-lto")
88else()
89 set(NO_LTO_FLAGS "")
90endif()
91
Isuru Fernandoea5efd12020-03-12 20:28:3592configure_file(config.h.cmake config.h)
Isuru Fernandobb73d1b2020-06-08 19:13:5893# include_directories is used here instead of target_include_directories
94# because add_flang_library creates multiple objects (STATIC/SHARED, OBJECT)
95# with different names
96include_directories(AFTER ${CMAKE_CURRENT_BINARY_DIR})
Isuru Fernandoea5efd12020-03-12 20:28:3597
David Truby15e734f2022-11-18 16:55:5698append(${NO_LTO_FLAGS} CMAKE_C_FLAGS)
99append(${NO_LTO_FLAGS} CMAKE_CXX_FLAGS)
100
Shao-Ce SUN66372592023-02-13 09:41:35101# Disable libstdc++/libc++ assertions, even in an LLVM_ENABLE_ASSERTIONS build,
102# to avoid an unwanted dependency on libstdc++/libc++.so.
Jay Foad7783bba2023-02-02 12:18:41103add_definitions(-U_GLIBCXX_ASSERTIONS)
Shao-Ce SUN66372592023-02-13 09:41:35104add_definitions(-U_LIBCPP_ENABLE_ASSERTIONS)
Jay Foad7783bba2023-02-02 12:18:41105
David Spickettffc67bb2023-10-02 09:01:11106add_subdirectory(FortranMain)
Slava Zakharin50d848d2024-03-05 21:36:48107add_subdirectory(Float128Math)
David Spickettffc67bb2023-10-02 09:01:11108
Slava Zakharin32120512023-05-22 21:05:18109set(sources
Alexis Perry352d3472020-01-28 02:18:45110 ISO_Fortran_binding.cpp
peter klausler4d54bb72020-03-30 23:37:30111 allocatable.cpp
Jean Perier5226f8a2023-02-22 08:16:01112 array-constructor.cpp
peter klausler65f52902021-07-29 19:02:45113 assign.cpp
peter klauslerf7be2512020-01-24 00:59:27114 buffer.cpp
Slava Zakharin76facde2023-12-28 21:50:43115 character.cpp
Diana Picus0c375292021-08-25 07:51:48116 command.cpp
David Trubyd983f5f2022-10-03 11:01:50117 complex-powi.cpp
peter klauslere372e0f2021-03-31 16:14:08118 complex-reduction.c
peter klausler95696d52020-02-05 00:55:45119 connection.cpp
Slava Zakharin76facde2023-12-28 21:50:43120 copy.cpp
peter klauslera48e4162021-07-19 18:53:20121 derived-api.cpp
Slava Zakharin76facde2023-12-28 21:50:43122 derived.cpp
peter klausler43fadef2021-06-25 17:40:08123 descriptor-io.cpp
Slava Zakharin76facde2023-12-28 21:50:43124 descriptor.cpp
peter klausler50e0b292021-05-12 19:07:51125 dot-product.cpp
peter klausler3b635712020-02-13 22:41:56126 edit-input.cpp
127 edit-output.cpp
peter klauslerf7be2512020-01-24 00:59:27128 environment.cpp
vdonaldson3aba9262023-12-04 17:55:54129 exceptions.cpp
Yi Wue2b896a2024-01-10 10:02:48130 execute.cpp
Peter Klausler627a8ac2021-12-07 22:38:17131 extensions.cpp
Slava Zakharin00f34542024-03-21 22:12:31132 external-unit.cpp
peter klauslerbeb5ac82021-04-22 21:23:45133 extrema.cpp
Alexis Perry352d3472020-01-28 02:18:45134 file.cpp
peter klauslerbeb5ac82021-04-22 21:23:45135 findloc.cpp
Alexis Perry352d3472020-01-28 02:18:45136 format.cpp
Peter Steinfeld6cd417b2022-02-09 19:17:18137 inquiry.cpp
peter klausler95696d52020-02-05 00:55:45138 internal-unit.cpp
Alexis Perry352d3472020-01-28 02:18:45139 io-api.cpp
140 io-error.cpp
141 io-stmt.cpp
Slava Zakharin76facde2023-12-28 21:50:43142 iostat.cpp
Alexis Perry352d3472020-01-28 02:18:45143 main.cpp
Tom Eccles4ff8ba72023-03-17 09:26:39144 matmul-transpose.cpp
peter klausler5e1421b2021-05-17 21:06:44145 matmul.cpp
Alexis Perry352d3472020-01-28 02:18:45146 memory.cpp
peter klausler78a39d22021-04-02 16:30:31147 misc-intrinsic.cpp
peter klausler6a1c3ef2021-05-05 18:37:49148 namelist.cpp
Peter Klausler7cf16082023-04-13 17:28:19149 non-tbp-dio.cpp
peter klausler5f6c5c62021-04-01 19:59:59150 numeric.cpp
Slava Zakharin76facde2023-12-28 21:50:43151 pointer.cpp
152 product.cpp
Slava Zakharin00f34542024-03-21 22:12:31153 pseudo-unit.cpp
Valentin Clement6116ff22021-12-07 20:19:34154 ragged.cpp
peter klauslere1114042021-04-07 20:14:14155 random.cpp
Peter Klausler3ada8832024-03-26 16:21:16156 reduce.cpp
peter klauslere372e0f2021-03-31 16:14:08157 reduction.cpp
peter klausler8df28f02020-11-10 23:13:02158 stat.cpp
Alexis Perry352d3472020-01-28 02:18:45159 stop.cpp
peter klauslerbeb5ac82021-04-22 21:23:45160 sum.cpp
Peter Klausler77ff6f72021-11-26 19:39:31161 support.cpp
Tom Ecclesc0193722023-04-27 09:53:54162 temporary-stack.cpp
Alexis Perry352d3472020-01-28 02:18:45163 terminator.cpp
Diana Picus57e85622021-06-09 08:19:43164 time-intrinsic.cpp
Alexis Perry352d3472020-01-28 02:18:45165 tools.cpp
166 transformational.cpp
167 type-code.cpp
peter klausler79caf692021-06-17 20:13:19168 type-info.cpp
peter klausler3b635712020-02-13 22:41:56169 unit-map.cpp
Slava Zakharin76facde2023-12-28 21:50:43170 unit.cpp
Peter Klauslerbafbae22022-03-16 19:32:03171 utf.cpp
Slava Zakharin32120512023-05-22 21:05:18172)
peter klauslera8fed822018-08-02 18:45:11173
Slava Zakharinb329da82024-04-05 21:46:24174include(AddFlangOffloadRuntime)
Slava Zakharin32120512023-05-22 21:05:18175
176# List of files that are buildable for all devices.
177set(supported_files
Slava Zakharin8b953fd2023-10-04 15:21:46178 ISO_Fortran_binding.cpp
Slava Zakharinb4b23ff2023-12-20 19:52:51179 allocatable.cpp
Slava Zakharin76facde2023-12-28 21:50:43180 array-constructor.cpp
Slava Zakharin8b953fd2023-10-04 15:21:46181 assign.cpp
Slava Zakharin8ebf7412024-03-25 23:01:25182 buffer.cpp
Slava Zakharin76facde2023-12-28 21:50:43183 character.cpp
Slava Zakharin8ebf7412024-03-25 23:01:25184 connection.cpp
Slava Zakharin76facde2023-12-28 21:50:43185 copy.cpp
Slava Zakharinb4b23ff2023-12-20 19:52:51186 derived-api.cpp
Slava Zakharin76facde2023-12-28 21:50:43187 derived.cpp
Slava Zakharin4bdec582023-09-27 15:20:17188 descriptor.cpp
Slava Zakharin8ebf7412024-03-25 23:01:25189 descriptor-io.cpp
Slava Zakharin76facde2023-12-28 21:50:43190 dot-product.cpp
Slava Zakharin8ebf7412024-03-25 23:01:25191 edit-input.cpp
192 edit-output.cpp
193 environment.cpp
Slava Zakharin76facde2023-12-28 21:50:43194 extrema.cpp
Slava Zakharin8ebf7412024-03-25 23:01:25195 external-unit.cpp
Slava Zakharin76facde2023-12-28 21:50:43196 findloc.cpp
Slava Zakharin8ebf7412024-03-25 23:01:25197 format.cpp
Slava Zakharin76facde2023-12-28 21:50:43198 inquiry.cpp
Slava Zakharin8ebf7412024-03-25 23:01:25199 internal-unit.cpp
200 io-api.cpp
201 io-error.cpp
202 io-stmt.cpp
203 iostat.cpp
Slava Zakharinb4b23ff2023-12-20 19:52:51204 matmul-transpose.cpp
205 matmul.cpp
Slava Zakharin76facde2023-12-28 21:50:43206 memory.cpp
207 misc-intrinsic.cpp
Slava Zakharin8ebf7412024-03-25 23:01:25208 namelist.cpp
209 non-tbp-dio.cpp
Slava Zakharinb4b23ff2023-12-20 19:52:51210 numeric.cpp
Slava Zakharin76facde2023-12-28 21:50:43211 pointer.cpp
212 product.cpp
Slava Zakharin8ebf7412024-03-25 23:01:25213 pseudo-unit.cpp
Slava Zakharin76facde2023-12-28 21:50:43214 ragged.cpp
Slava Zakharin8b953fd2023-10-04 15:21:46215 stat.cpp
Slava Zakharinb4b23ff2023-12-20 19:52:51216 sum.cpp
217 support.cpp
Slava Zakharin4bdec582023-09-27 15:20:17218 terminator.cpp
Slava Zakharin8b953fd2023-10-04 15:21:46219 tools.cpp
Slava Zakharin32120512023-05-22 21:05:18220 transformational.cpp
Slava Zakharin4bdec582023-09-27 15:20:17221 type-code.cpp
Slava Zakharin8b953fd2023-10-04 15:21:46222 type-info.cpp
Slava Zakharin8ebf7412024-03-25 23:01:25223 unit.cpp
224 utf.cpp
Slava Zakharin32120512023-05-22 21:05:18225 )
226
Slava Zakharinb329da82024-04-05 21:46:24227enable_cuda_compilation("${supported_files}")
228enable_omp_offload_compilation("${supported_files}")
Slava Zakharin32120512023-05-22 21:05:18229
Slava Zakharin50d848d2024-03-05 21:36:48230if (NOT TARGET FortranFloat128Math)
231 # If FortranFloat128Math is not defined, then we are not building
232 # standalone FortranFloat128Math library. Instead, include
233 # the relevant sources into FortranRuntime itself.
234 # The information is provided via FortranFloat128MathILib
235 # interface library.
236 get_target_property(f128_sources
237 FortranFloat128MathILib INTERFACE_SOURCES
238 )
239 if (f128_sources)
240 # The interface may define special macros for Float128Math files,
241 # so we need to propagate them.
242 get_target_property(f128_defs
243 FortranFloat128MathILib INTERFACE_COMPILE_DEFINITIONS
244 )
245 set_property(SOURCE ${f128_sources}
246 APPEND PROPERTY COMPILE_DEFINITIONS
247 ${f128_defs}
248 )
249 list(APPEND sources ${f128_sources})
250 endif()
251endif()
252
David Trubycf1e3422023-11-10 16:13:49253if (NOT DEFINED MSVC)
254 add_flang_library(FortranRuntime
255 ${sources}
256 LINK_LIBS
257 FortranDecimal
Diana Picus467abac2022-08-11 09:21:40258
David Trubycf1e3422023-11-10 16:13:49259 INSTALL_WITH_TOOLCHAIN
260 )
261else()
262 add_flang_library(FortranRuntime
263 ${sources}
264 LINK_LIBS
265 FortranDecimal
266 )
267 set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreaded)
268 add_flang_library(FortranRuntime.static ${sources}
269 LINK_LIBS
270 FortranDecimal.static
271 INSTALL_WITH_TOOLCHAIN)
272 set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreadedDLL)
273 add_flang_library(FortranRuntime.dynamic ${sources}
274 LINK_LIBS
275 FortranDecimal.dynamic
276 INSTALL_WITH_TOOLCHAIN)
277 set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreadedDebug)
278 add_flang_library(FortranRuntime.static_dbg ${sources}
279 LINK_LIBS
280 FortranDecimal.static_dbg
281 INSTALL_WITH_TOOLCHAIN)
282 set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreadedDebugDLL)
283 add_flang_library(FortranRuntime.dynamic_dbg ${sources}
284 LINK_LIBS
285 FortranDecimal.dynamic_dbg
286 INSTALL_WITH_TOOLCHAIN)
David Truby1256d1d2023-11-14 14:22:43287 add_dependencies(FortranRuntime FortranRuntime.static FortranRuntime.dynamic
288 FortranRuntime.static_dbg FortranRuntime.dynamic_dbg)
David Trubycf1e3422023-11-10 16:13:49289endif()