ソースを参照

BUG: Gracefully handle broken version symlinks

This teaches the helper commands 'cmake -E cmake_symlink_executable' and
'cmake -E cmake_symlink_library' to remove broken symlinks before
creating a symlink and report an error when the symlink cannot be
created.  See issue #8654.
Brad King 16 年 前
コミット
ed5e4d8be2
1 ファイル変更9 行追加3 行削除
  1. 9 3
      Source/cmake.cxx

+ 9 - 3
Source/cmake.cxx

@@ -1366,24 +1366,28 @@ int cmake::ExecuteCMakeCommand(std::vector<std::string>& args)
       if(soName != realName)
         {
         std::string fname = cmSystemTools::GetFilenameName(realName);
-        if(cmSystemTools::FileExists(soName.c_str()))
+        if(cmSystemTools::FileExists(soName.c_str()) ||
+           cmSystemTools::FileIsSymlink(soName.c_str()))
           {
           cmSystemTools::RemoveFile(soName.c_str());
           }
         if(!cmSystemTools::CreateSymlink(fname.c_str(), soName.c_str()))
           {
+          cmSystemTools::ReportLastSystemError("cmake_symlink_library");
           result = 1;
           }
         }
       if(name != soName)
         {
         std::string fname = cmSystemTools::GetFilenameName(soName);
-        if(cmSystemTools::FileExists(soName.c_str()))
+        if(cmSystemTools::FileExists(name.c_str()) ||
+           cmSystemTools::FileIsSymlink(name.c_str()))
           {
           cmSystemTools::RemoveFile(name.c_str());
           }
         if(!cmSystemTools::CreateSymlink(fname.c_str(), name.c_str()))
           {
+          cmSystemTools::ReportLastSystemError("cmake_symlink_library");
           result = 1;
           }
         }
@@ -1398,12 +1402,14 @@ int cmake::ExecuteCMakeCommand(std::vector<std::string>& args)
       if(name != realName)
         {
         std::string fname = cmSystemTools::GetFilenameName(realName);
-        if(cmSystemTools::FileExists(realName.c_str()))
+        if(cmSystemTools::FileExists(name.c_str()) ||
+           cmSystemTools::FileIsSymlink(name.c_str()))
           {
           cmSystemTools::RemoveFile(name.c_str());
           }
         if(!cmSystemTools::CreateSymlink(fname.c_str(), name.c_str()))
           {
+          cmSystemTools::ReportLastSystemError("cmake_symlink_executable");
           result = 1;
           }
         }