mirror of
https://github.com/Kitware/CMake.git
synced 2026-01-04 04:40:56 -06:00
Windows: Use real artifact versioning symlinks if possible
When cross compiling from Windows to a platform that uses SONAMEs, real symlinks are now created for the VERSION and SOVERSION links instead of copies, if the user has the necessary privileges. Fixes: #22128
This commit is contained in:
@@ -1643,10 +1643,21 @@ cmsys::Status cmcmd::SymlinkInternal(std::string const& file,
|
||||
if (cmSystemTools::FileExists(link) || cmSystemTools::FileIsSymlink(link)) {
|
||||
cmSystemTools::RemoveFile(link);
|
||||
}
|
||||
#if defined(_WIN32) && !defined(__CYGWIN__)
|
||||
return cmSystemTools::CopyFileAlways(file, link);
|
||||
#else
|
||||
std::string linktext = cmSystemTools::GetFilenameName(file);
|
||||
#if defined(_WIN32) && !defined(__CYGWIN__)
|
||||
std::string errorMessage;
|
||||
cmsys::Status status =
|
||||
cmSystemTools::CreateSymlink(linktext, link, &errorMessage);
|
||||
// Creating a symlink will fail with ERROR_PRIVILEGE_NOT_HELD if the user
|
||||
// does not have SeCreateSymbolicLinkPrivilege, or if developer mode is not
|
||||
// active. In that case, we try to copy the file.
|
||||
if (status.GetWindows() == ERROR_PRIVILEGE_NOT_HELD) {
|
||||
status = cmSystemTools::CopyFileAlways(file, link);
|
||||
} else if (!status) {
|
||||
cmSystemTools::Error(errorMessage);
|
||||
}
|
||||
return status;
|
||||
#else
|
||||
return cmSystemTools::CreateSymlink(linktext, link);
|
||||
#endif
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user