Files
CMake/Modules/Platform/Windows-LLVMFlang-Fortran.cmake
Brad King 48302b469e LLVMFlang: Update MSVC runtime library selection for LLVMFlang 18.0
LLVMFlang 18.0 adds MSVC runtime library selection flags and associated
Fortran runtime library variants.  Resolve the corresponding FIXME left
by commit 26bf32cdc6 (LLVMFlang: Add support for targeting MSVC ABI on
Windows, 2023-09-28, v3.28.0-rc1~10^2).

Issue: #24840
2023-12-06 09:42:07 -05:00

66 lines
3.3 KiB
CMake

if("x${CMAKE_Fortran_SIMULATE_ID}" STREQUAL "xGNU")
include(Platform/Windows-GNU)
__windows_compiler_gnu(Fortran)
elseif("x${CMAKE_Fortran_SIMULATE_ID}" STREQUAL "xMSVC")
include(Platform/Windows-MSVC)
__windows_compiler_msvc(Fortran)
if(CMAKE_Fortran_COMPILER_VERSION VERSION_GREATER_EQUAL 18.0)
set(_LLVMFlang_LINK_RUNTIME "")
set(CMAKE_Fortran_COMPILE_OPTIONS_MSVC_RUNTIME_LIBRARY_MultiThreaded "-fms-runtime-lib=static")
set(CMAKE_Fortran_COMPILE_OPTIONS_MSVC_RUNTIME_LIBRARY_MultiThreadedDLL "-fms-runtime-lib=dll")
set(CMAKE_Fortran_COMPILE_OPTIONS_MSVC_RUNTIME_LIBRARY_MultiThreadedDebug "-fms-runtime-lib=static_dbg")
set(CMAKE_Fortran_COMPILE_OPTIONS_MSVC_RUNTIME_LIBRARY_MultiThreadedDebugDLL "-fms-runtime-lib=dll_dbg")
else()
# LLVMFlang < 18.0 does not have MSVC runtime library selection flags.
# The official distrubtion's `Fortran*.lib` runtime libraries hard-code
# use of msvcrt (MultiThreadedDLL), so we link to it ourselves.
set(_LLVMFlang_LINK_RUNTIME "-defaultlib:msvcrt")
set(CMAKE_Fortran_COMPILE_OPTIONS_MSVC_RUNTIME_LIBRARY_MultiThreaded "")
set(CMAKE_Fortran_COMPILE_OPTIONS_MSVC_RUNTIME_LIBRARY_MultiThreadedDLL "")
set(CMAKE_Fortran_COMPILE_OPTIONS_MSVC_RUNTIME_LIBRARY_MultiThreadedDebug "")
set(CMAKE_Fortran_COMPILE_OPTIONS_MSVC_RUNTIME_LIBRARY_MultiThreadedDebugDLL "")
endif()
# LLVMFlang, like Clang, does not provide all debug information format flags.
# In order to provide easy integration with C and C++ projects that use the
# other debug information formats, pretend to support them, and just do not
# actually generate any debug information for Fortran.
set(CMAKE_Fortran_COMPILE_OPTIONS_MSVC_DEBUG_INFORMATION_FORMAT_Embedded -g)
set(CMAKE_Fortran_COMPILE_OPTIONS_MSVC_DEBUG_INFORMATION_FORMAT_ProgramDatabase "") # not supported by LLVMFlang
set(CMAKE_Fortran_COMPILE_OPTIONS_MSVC_DEBUG_INFORMATION_FORMAT_EditAndContinue "") # not supported by LLVMFlang
set(CMAKE_Fortran_COMPILE_OBJECT "<CMAKE_Fortran_COMPILER> <DEFINES> <INCLUDES> <FLAGS> -o <OBJECT> -c <SOURCE>")
if(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT_DEFAULT)
set(_g "")
else()
set(_g " -g")
endif()
string(APPEND CMAKE_Fortran_FLAGS_DEBUG_INIT "${_g}")
string(APPEND CMAKE_Fortran_FLAGS_RELEASE_INIT "")
string(APPEND CMAKE_Fortran_FLAGS_RELWITHDEBINFO_INIT "${_g}")
string(APPEND CMAKE_Fortran_FLAGS_MINSIZEREL_INIT "")
unset(_g)
# We link with lld-link.exe instead of the compiler driver, so explicitly
# pass implicit link information previously detected from the compiler.
set(_LLVMFlang_LINK_DIRS "${CMAKE_Fortran_IMPLICIT_LINK_DIRECTORIES}")
list(TRANSFORM _LLVMFlang_LINK_DIRS PREPEND "-libpath:\"")
list(TRANSFORM _LLVMFlang_LINK_DIRS APPEND "\"")
string(JOIN " " _LLVMFlang_LINK_DIRS ${_LLVMFlang_LINK_DIRS})
string(JOIN " " _LLVMFlang_LINK_LIBS ${CMAKE_Fortran_IMPLICIT_LINK_LIBRARIES})
foreach(v IN ITEMS
CMAKE_Fortran_LINK_EXECUTABLE
CMAKE_Fortran_CREATE_SHARED_LIBRARY
CMAKE_Fortran_CREATE_SHARED_MODULE
)
string(APPEND "${v}" " ${_LLVMFlang_LINK_DIRS} ${_LLVMFlang_LINK_LIBS} ${_LLVMFlang_LINK_RUNTIME}")
endforeach()
unset(_LLVMFlang_LINK_DIRS)
unset(_LLVMFlang_LINK_LIBS)
unset(_LLVMFlang_LINK_RUNTIME)
else()
message(FATAL_ERROR "LLVMFlang target ABI unrecognized: ${CMAKE_Fortran_SIMULATE_ID}")
endif()