summaryrefslogtreecommitdiffstats
path: root/Source
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2009-02-02 18:28:12 (GMT)
committerBrad King <brad.king@kitware.com>2009-02-02 18:28:12 (GMT)
commitac9b7ec1558e1370f578c67b1296fbe778a92b81 (patch)
tree8fe4990c6e318e0bdbf136dcf805e817c024440d /Source
parent7d6a5e097f17720ed21fe5faac1759bf387c7880 (diff)
downloadCMake-ac9b7ec1558e1370f578c67b1296fbe778a92b81.zip
CMake-ac9b7ec1558e1370f578c67b1296fbe778a92b81.tar.gz
CMake-ac9b7ec1558e1370f578c67b1296fbe778a92b81.tar.bz2
ENH: Refactor custom command rule hashing
This simplifies computation of custom command rule hashes to hash content exactly chosen as the custom commands are generated. Unfortunately this will change the hashes of existing build trees from earlier CMake versions, but this is not a big deal. The change is necessary so that in the future we can make optional adjustments to custom command lines at generate time without changing the hashes every time the option is changed.
Diffstat (limited to 'Source')
-rw-r--r--Source/cmGlobalGenerator.cxx15
-rw-r--r--Source/cmGlobalGenerator.h3
-rw-r--r--Source/cmLocalUnixMakefileGenerator3.cxx11
-rw-r--r--Source/cmLocalUnixMakefileGenerator3.h3
-rw-r--r--Source/cmMakefileTargetGenerator.cxx11
5 files changed, 23 insertions, 20 deletions
diff --git a/Source/cmGlobalGenerator.cxx b/Source/cmGlobalGenerator.cxx
index be9b0df..b0a6e83 100644
--- a/Source/cmGlobalGenerator.cxx
+++ b/Source/cmGlobalGenerator.cxx
@@ -2004,8 +2004,7 @@ cmGlobalGenerator::GetDirectoryContent(std::string const& dir, bool needDisk)
//----------------------------------------------------------------------------
void
cmGlobalGenerator::AddRuleHash(const std::vector<std::string>& outputs,
- std::vector<std::string>::const_iterator first,
- std::vector<std::string>::const_iterator last)
+ std::string const& content)
{
#if defined(CMAKE_BUILD_WITH_CMAKE)
// Ignore if there are no outputs.
@@ -2017,16 +2016,12 @@ cmGlobalGenerator::AddRuleHash(const std::vector<std::string>& outputs,
// Compute a hash of the rule.
RuleHash hash;
{
- unsigned char const* data;
- int length;
+ unsigned char const* data =
+ reinterpret_cast<unsigned char const*>(content.c_str());
+ int length = static_cast<int>(content.length());
cmsysMD5* sum = cmsysMD5_New();
cmsysMD5_Initialize(sum);
- for(std::vector<std::string>::const_iterator i = first; i != last; ++i)
- {
- data = reinterpret_cast<unsigned char const*>(i->c_str());
- length = static_cast<int>(i->length());
- cmsysMD5_Append(sum, data, length);
- }
+ cmsysMD5_Append(sum, data, length);
cmsysMD5_FinalizeHex(sum, hash.Data);
cmsysMD5_Delete(sum);
}
diff --git a/Source/cmGlobalGenerator.h b/Source/cmGlobalGenerator.h
index 51e462d..60847c2 100644
--- a/Source/cmGlobalGenerator.h
+++ b/Source/cmGlobalGenerator.h
@@ -251,8 +251,7 @@ public:
void GetFilesReplacedDuringGenerate(std::vector<std::string>& filenames);
void AddRuleHash(const std::vector<std::string>& outputs,
- std::vector<std::string>::const_iterator first,
- std::vector<std::string>::const_iterator last);
+ std::string const& content);
protected:
// for a project collect all its targets by following depend
diff --git a/Source/cmLocalUnixMakefileGenerator3.cxx b/Source/cmLocalUnixMakefileGenerator3.cxx
index 9517cd8..fad722d 100644
--- a/Source/cmLocalUnixMakefileGenerator3.cxx
+++ b/Source/cmLocalUnixMakefileGenerator3.cxx
@@ -968,7 +968,8 @@ void
cmLocalUnixMakefileGenerator3
::AppendCustomCommand(std::vector<std::string>& commands,
const cmCustomCommand& cc, bool echo_comment,
- cmLocalGenerator::RelativeRoot relative)
+ cmLocalGenerator::RelativeRoot relative,
+ std::ostream* content)
{
// Optionally create a command to display the custom command's
// comment text. This is used for pre-build, pre-link, and
@@ -991,6 +992,10 @@ cmLocalUnixMakefileGenerator3
{
dir = workingDir;
}
+ if(content)
+ {
+ *content << dir;
+ }
bool escapeOldStyle = cc.GetEscapeOldStyle();
bool escapeAllowMakeVars = cc.GetEscapeAllowMakeVars();
@@ -1048,6 +1053,10 @@ cmLocalUnixMakefileGenerator3
escapeAllowMakeVars);
}
}
+ if(content)
+ {
+ *content << cmd;
+ }
if(this->BorlandMakeCurlyHack)
{
// Borland Make has a very strange bug. If the first curly
diff --git a/Source/cmLocalUnixMakefileGenerator3.h b/Source/cmLocalUnixMakefileGenerator3.h
index ebb7c79..b35bdbc 100644
--- a/Source/cmLocalUnixMakefileGenerator3.h
+++ b/Source/cmLocalUnixMakefileGenerator3.h
@@ -332,7 +332,8 @@ protected:
const cmCustomCommand& cc,
bool echo_comment=false,
cmLocalGenerator::RelativeRoot relative =
- cmLocalGenerator::HOME_OUTPUT);
+ cmLocalGenerator::HOME_OUTPUT,
+ std::ostream* content = 0);
void AppendCleanCommand(std::vector<std::string>& commands,
const std::vector<std::string>& files,
cmTarget& target, const char* filename =0);
diff --git a/Source/cmMakefileTargetGenerator.cxx b/Source/cmMakefileTargetGenerator.cxx
index e19cd1d..c2cad66 100644
--- a/Source/cmMakefileTargetGenerator.cxx
+++ b/Source/cmMakefileTargetGenerator.cxx
@@ -1119,11 +1119,12 @@ void cmMakefileTargetGenerator
->AppendEcho(commands, comment.c_str(),
cmLocalUnixMakefileGenerator3::EchoGenerate);
}
- // Below we need to skip over the echo and progress commands.
- unsigned int skip = static_cast<unsigned int>(commands.size());
// Now append the actual user-specified commands.
- this->LocalGenerator->AppendCustomCommand(commands, cc);
+ cmOStringStream content;
+ this->LocalGenerator->AppendCustomCommand(commands, cc, false,
+ cmLocalGenerator::HOME_OUTPUT,
+ &content);
// Collect the dependencies.
std::vector<std::string> depends;
@@ -1151,9 +1152,7 @@ void cmMakefileTargetGenerator
// If the rule has changed make sure the output is rebuilt.
if(!symbolic)
{
- this->GlobalGenerator->AddRuleHash(cc.GetOutputs(),
- commands.begin()+skip,
- commands.end());
+ this->GlobalGenerator->AddRuleHash(cc.GetOutputs(), content.str());
}
}