Parcourir la source

MSVC: Teach find_library to consider Rust's '${name}.dll.lib' convention

This convention is used by Rust toolchains (rustc/cargo/cargo-c) for the
MSVC ABI.

Fixes: #25478
Daniel Ching il y a 2 ans
Parent
commit
f20c5c6f20

+ 6 - 0
Help/release/dev/find-rustc-importlibs.rst

@@ -0,0 +1,6 @@
+find-rustc-importlibs
+---------------------
+
+* On Windows, when targeting the MSVC ABI, the :command:`find_library` command
+  now considers ``.dll.lib`` file names before ``.lib``.  This is the default
+  suffix for DLL import libraries created by Rust toolchains for the MSVC ABI.

+ 5 - 5
Help/variable/CMAKE_FIND_LIBRARY_SUFFIXES.rst

@@ -5,8 +5,8 @@ Suffixes to append when looking for libraries.
 
 This specifies what suffixes to add to library names when the
 :command:`find_library` command looks for libraries.  On Windows systems this
-is typically ``.lib`` and, depending on the compiler, ``.dll.a``, ``.a``
-(e.g. GCC and Clang), so when it tries to find the ``foo`` library, it will
-look for ``[<prefix>]foo.lib`` and/or ``[<prefix>]foo[.dll].a``, depending on
-the compiler used and the ``<prefix>`` specified in the
-:variable:`CMAKE_FIND_LIBRARY_PREFIXES`.
+is typically ``.lib`` and, depending on the compiler, ``.dll.lib``, ``.dll.a``,
+``.a`` (e.g. rustc, GCC, or Clang), so when it tries to find the ``foo``
+library, it will look for ``[<prefix>]foo[.dll].lib`` and/or
+``[<prefix>]foo[.dll].a``, depending on the compiler used and the ``<prefix>``
+specified in the :variable:`CMAKE_FIND_LIBRARY_PREFIXES`.

+ 4 - 1
Modules/Platform/Windows.cmake

@@ -14,7 +14,10 @@ set(CMAKE_DL_LIBS "")
 set(CMAKE_EXTRA_LINK_EXTENSIONS ".targets")
 
 set(CMAKE_FIND_LIBRARY_PREFIXES "")
-set(CMAKE_FIND_LIBRARY_SUFFIXES ".lib")
+set(CMAKE_FIND_LIBRARY_SUFFIXES
+  ".dll.lib" # import library from Rust toolchain for MSVC ABI
+  ".lib" # static or import library from MSVC tooling
+  )
 
 # for borland make long command lines are redirected to a file
 # with the following syntax, see Windows-bcc32.cmake for use

+ 1 - 0
Tests/RunCMake/find_library/Windows-MSVC-stdout.txt

@@ -1 +1,2 @@
 -- STATIC_LIBRARY='[^']*/Tests/RunCMake/find_library/Windows-MSVC/static.lib'
+-- RUSTC_IMPORT_LIBRARY='[^']*/Tests/RunCMake/find_library/Windows-MSVC/rustc_import.dll.lib'

+ 3 - 0
Tests/RunCMake/find_library/Windows-MSVC.cmake

@@ -2,3 +2,6 @@ enable_language(C)
 
 find_library(STATIC_LIBRARY NAMES static NO_DEFAULT_PATH PATHS ${CMAKE_CURRENT_SOURCE_DIR}/Windows-MSVC)
 message(STATUS "STATIC_LIBRARY='${STATIC_LIBRARY}'")
+
+find_library(RUSTC_IMPORT_LIBRARY NAMES rustc_import NO_DEFAULT_PATH PATHS ${CMAKE_CURRENT_SOURCE_DIR}/Windows-MSVC)
+message(STATUS "RUSTC_IMPORT_LIBRARY='${RUSTC_IMPORT_LIBRARY}'")

+ 0 - 0
Tests/RunCMake/find_library/Windows-MSVC/rustc_import.dll.lib


+ 0 - 0
Tests/RunCMake/find_library/Windows-MSVC/rustc_import.lib