| 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() |