Merge topic 'fbuild_fix_clang_cl_manifest'

30ce1cfdcb FASTBuild: fix clang-cl build with manifests

Acked-by: Kitware Robot <kwrobot@kitware.com>
Merge-request: !11823
This commit is contained in:
Brad King
2026-03-17 13:04:29 +00:00
committed by Kitware Robot
4 changed files with 23 additions and 20 deletions

View File

@@ -392,12 +392,21 @@ else()
endif()
unset(__WINDOWS_MSVC_CMP0184)
# Use manifest directly on the linker's command line.
set(_CMAKE_FASTBUILD_MANIFESTS "")
if(CMAKE_GENERATOR MATCHES "FASTBuild")
string(APPEND _CMAKE_FASTBUILD_MANIFESTS " <MANIFESTS>")
endif()
macro(__windows_compiler_msvc lang)
if(NOT MSVC_VERSION LESS 1400 AND NOT CMAKE_GENERATOR MATCHES "FASTBuild")
# for 2005 make sure the manifest is put in the dll with mt
set(_CMAKE_VS_LINK_DLL "<CMAKE_COMMAND> -E vs_link_dll --msvc-ver=${MSVC_VERSION} --intdir=<OBJECT_DIR> --rc=<CMAKE_RC_COMPILER> --mt=<CMAKE_MT> --manifests <MANIFESTS> -- ")
set(_CMAKE_VS_LINK_EXE "<CMAKE_COMMAND> -E vs_link_exe --msvc-ver=${MSVC_VERSION} --intdir=<OBJECT_DIR> --rc=<CMAKE_RC_COMPILER> --mt=<CMAKE_MT> --manifests <MANIFESTS> -- ")
endif()
if (CMAKE_GENERATOR MATCHES "FASTBuild")
set(CMAKE_${lang}_LINKER_MANIFEST_FLAG " /MANIFEST:EMBED /MANIFESTINPUT:")
endif()
set(CMAKE_SHARED_LIBRARY_CREATE_${lang}_FLAGS "")
if(CMAKE_SYSTEM_NAME STREQUAL "WindowsKernelModeDriver")
set(CMAKE_${lang}_SHARED_LIBRARY_COMPILE_DEFINITIONS "")
@@ -407,7 +416,7 @@ macro(__windows_compiler_msvc lang)
set(_DLL_DRIVER "/dll")
endif()
set(CMAKE_${lang}_CREATE_SHARED_LIBRARY
"${_CMAKE_VS_LINK_DLL}<CMAKE_LINKER> ${CMAKE_CL_NOLOGO} <OBJECTS> ${CMAKE_START_TEMP_FILE} /out:<TARGET> /implib:<TARGET_IMPLIB> /pdb:<TARGET_PDB> ${_DLL_DRIVER} /version:<TARGET_VERSION_MAJOR>.<TARGET_VERSION_MINOR>${_PLATFORM_LINK_FLAGS} <LINK_FLAGS> <LINK_LIBRARIES> ${CMAKE_END_TEMP_FILE}")
"${_CMAKE_VS_LINK_DLL}<CMAKE_LINKER> ${CMAKE_CL_NOLOGO} <OBJECTS> ${CMAKE_START_TEMP_FILE} /out:<TARGET> /implib:<TARGET_IMPLIB> /pdb:<TARGET_PDB> ${_DLL_DRIVER} /version:<TARGET_VERSION_MAJOR>.<TARGET_VERSION_MINOR>${_PLATFORM_LINK_FLAGS} <LINK_FLAGS> <LINK_LIBRARIES>${_CMAKE_FASTBUILD_MANIFESTS} ${CMAKE_END_TEMP_FILE}")
unset(_DLL_DRIVER)
set(CMAKE_${lang}_CREATE_SHARED_MODULE ${CMAKE_${lang}_CREATE_SHARED_LIBRARY})
@@ -423,7 +432,7 @@ macro(__windows_compiler_msvc lang)
set(CMAKE_${lang}_LINK_DEF_FILE_FLAG "/DEF:")
set(CMAKE_${lang}_USE_RESPONSE_FILE_FOR_OBJECTS 1)
set(CMAKE_${lang}_LINK_EXECUTABLE
"${_CMAKE_VS_LINK_EXE}<CMAKE_LINKER> ${CMAKE_CL_NOLOGO} <OBJECTS> ${CMAKE_START_TEMP_FILE} /out:<TARGET> /implib:<TARGET_IMPLIB> /pdb:<TARGET_PDB> /version:<TARGET_VERSION_MAJOR>.<TARGET_VERSION_MINOR>${_PLATFORM_LINK_FLAGS} <LINK_FLAGS> <LINK_LIBRARIES>${CMAKE_END_TEMP_FILE}")
"${_CMAKE_VS_LINK_EXE}<CMAKE_LINKER> ${CMAKE_CL_NOLOGO} <OBJECTS> ${CMAKE_START_TEMP_FILE} /out:<TARGET> /implib:<TARGET_IMPLIB> /pdb:<TARGET_PDB> /version:<TARGET_VERSION_MAJOR>.<TARGET_VERSION_MINOR>${_PLATFORM_LINK_FLAGS} <LINK_FLAGS> <LINK_LIBRARIES>${_CMAKE_FASTBUILD_MANIFESTS} ${CMAKE_END_TEMP_FILE}")
if(CMAKE_SYSTEM_NAME STREQUAL "WindowsCE")
set(CMAKE_${lang}_CREATE_WIN32_EXE "/entry:WinMainCRTStartup")

View File

@@ -277,8 +277,7 @@ bool cmFastbuildNormalTargetGenerator::DetectBaseLinkerCommand(
vars.CMTargetType = cmState::GetTargetTypeName(targetType).c_str();
vars.Config = Config.c_str();
vars.Language = linkLanguage.c_str();
std::string const manifests =
cmJoin(this->GetManifestsAsFastbuildPath(), " ");
std::string const manifests = this->GetManifests(Config);
vars.Manifests = manifests.c_str();
std::string const stdLibString = this->Makefile->GetSafeDefinition(
@@ -1006,27 +1005,15 @@ void cmFastbuildNormalTargetGenerator::ProcessManifests(
if (this->GetGlobalGenerator()->GetCMakeInstance()->GetIsInTryCompile()) {
return;
}
auto manifests = this->GetManifestsAsFastbuildPath();
if (manifests.empty()) {
return;
}
std::vector<std::string> const manifests =
this->GetManifestsAsFastbuildPath();
// Manifests should always be in .Libraries2, so we re-link when needed.
// Tested in RunCMake.BuildDepends
linkerNode.Libraries2.reserve(linkerNode.Libraries2.size() +
manifests.size());
for (auto const& manifest : manifests) {
linkerNode.Libraries2.emplace_back(manifest);
}
if (this->Makefile->GetSafeDefinition("CMAKE_C_COMPILER_ID") != "MSVC") {
return;
}
for (auto const& manifest : manifests) {
linkerNode.LinkerOptions =
cmStrCat("/MANIFESTINPUT:", manifest, ' ', linkerNode.LinkerOptions);
}
// /MANIFESTINPUT only works with /MANIFEST:EMBED
linkerNode.LinkerOptions =
cmStrCat("/MANIFEST:EMBED ", linkerNode.LinkerOptions);
}
void cmFastbuildNormalTargetGenerator::AddStampExeIfApplicable(

View File

@@ -127,3 +127,9 @@ std::string cmLocalFastbuildGenerator::ConvertToIncludeReference(
}
return converted;
}
std::string cmLocalFastbuildGenerator::MaybeRelativeToWorkDir(
std::string const& path) const
{
return this->MaybeRelativeToTopBinDir(path);
}

View File

@@ -33,4 +33,5 @@ public:
private:
std::string ConvertToIncludeReference(
std::string const& path, cmOutputConverter::OutputFormat format) override;
std::string MaybeRelativeToWorkDir(std::string const& path) const override;
};