ENH: Added methods to cmSystemTools to save and restore file modification times.

This commit is contained in:
Brad King 2008-04-14 11:43:45 -04:00
parent ce0f575473
commit 703b8c8225
2 changed files with 80 additions and 1 deletions

View File

@ -56,6 +56,18 @@
# include "cmELF.h" # include "cmELF.h"
#endif #endif
class cmSystemToolsFileTime
{
public:
#if defined(_WIN32) && !defined(__CYGWIN__)
FILETIME timeCreation;
FILETIME timeLastAccess;
FILETIME timeLastWrite;
#else
struct utimbuf timeBuf;
#endif
};
#if defined(__sgi) && !defined(__GNUC__) #if defined(__sgi) && !defined(__GNUC__)
# pragma set woff 1375 /* base class destructor not virtual */ # pragma set woff 1375 /* base class destructor not virtual */
#endif #endif
@ -2110,6 +2122,67 @@ bool cmSystemTools::CopyFileTime(const char* fromFile, const char* toFile)
return true; return true;
} }
//----------------------------------------------------------------------------
cmSystemToolsFileTime* cmSystemTools::FileTimeNew()
{
return new cmSystemToolsFileTime;
}
//----------------------------------------------------------------------------
void cmSystemTools::FileTimeDelete(cmSystemToolsFileTime* t)
{
delete t;
}
//----------------------------------------------------------------------------
bool cmSystemTools::FileTimeGet(const char* fname, cmSystemToolsFileTime* t)
{
#if defined(_WIN32) && !defined(__CYGWIN__)
cmSystemToolsWindowsHandle h =
CreateFile(fname, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);
if(!h)
{
return false;
}
if(!GetFileTime(h, &t->timeCreation, &t->timeLastAccess, &t->timeLastWrite))
{
return false;
}
#else
struct stat st;
if(stat(fname, &st) < 0)
{
return false;
}
t->timeBuf.actime = st.st_atime;
t->timeBuf.modtime = st.st_mtime;
#endif
return true;
}
//----------------------------------------------------------------------------
bool cmSystemTools::FileTimeSet(const char* fname, cmSystemToolsFileTime* t)
{
#if defined(_WIN32) && !defined(__CYGWIN__)
cmSystemToolsWindowsHandle h =
CreateFile(toFile, GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
if(!h)
{
return false;
}
if(!SetFileTime(h, &t->timeCreation, &t->timeLastAccess, &t->timeLastWrite))
{
return false;
}
#else
if(utime(fname, &t->timeBuf) < 0)
{
return false;
}
#endif
return true;
}
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
static std::string cmSystemToolsExecutableDirectory; static std::string cmSystemToolsExecutableDirectory;
void cmSystemTools::FindExecutableDirectory(const char* argv0) void cmSystemTools::FindExecutableDirectory(const char* argv0)

View File

@ -22,7 +22,7 @@
#include <cmsys/SystemTools.hxx> #include <cmsys/SystemTools.hxx>
#include <cmsys/Process.h> #include <cmsys/Process.h>
class cmSystemToolsFileTime;
/** \class cmSystemTools /** \class cmSystemTools
* \brief A collection of useful functions for CMake. * \brief A collection of useful functions for CMake.
@ -363,6 +363,12 @@ public:
the first argument to that named by the second. */ the first argument to that named by the second. */
static bool CopyFileTime(const char* fromFile, const char* toFile); static bool CopyFileTime(const char* fromFile, const char* toFile);
/** Save and restore file times. */
static cmSystemToolsFileTime* FileTimeNew();
static void FileTimeDelete(cmSystemToolsFileTime*);
static bool FileTimeGet(const char* fname, cmSystemToolsFileTime* t);
static bool FileTimeSet(const char* fname, cmSystemToolsFileTime* t);
/** Find the directory containing the running executable. Save it /** Find the directory containing the running executable. Save it
in a global location to be queried by GetExecutableDirectory in a global location to be queried by GetExecutableDirectory
later. */ later. */