mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-17 15:56:40 +00:00
267 lines
7.3 KiB
CMake
267 lines
7.3 KiB
CMake
#===-- lib/runtime/CMakeLists.txt ------------------------------------------===#
|
|
#
|
|
# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
# See https://llvm.org/LICENSE.txt for license information.
|
|
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
#
|
|
#===------------------------------------------------------------------------===#
|
|
|
|
include(AddFlangRTOffload)
|
|
# function checks
|
|
find_package(Backtrace)
|
|
set(HAVE_BACKTRACE ${Backtrace_FOUND})
|
|
set(BACKTRACE_HEADER ${Backtrace_HEADER})
|
|
|
|
# List of files that are buildable for all devices.
|
|
set(supported_sources
|
|
${FLANG_SOURCE_DIR}/lib/Decimal/binary-to-decimal.cpp
|
|
${FLANG_SOURCE_DIR}/lib/Decimal/decimal-to-binary.cpp
|
|
ISO_Fortran_binding.cpp
|
|
allocator-registry.cpp
|
|
allocatable.cpp
|
|
array-constructor.cpp
|
|
assign.cpp
|
|
buffer.cpp
|
|
character.cpp
|
|
connection.cpp
|
|
copy.cpp
|
|
derived-api.cpp
|
|
derived.cpp
|
|
descriptor-io.cpp
|
|
descriptor.cpp
|
|
dot-product.cpp
|
|
edit-input.cpp
|
|
edit-output.cpp
|
|
environment.cpp
|
|
external-unit.cpp
|
|
extrema.cpp
|
|
file.cpp
|
|
findloc.cpp
|
|
format.cpp
|
|
inquiry.cpp
|
|
internal-unit.cpp
|
|
io-api.cpp
|
|
io-api-minimal.cpp
|
|
io-error.cpp
|
|
io-stmt.cpp
|
|
iostat.cpp
|
|
matmul-transpose.cpp
|
|
matmul.cpp
|
|
memory.cpp
|
|
misc-intrinsic.cpp
|
|
namelist.cpp
|
|
non-tbp-dio.cpp
|
|
numeric.cpp
|
|
pointer.cpp
|
|
product.cpp
|
|
pseudo-unit.cpp
|
|
ragged.cpp
|
|
stat.cpp
|
|
stop.cpp
|
|
sum.cpp
|
|
support.cpp
|
|
terminator.cpp
|
|
tools.cpp
|
|
transformational.cpp
|
|
type-code.cpp
|
|
type-info.cpp
|
|
unit.cpp
|
|
utf.cpp
|
|
)
|
|
|
|
# List of source not used for GPU offloading.
|
|
set(host_sources
|
|
${FLANG_SOURCE_DIR}/module/iso_fortran_env_impl.f90
|
|
command.cpp
|
|
complex-powi.cpp
|
|
complex-reduction.c
|
|
exceptions.cpp
|
|
execute.cpp
|
|
extensions.cpp
|
|
main.cpp
|
|
random.cpp
|
|
reduce.cpp
|
|
reduction.cpp
|
|
stop.cpp
|
|
temporary-stack.cpp
|
|
time-intrinsic.cpp
|
|
unit-map.cpp
|
|
)
|
|
|
|
# Sources that can be compiled directly for the GPU.
|
|
set(gpu_sources
|
|
${FLANG_SOURCE_DIR}/lib/Decimal/binary-to-decimal.cpp
|
|
${FLANG_SOURCE_DIR}/lib/Decimal/decimal-to-binary.cpp
|
|
ISO_Fortran_binding.cpp
|
|
allocator-registry.cpp
|
|
allocatable.cpp
|
|
array-constructor.cpp
|
|
assign.cpp
|
|
buffer.cpp
|
|
character.cpp
|
|
connection.cpp
|
|
copy.cpp
|
|
derived-api.cpp
|
|
derived.cpp
|
|
dot-product.cpp
|
|
edit-output.cpp
|
|
extrema.cpp
|
|
findloc.cpp
|
|
format.cpp
|
|
inquiry.cpp
|
|
internal-unit.cpp
|
|
io-error.cpp
|
|
iostat.cpp
|
|
matmul-transpose.cpp
|
|
matmul.cpp
|
|
memory.cpp
|
|
misc-intrinsic.cpp
|
|
non-tbp-dio.cpp
|
|
numeric.cpp
|
|
pointer.cpp
|
|
product.cpp
|
|
ragged.cpp
|
|
stat.cpp
|
|
sum.cpp
|
|
support.cpp
|
|
terminator.cpp
|
|
tools.cpp
|
|
transformational.cpp
|
|
type-code.cpp
|
|
type-info.cpp
|
|
utf.cpp
|
|
complex-powi.cpp
|
|
reduce.cpp
|
|
reduction.cpp
|
|
temporary-stack.cpp
|
|
)
|
|
|
|
file(GLOB_RECURSE public_headers
|
|
"${FLANG_RT_SOURCE_DIR}/include/flang_rt/*.h"
|
|
"${FLANG_SOURCE_DIR}/include/flang/Common/*.h"
|
|
)
|
|
|
|
file(GLOB_RECURSE private_headers
|
|
"${FLANG_RT_SOURCE_DIR}/lib/flang_rt/*.h"
|
|
"${FLANG_SOURCE_DIR}/lib/Common/*.h"
|
|
)
|
|
|
|
|
|
# Import changes from flang_rt.quadmath
|
|
get_target_property(f128_sources
|
|
FortranFloat128MathILib INTERFACE_SOURCES
|
|
)
|
|
if (f128_sources)
|
|
# The interface may define special macros for Float128Math files,
|
|
# so we need to propagate them.
|
|
get_target_property(f128_defs
|
|
FortranFloat128MathILib INTERFACE_COMPILE_DEFINITIONS
|
|
)
|
|
set_property(SOURCE ${f128_sources}
|
|
APPEND PROPERTY COMPILE_DEFINITIONS
|
|
${f128_defs}
|
|
)
|
|
get_target_property(f128_include_dirs
|
|
FortranFloat128MathILib INTERFACE_INCLUDE_DIRECTORIES
|
|
)
|
|
set_property(SOURCE ${f128_sources}
|
|
APPEND PROPERTY INCLUDE_DIRECTORIES
|
|
${f128_include_dirs}
|
|
)
|
|
else ()
|
|
set(f128_sources "")
|
|
endif ()
|
|
|
|
if ("${LLVM_RUNTIMES_TARGET}" MATCHES "^amdgcn|^nvptx")
|
|
set(sources ${gpu_sources})
|
|
else ()
|
|
set(sources ${supported_sources} ${host_sources} ${f128_sources})
|
|
endif ()
|
|
|
|
|
|
if (NOT WIN32)
|
|
add_flangrt_library(flang_rt.runtime STATIC SHARED
|
|
${sources}
|
|
LINK_LIBRARIES ${Backtrace_LIBRARY}
|
|
INSTALL_WITH_TOOLCHAIN
|
|
ADDITIONAL_HEADERS ${public_headers} ${private_headers}
|
|
)
|
|
|
|
enable_cuda_compilation(flang_rt.runtime "${supported_sources}")
|
|
enable_omp_offload_compilation(flang_rt.runtime "${supported_sources}")
|
|
|
|
# Select a default runtime, which is used for unit and regression tests.
|
|
get_target_property(default_target flang_rt.runtime.default ALIASED_TARGET)
|
|
add_library(flang_rt.runtime.unittest ALIAS "${default_target}")
|
|
else()
|
|
# Target for building all versions of the runtime
|
|
add_custom_target(flang_rt.runtime)
|
|
set_target_properties(flang_rt.runtime PROPERTIES FOLDER "Flang-RT/Meta")
|
|
|
|
function (add_win_flangrt_runtime libtype suffix msvc_lib)
|
|
set(name "flang_rt.runtime.${suffix}")
|
|
add_flangrt_library(${name} ${libtype}
|
|
${sources}
|
|
${ARGN}
|
|
LINK_LIBRARIES ${Backtrace_LIBRARY}
|
|
ADDITIONAL_HEADERS ${public_headers} ${private_headers}
|
|
)
|
|
|
|
if (msvc_lib)
|
|
set_target_properties(${name}
|
|
PROPERTIES
|
|
MSVC_RUNTIME_LIBRARY "${msvc_lib}"
|
|
)
|
|
endif ()
|
|
|
|
# Setting an unique Fortran_MODULE_DIRECTORY is required for each variant to
|
|
# write a different .mod file.
|
|
set_target_properties(${name}
|
|
PROPERTIES
|
|
Fortran_MODULE_DIRECTORY "module.${suffix}"
|
|
)
|
|
|
|
enable_cuda_compilation(${name} "${supported_sources}")
|
|
enable_omp_offload_compilation(${name} "${supported_sources}")
|
|
add_dependencies(flang_rt.runtime ${name})
|
|
endfunction ()
|
|
|
|
# Variants of the static flang_rt for different versions of the msvc runtime.
|
|
#
|
|
# The dynamic/dynamic_dbg variants are not DLLs themselves, only require
|
|
# linking to msvcrt(d).dll.
|
|
# FIXME: Generating actual runtime DLLs is currently not possible. There are
|
|
# two roadblocks:
|
|
#
|
|
# * Flang emits /DEFAULTLIB:flang_rt.dynamic.lib into
|
|
# iso_fortran_env_impl.f90.obj. Because that file is itself part of
|
|
# flang_rt.dynamic, this results in a recursive dependency when invoking
|
|
# the linker.
|
|
#
|
|
# * The externally-visible functions must either be annotated with
|
|
# __declspec(dllexport), or listed in an exports file. A possible workaround
|
|
# is CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS which would also export the internal
|
|
# C++ symbols and still requires global data symbols to be annotated
|
|
# manually.
|
|
add_win_flangrt_runtime(STATIC static MultiThreaded INSTALL_WITH_TOOLCHAIN)
|
|
add_win_flangrt_runtime(STATIC static_dbg MultiThreadedDebug INSTALL_WITH_TOOLCHAIN)
|
|
add_win_flangrt_runtime(STATIC dynamic MultiThreadedDLL INSTALL_WITH_TOOLCHAIN)
|
|
add_win_flangrt_runtime(STATIC dynamic_dbg MultiThreadedDebugDLL INSTALL_WITH_TOOLCHAIN)
|
|
|
|
# Unittests link against LLVMSupport which is using CMake's default runtime
|
|
# library selection, which is either MultiThreadedDLL or MultiThreadedDebugDLL
|
|
# depending on the configuration. They have to match or linking will fail.
|
|
if (GENERATOR_IS_MULTI_CONFIG)
|
|
# We cannot select an ALIAS library because it may be different
|
|
# per configuration. Fallback to CMake's default.
|
|
add_win_flangrt_runtime(STATIC unittest "" EXCLUDE_FROM_ALL)
|
|
else ()
|
|
string(TOLOWER ${CMAKE_BUILD_TYPE} build_type)
|
|
if (build_type STREQUAL "debug")
|
|
add_library(flang_rt.runtime.unittest ALIAS flang_rt.runtime.dynamic_dbg)
|
|
else ()
|
|
add_library(flang_rt.runtime.unittest ALIAS flang_rt.runtime.dynamic)
|
|
endif ()
|
|
endif ()
|
|
endif()
|