summaryrefslogtreecommitdiffstats
path: root/Source/kwsys/SystemTools.cxx
diff options
context:
space:
mode:
authorDavid Cole <david.cole@kitware.com>2008-12-18 15:43:24 (GMT)
committerDavid Cole <david.cole@kitware.com>2008-12-18 15:43:24 (GMT)
commit0fafdb7eb8b710594448d2ccf61d3896b4ea8a17 (patch)
tree6da65828ed75b5509f1d9e2e0b178022a689abb2 /Source/kwsys/SystemTools.cxx
parentf8c0dc27b56495a178cc711b594cd0f6395d942d (diff)
downloadCMake-0fafdb7eb8b710594448d2ccf61d3896b4ea8a17.zip
CMake-0fafdb7eb8b710594448d2ccf61d3896b4ea8a17.tar.gz
CMake-0fafdb7eb8b710594448d2ccf61d3896b4ea8a17.tar.bz2
BUG: Do not copy permissions of files when making the copy in an install rule. If the source file was read-only, this prevents the subsequent set of the destination file's modification time, making the copied file always different in time-stamp than the original and always installing a new file with a new time stamp (but the same content) causing unnecessary downstream incremental rebuilds. As part of this fix, add an optional copyPermissions parameter to the SystemTools routines CopyFileIfDifferent, CopyFileAlways, CopyAFile and CopyADirectory. The copyPermissions parameter defaults to true to preserve the behavior of these routines for existing callers.
Diffstat (limited to 'Source/kwsys/SystemTools.cxx')
-rw-r--r--Source/kwsys/SystemTools.cxx28
1 files changed, 17 insertions, 11 deletions
diff --git a/Source/kwsys/SystemTools.cxx b/Source/kwsys/SystemTools.cxx
index 72b109c..65f6259 100644
--- a/Source/kwsys/SystemTools.cxx
+++ b/Source/kwsys/SystemTools.cxx
@@ -1611,7 +1611,8 @@ kwsys_stl::string SystemTools::ConvertToWindowsOutputPath(const char* path)
}
bool SystemTools::CopyFileIfDifferent(const char* source,
- const char* destination)
+ const char* destination,
+ bool copyPermissions)
{
// special check for a destination that is a directory
// FilesDiffer does not handle file to directory compare
@@ -1624,7 +1625,8 @@ bool SystemTools::CopyFileIfDifferent(const char* source,
new_destination += SystemTools::GetFilenameName(source_name);
if(SystemTools::FilesDiffer(source, new_destination.c_str()))
{
- return SystemTools::CopyFileAlways(source, destination);
+ return SystemTools::CopyFileAlways(source, destination,
+ copyPermissions);
}
else
{
@@ -1637,7 +1639,7 @@ bool SystemTools::CopyFileIfDifferent(const char* source,
// are different
if(SystemTools::FilesDiffer(source, destination))
{
- return SystemTools::CopyFileAlways(source, destination);
+ return SystemTools::CopyFileAlways(source, destination, copyPermissions);
}
// at this point the files must be the same so return true
return true;
@@ -1718,10 +1720,12 @@ bool SystemTools::FilesDiffer(const char* source,
}
+//----------------------------------------------------------------------------
/**
* Copy a file named by "source" to the file named by "destination".
*/
-bool SystemTools::CopyFileAlways(const char* source, const char* destination)
+bool SystemTools::CopyFileAlways(const char* source, const char* destination,
+ bool copyPermissions)
{
// If files are the same do not copy
if ( SystemTools::SameFile(source, destination) )
@@ -1824,7 +1828,7 @@ bool SystemTools::CopyFileAlways(const char* source, const char* destination)
{
return false;
}
- if ( perms )
+ if ( copyPermissions && perms )
{
if ( !SystemTools::SetPermissions(destination, perm) )
{
@@ -1836,15 +1840,15 @@ bool SystemTools::CopyFileAlways(const char* source, const char* destination)
//----------------------------------------------------------------------------
bool SystemTools::CopyAFile(const char* source, const char* destination,
- bool always)
+ bool always, bool copyPermissions)
{
if(always)
{
- return SystemTools::CopyFileAlways(source, destination);
+ return SystemTools::CopyFileAlways(source, destination, copyPermissions);
}
else
{
- return SystemTools::CopyFileIfDifferent(source, destination);
+ return SystemTools::CopyFileIfDifferent(source, destination, copyPermissions);
}
}
@@ -1853,7 +1857,7 @@ bool SystemTools::CopyAFile(const char* source, const char* destination,
* "destination".
*/
bool SystemTools::CopyADirectory(const char* source, const char* destination,
- bool always)
+ bool always, bool copyPermissions)
{
Directory dir;
dir.Load(source);
@@ -1877,14 +1881,16 @@ bool SystemTools::CopyADirectory(const char* source, const char* destination,
fullDestPath += dir.GetFile(static_cast<unsigned long>(fileNum));
if (!SystemTools::CopyADirectory(fullPath.c_str(),
fullDestPath.c_str(),
- always))
+ always,
+ copyPermissions))
{
return false;
}
}
else
{
- if(!SystemTools::CopyAFile(fullPath.c_str(), destination, always))
+ if(!SystemTools::CopyAFile(fullPath.c_str(), destination, always,
+ copyPermissions))
{
return false;
}