Windows-LLVMFlang-Fortran.cmake 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. if("x${CMAKE_Fortran_SIMULATE_ID}" STREQUAL "xGNU")
  2. include(Platform/Windows-GNU)
  3. __windows_compiler_gnu(Fortran)
  4. elseif("x${CMAKE_Fortran_SIMULATE_ID}" STREQUAL "xMSVC")
  5. include(Platform/Windows-MSVC)
  6. __windows_compiler_msvc(Fortran)
  7. # FIXME(LLVMFlang): It does not provides MSVC runtime library selection flags.
  8. # It should be given a flag like classic Flang's `-Xclang --dependent-lib=`, or a
  9. # dedicated flag to select among multiple `Fortran*.lib` runtime library variants
  10. # that each depend on a different MSVC runtime library. For now, LLVMFlang's
  11. # `Fortran*.lib` runtime libraries hard-code use of msvcrt (MultiThreadedDLL),
  12. # so we link to it ourselves.
  13. set(_LLVMFlang_LINK_RUNTIME "-defaultlib:msvcrt")
  14. set(CMAKE_Fortran_COMPILE_OPTIONS_MSVC_RUNTIME_LIBRARY_MultiThreaded "")
  15. set(CMAKE_Fortran_COMPILE_OPTIONS_MSVC_RUNTIME_LIBRARY_MultiThreadedDLL "")
  16. set(CMAKE_Fortran_COMPILE_OPTIONS_MSVC_RUNTIME_LIBRARY_MultiThreadedDebug "")
  17. set(CMAKE_Fortran_COMPILE_OPTIONS_MSVC_RUNTIME_LIBRARY_MultiThreadedDebugDLL "")
  18. # LLVMFlang, like Clang, does not provide all debug information format flags.
  19. # In order to provide easy integration with C and C++ projects that use the
  20. # other debug information formats, pretend to support them, and just do not
  21. # actually generate any debug information for Fortran.
  22. set(CMAKE_Fortran_COMPILE_OPTIONS_MSVC_DEBUG_INFORMATION_FORMAT_Embedded -g)
  23. set(CMAKE_Fortran_COMPILE_OPTIONS_MSVC_DEBUG_INFORMATION_FORMAT_ProgramDatabase "") # not supported by LLVMFlang
  24. set(CMAKE_Fortran_COMPILE_OPTIONS_MSVC_DEBUG_INFORMATION_FORMAT_EditAndContinue "") # not supported by LLVMFlang
  25. set(CMAKE_Fortran_COMPILE_OBJECT "<CMAKE_Fortran_COMPILER> <DEFINES> <INCLUDES> <FLAGS> -o <OBJECT> -c <SOURCE>")
  26. if(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT_DEFAULT)
  27. set(_g "")
  28. else()
  29. set(_g " -g")
  30. endif()
  31. string(APPEND CMAKE_Fortran_FLAGS_DEBUG_INIT "${_g}")
  32. string(APPEND CMAKE_Fortran_FLAGS_RELEASE_INIT "")
  33. string(APPEND CMAKE_Fortran_FLAGS_RELWITHDEBINFO_INIT "${_g}")
  34. string(APPEND CMAKE_Fortran_FLAGS_MINSIZEREL_INIT "")
  35. unset(_g)
  36. # We link with lld-link.exe instead of the compiler driver, so explicitly
  37. # pass implicit link information previously detected from the compiler.
  38. set(_LLVMFlang_LINK_DIRS "${CMAKE_Fortran_IMPLICIT_LINK_DIRECTORIES}")
  39. list(TRANSFORM _LLVMFlang_LINK_DIRS PREPEND "-libpath:\"")
  40. list(TRANSFORM _LLVMFlang_LINK_DIRS APPEND "\"")
  41. string(JOIN " " _LLVMFlang_LINK_DIRS ${_LLVMFlang_LINK_DIRS})
  42. string(JOIN " " _LLVMFlang_LINK_LIBS ${CMAKE_Fortran_IMPLICIT_LINK_LIBRARIES})
  43. foreach(v IN ITEMS
  44. CMAKE_Fortran_LINK_EXECUTABLE
  45. CMAKE_Fortran_CREATE_SHARED_LIBRARY
  46. CMAKE_Fortran_CREATE_SHARED_MODULE
  47. )
  48. string(APPEND "${v}" " ${_LLVMFlang_LINK_DIRS} ${_LLVMFlang_LINK_LIBS} ${_LLVMFlang_LINK_RUNTIME}")
  49. endforeach()
  50. unset(_LLVMFlang_LINK_DIRS)
  51. unset(_LLVMFlang_LINK_LIBS)
  52. unset(_LLVMFlang_LINK_RUNTIME)
  53. else()
  54. message(FATAL_ERROR "LLVMFlang target ABI unrecognized: ${CMAKE_Fortran_SIMULATE_ID}")
  55. endif()