summaryrefslogtreecommitdiffstats
path: root/Modules
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2023-12-07 14:16:01 (GMT)
committerKitware Robot <kwrobot@kitware.com>2023-12-07 14:16:11 (GMT)
commitb2b0d839c1db57e9b8078882e3d366fff6f1fb4a (patch)
treec042cf5565099bd357626db4bb36b518bfc94ce4 /Modules
parent944a9c35cc002f19b3cad3868da08b4f21c0e556 (diff)
parentcd28915260432cdbcdfb1f715477c262d41867d1 (diff)
downloadCMake-b2b0d839c1db57e9b8078882e3d366fff6f1fb4a.zip
CMake-b2b0d839c1db57e9b8078882e3d366fff6f1fb4a.tar.gz
CMake-b2b0d839c1db57e9b8078882e3d366fff6f1fb4a.tar.bz2
Merge topic 'LLVMFlang-MSVC'
cd28915260 LLVMFlang: Update MSVC ABI and architecture detection for LLVMFlang 18.0 48302b469e LLVMFlang: Update MSVC runtime library selection for LLVMFlang 18.0 1c07758ca2 CMakeParseImplicitLinkInfo: Exclude LLVMFlang program entry point for MSVC Acked-by: Kitware Robot <kwrobot@kitware.com> Acked-by: buildbot <buildbot@kitware.com> Merge-request: !9036
Diffstat (limited to 'Modules')
-rw-r--r--Modules/CMakeDetermineCompilerId.cmake37
-rw-r--r--Modules/CMakeDetermineFortranCompiler.cmake4
-rw-r--r--Modules/CMakeFortranCompilerId.F.in2
-rw-r--r--Modules/CMakeParseImplicitLinkInfo.cmake2
-rw-r--r--Modules/Platform/Windows-LLVMFlang-Fortran.cmake27
5 files changed, 41 insertions, 31 deletions
diff --git a/Modules/CMakeDetermineCompilerId.cmake b/Modules/CMakeDetermineCompilerId.cmake
index ffba1cb..b380aa5 100644
--- a/Modules/CMakeDetermineCompilerId.cmake
+++ b/Modules/CMakeDetermineCompilerId.cmake
@@ -174,27 +174,30 @@ function(CMAKE_DETERMINE_COMPILER_ID lang flagvar src)
endif()
endif()
- # FIXME(LLVMFlang): It does not provide predefines identifying the MSVC ABI or architecture.
- # It should be taught to define _MSC_VER and its _M_* architecture flags.
if("x${lang}" STREQUAL "xFortran" AND "x${CMAKE_${lang}_COMPILER_ID}" STREQUAL "xLLVMFlang")
- # Parse the target triple to detect information we should later be able
- # to get during preprocessing above, once LLVMFlang provides it.
+ # Parse the target triple to detect information not always available from the preprocessor.
if(COMPILER_${lang}_PRODUCED_OUTPUT MATCHES "-triple ([0-9a-z_]*)-.*windows-msvc([0-9]+)\\.([0-9]+)")
- set(CMAKE_${lang}_SIMULATE_ID "MSVC")
+ # CMakeFortranCompilerId.F.in does not extract the _MSC_VER minor version.
+ # We can do better using the version parsed here.
set(CMAKE_${lang}_SIMULATE_VERSION "${CMAKE_MATCH_2}.${CMAKE_MATCH_3}")
- set(arch ${CMAKE_MATCH_1})
- if(arch STREQUAL "x86_64")
- set(CMAKE_${lang}_COMPILER_ARCHITECTURE_ID "x64")
- elseif(arch STREQUAL "aarch64")
- set(CMAKE_${lang}_COMPILER_ARCHITECTURE_ID "ARM64")
- elseif(arch STREQUAL "arm64ec")
- set(CMAKE_${lang}_COMPILER_ARCHITECTURE_ID "ARM64EC")
- elseif(arch MATCHES "^i[3-9]86$")
- set(CMAKE_${lang}_COMPILER_ARCHITECTURE_ID "X86")
- else()
- message(FATAL_ERROR "LLVMFlang target architecture unrecognized: ${arch}")
+
+ if (CMAKE_${lang}_COMPILER_VERSION VERSION_LESS 18.0)
+ # LLVMFlang < 18.0 does not provide predefines identifying the MSVC ABI or architecture.
+ set(CMAKE_${lang}_SIMULATE_ID "MSVC")
+ set(arch ${CMAKE_MATCH_1})
+ if(arch STREQUAL "x86_64")
+ set(CMAKE_${lang}_COMPILER_ARCHITECTURE_ID "x64")
+ elseif(arch STREQUAL "aarch64")
+ set(CMAKE_${lang}_COMPILER_ARCHITECTURE_ID "ARM64")
+ elseif(arch STREQUAL "arm64ec")
+ set(CMAKE_${lang}_COMPILER_ARCHITECTURE_ID "ARM64EC")
+ elseif(arch MATCHES "^i[3-9]86$")
+ set(CMAKE_${lang}_COMPILER_ARCHITECTURE_ID "X86")
+ else()
+ message(FATAL_ERROR "LLVMFlang target architecture unrecognized: ${arch}")
+ endif()
+ set(MSVC_${lang}_ARCHITECTURE_ID "${CMAKE_${lang}_COMPILER_ARCHITECTURE_ID}")
endif()
- set(MSVC_${lang}_ARCHITECTURE_ID "${CMAKE_${lang}_COMPILER_ARCHITECTURE_ID}")
elseif(COMPILER_${lang}_PRODUCED_OUTPUT MATCHES "-triple ([0-9a-z_]*)-.*windows-gnu")
set(CMAKE_${lang}_SIMULATE_ID "GNU")
endif()
diff --git a/Modules/CMakeDetermineFortranCompiler.cmake b/Modules/CMakeDetermineFortranCompiler.cmake
index 3ed7d58..613b0c4 100644
--- a/Modules/CMakeDetermineFortranCompiler.cmake
+++ b/Modules/CMakeDetermineFortranCompiler.cmake
@@ -265,8 +265,8 @@ if("${CMAKE_Fortran_COMPILER_ID};${CMAKE_Fortran_SIMULATE_ID}" STREQUAL "LLVMFla
"${log}\n"
)
set(_CMAKE_Fortran_IMPLICIT_LINK_INFORMATION_DETERMINED_EARLY 1)
- if("x${CMAKE_Fortran_COMPILER_ARCHITECTURE_ID}" STREQUAL "xARM64")
- # FIXME(LLVMFlang): It does not add `-defaultlib:` fields to object
+ if("x${CMAKE_Fortran_COMPILER_ARCHITECTURE_ID}" STREQUAL "xARM64" AND CMAKE_Fortran_COMPILER_VERSION VERSION_LESS 18.0)
+ # LLVMFlang < 18.0 does not add `-defaultlib:` fields to object
# files to specify link dependencies on its runtime libraries.
# For now, we add them ourselves.
list(APPEND CMAKE_Fortran_IMPLICIT_LINK_LIBRARIES "clang_rt.builtins-aarch64.lib")
diff --git a/Modules/CMakeFortranCompilerId.F.in b/Modules/CMakeFortranCompilerId.F.in
index f5c2ab5..a040073 100644
--- a/Modules/CMakeFortranCompilerId.F.in
+++ b/Modules/CMakeFortranCompilerId.F.in
@@ -240,7 +240,7 @@
#else
PRINT *, 'INFO:platform[]'
#endif
-#if defined(_WIN32) && (defined(__INTEL_COMPILER) || defined(__ICC))
+#if defined(_MSC_VER)
# if defined(_M_IA64)
PRINT *, 'INFO:arch[IA64]'
# elif defined(_M_X64) || defined(_M_AMD64)
diff --git a/Modules/CMakeParseImplicitLinkInfo.cmake b/Modules/CMakeParseImplicitLinkInfo.cmake
index b48eb43..0c92634 100644
--- a/Modules/CMakeParseImplicitLinkInfo.cmake
+++ b/Modules/CMakeParseImplicitLinkInfo.cmake
@@ -163,6 +163,8 @@ function(cmake_parse_implicit_link_info2 text log_var obj_regex)
string(APPEND log " arg [${arg}] ==> ignore MSVC cl option\n")
elseif(is_msvc AND "${arg}" MATCHES "^[-/][Ii][Mm][Pp][Ll][Ii][Bb]:")
string(APPEND log " arg [${arg}] ==> ignore MSVC link option\n")
+ elseif(is_msvc AND "${arg}" MATCHES "^[-/][Ww][Hh][Oo][Ll][Ee][Aa][Rr][Cc][Hh][Ii][Vv][Ee]:Fortran_main")
+ string(APPEND log " arg [${arg}] ==> ignore LLVMFlang program entry point\n")
elseif(is_msvc AND "${arg}" MATCHES "^(.*\\.[Ll][Ii][Bb])$")
if(EXTRA_PARSE_COMPUTE_IMPLICIT_LIBS)
set(lib "${CMAKE_MATCH_1}")
diff --git a/Modules/Platform/Windows-LLVMFlang-Fortran.cmake b/Modules/Platform/Windows-LLVMFlang-Fortran.cmake
index 57e36c6..10e3b2c 100644
--- a/Modules/Platform/Windows-LLVMFlang-Fortran.cmake
+++ b/Modules/Platform/Windows-LLVMFlang-Fortran.cmake
@@ -5,17 +5,22 @@ elseif("x${CMAKE_Fortran_SIMULATE_ID}" STREQUAL "xMSVC")
include(Platform/Windows-MSVC)
__windows_compiler_msvc(Fortran)
- # FIXME(LLVMFlang): It does not provides MSVC runtime library selection flags.
- # It should be given a flag like classic Flang's `-Xclang --dependent-lib=`, or a
- # dedicated flag to select among multiple `Fortran*.lib` runtime library variants
- # that each depend on a different MSVC runtime library. For now, LLVMFlang'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 "")
+ 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