[CMake] [PATCH] CPack fails because of a sharing violation
Bill Hoffman
bill.hoffman at kitware.com
Fri Sep 18 12:50:50 EDT 2009
Claudio Bley wrote:
> Hi.
>
> Trying to build & install Boost I ran into the following error when
> CPack was called:
>
> ,----
> | CPack: - Install component: fusion_headers
> | CMake Error at libs/fusion/cmake_install.cmake:31 (FILE):
> | file Problem setting modification time on file
> | "C:/build/vc90nmake/boost_1_40_0/_CPack_Packages/win32/NSIS/Boost-1.40.0-vc9/fusion_headers/include/boost-1_40/boost/fusion/include/iterator_facade.hpp"
> | Call Stack (most recent call first):
> | libs/cmake_install.cmake:48 (INCLUDE)
> | cmake_install.cmake:37 (INCLUDE)
> |
> | CPack Error: Error when generating package: Boost
> | NMAKE : fatal error U1077: ""C:\Programme\CMake 2.6\bin\cpack.exe"": Return-Code "0x1"
> | Stop.
> `----
>
> I debugged cpack.exe and realized that the error occured in
> Source/cmSystemTools.cxx:CopyFileTime() when trying to open the target
> file.
>
> GetLastError() returned ERROR_SHARING_VIOLATION.
>
> According to
> http://support.microsoft.com/?scid=kb%3Ben-us%3B316609&x=17&y=20 one
> should retry attempting to open the file until successfull.
>
> I implemented this approach (see the following patch) and succeeded in
> building an installer package for Boost.
>
> Of course, there a some other places where CreateFile is called and this
> problem might happen there also. It might be a good idea to generalize
> this into an utility function.
>
> Btw, do you realize that the cmSystemToolsWindowsHandle class is broken
> according to its copy/assignment semantics?
>
>
> Index: Source/cmSystemTools.cxx
> ===================================================================
> RCS file: /cvsroot/CMake/CMake/Source/cmSystemTools.cxx,v
> retrieving revision 1.401
> diff -u -r1.401 cmSystemTools.cxx
> --- Source/cmSystemTools.cxx 11 Sep 2009 12:18:13 -0000 1.401
> +++ Source/cmSystemTools.cxx 18 Sep 2009 14:43:23 -0000
> @@ -2134,11 +2134,26 @@
> bool cmSystemTools::CopyFileTime(const char* fromFile, const char* toFile)
> {
> #if defined(_WIN32) && !defined(__CYGWIN__)
> + const DWORD retryDelay_millisecs = 250;
> + const int maxRetries = 15;
> + int retries = 0;
> +
> cmSystemToolsWindowsHandle hFrom =
> CreateFile(fromFile, GENERIC_READ, FILE_SHARE_READ, 0,
> OPEN_EXISTING, 0, 0);
> - cmSystemToolsWindowsHandle hTo =
> - CreateFile(toFile, GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
> +
> + HANDLE hTry;
> +
> + while ((hTry = CreateFile(toFile, GENERIC_WRITE,
> + FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0)) == INVALID_HANDLE_VALUE
> + && GetLastError() == ERROR_SHARING_VIOLATION
> + && ++retries <= maxRetries)
> + {
> + Sleep(retryDelay_millisecs);
> + }
> +
> + cmSystemToolsWindowsHandle hTo(hTry);
> +
> if(!hFrom || !hTo)
> {
> return false;
>
>
Why is it trying to copy a file that is being used?
Seems like there is some other issue here, and this just gets around a
different bug...
-Bill
More information about the CMake
mailing list