Browse Source

Merge topic 'find-rustc-importlibs'

f20c5c6f20 MSVC: Teach find_library to consider Rust's '${name}.dll.lib' convention
7598ea5389 Tests: Add case covering find_library behavior when targeting MSVC ABI

Acked-by: Kitware Robot <[email protected]>
Merge-request: !9046
Brad King 2 years ago
parent
commit
143f5abb3b

+ 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
 This specifies what suffixes to add to library names when the
 :command:`find_library` command looks for libraries.  On Windows systems this
 :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_EXTRA_LINK_EXTENSIONS ".targets")
 
 
 set(CMAKE_FIND_LIBRARY_PREFIXES "")
 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
 # for borland make long command lines are redirected to a file
 # with the following syntax, see Windows-bcc32.cmake for use
 # with the following syntax, see Windows-bcc32.cmake for use

+ 1 - 1
Tests/RunCMake/CMakeLists.txt

@@ -529,7 +529,7 @@ endforeach()
 add_RunCMake_test(file-DOWNLOAD)
 add_RunCMake_test(file-DOWNLOAD)
 add_RunCMake_test(file-RPATH -DCMAKE_SYSTEM_NAME=${CMAKE_SYSTEM_NAME})
 add_RunCMake_test(file-RPATH -DCMAKE_SYSTEM_NAME=${CMAKE_SYSTEM_NAME})
 add_RunCMake_test(find_file -DMINGW=${MINGW})
 add_RunCMake_test(find_file -DMINGW=${MINGW})
-add_RunCMake_test(find_library -DMINGW=${MINGW} -DCYGWIN=${CYGWIN} -DMSYS=${MSYS})
+add_RunCMake_test(find_library -DMINGW=${MINGW} -DCYGWIN=${CYGWIN} -DMSYS=${MSYS} -DMSVC=${MSVC})
 add_RunCMake_test(find_package -DMINGW=${MINGW} -DMSYS=${MSYS})
 add_RunCMake_test(find_package -DMINGW=${MINGW} -DMSYS=${MSYS})
 add_RunCMake_test(find_path -DMINGW=${MINGW})
 add_RunCMake_test(find_path -DMINGW=${MINGW})
 add_RunCMake_test(find_program -DCMAKE_SYSTEM_NAME=${CMAKE_SYSTEM_NAME})
 add_RunCMake_test(find_program -DCMAKE_SYSTEM_NAME=${CMAKE_SYSTEM_NAME})

+ 4 - 0
Tests/RunCMake/find_library/RunCMakeTest.cmake

@@ -24,6 +24,10 @@ if(CMAKE_HOST_WIN32 AND MINGW)
   run_cmake(MSYSTEM_PREFIX)
   run_cmake(MSYSTEM_PREFIX)
 endif()
 endif()
 
 
+if(CMAKE_HOST_WIN32 AND MSVC)
+  run_cmake(Windows-MSVC)
+endif()
+
 run_cmake_script(FromScriptMode "-DTEMP_DIR=${RunCMake_BINARY_DIR}/FromScriptMode-temp")
 run_cmake_script(FromScriptMode "-DTEMP_DIR=${RunCMake_BINARY_DIR}/FromScriptMode-temp")
 
 
 run_cmake_with_options(FromPATHEnvDebugVar --debug-find-var=CREATED_LIBRARY)
 run_cmake_with_options(FromPATHEnvDebugVar --debug-find-var=CREATED_LIBRARY)

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

@@ -0,0 +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'

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

@@ -0,0 +1,7 @@
+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


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