From 3c0f7019908150f30e7f5a3e9e7dddd95b02c7c3 Mon Sep 17 00:00:00 2001 From: ur4t <46435411+ur4t@users.noreply.github.com> Date: Fri, 11 Aug 2023 07:05:50 +0800 Subject: MSVC: Run manifest tool with llvm-mt compatible arguments Default use of `llvm-mt` was disabled by commit 73d0d4e4b5 (BinUtils: Avoid llvm-mt because it is missing 'mt' features we use, 2022-03-08, v3.23.0-rc3~7^2). However, it can still be specified explicitly by the user. Due to limitations of LLVM's command line option parser, llvm-mt does not support arbitrary manifest files following a single switch. Issue: #23305 --- Modules/CMakeFindBinUtils.cmake | 2 +- Source/cmcmd.cxx | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/Modules/CMakeFindBinUtils.cmake b/Modules/CMakeFindBinUtils.cmake index f778891..431d00b 100644 --- a/Modules/CMakeFindBinUtils.cmake +++ b/Modules/CMakeFindBinUtils.cmake @@ -82,7 +82,7 @@ if(("x${CMAKE_${_CMAKE_PROCESSING_LANGUAGE}_SIMULATE_ID}" STREQUAL "xMSVC" AND if("x${CMAKE_${_CMAKE_PROCESSING_LANGUAGE}_COMPILER_ID}" STREQUAL "xClang") set(_CMAKE_NM_NAMES "llvm-nm" "nm") list(PREPEND _CMAKE_AR_NAMES "llvm-lib") - # llvm-mt does not support all flags we need in vs_link_exe + # llvm-mt is not ready to be used as a replacement for mt.exe # list(PREPEND _CMAKE_MT_NAMES "llvm-mt") list(PREPEND _CMAKE_LINKER_NAMES "lld-link") list(APPEND _CMAKE_TOOL_VARS NM) diff --git a/Source/cmcmd.cxx b/Source/cmcmd.cxx index b18f5cf..2ac9d8e 100644 --- a/Source/cmcmd.cxx +++ b/Source/cmcmd.cxx @@ -2539,14 +2539,17 @@ int cmVSLink::RunMT(std::string const& out, bool notify) std::vector mtCommand; mtCommand.push_back(this->MtPath.empty() ? "mt" : this->MtPath); mtCommand.emplace_back("/nologo"); - mtCommand.emplace_back("/manifest"); // add the linker generated manifest if the file exists. if (this->LinkGeneratesManifest && cmSystemTools::FileExists(this->LinkerManifestFile)) { + mtCommand.emplace_back("/manifest"); mtCommand.push_back(this->LinkerManifestFile); } - cm::append(mtCommand, this->UserManifests); + for (auto const& m : this->UserManifests) { + mtCommand.emplace_back("/manifest"); + mtCommand.push_back(m); + } mtCommand.push_back(out); if (notify) { // Add an undocumented option that enables a special return -- cgit v0.12