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:
Georg Schwab
2021-05-06 11:26:09 +02:00
committed by Brad King
parent 2ee55f9718
commit d0c31cbff9

View File

@@ -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
}