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 " -o -c ") 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()