cmState: Restore renamed commands on cleanup.

Commit v3.3.0-rc1~196^2~7 (cmake: Simplify command clean up
loop., 2015-04-12) introduced a bug that built-in commands which
were renamed no longer had their original name restored when
cleanup is performed between configure runs.  Check for that
and restore the commands with their original name.

Extend the complex test for this. That test is run by ctest with
the --build-two-config command line option.
This commit is contained in:
Stephen Kelly 2015-07-11 10:51:36 +02:00
parent b37fb49646
commit d4f032b546
2 changed files with 18 additions and 0 deletions

View File

@ -406,6 +406,7 @@ std::vector<std::string> cmState::GetCommandNames() const
void cmState::RemoveUserDefinedCommands() void cmState::RemoveUserDefinedCommands()
{ {
std::vector<cmCommand*> renamedCommands;
for(std::map<std::string, cmCommand*>::iterator j = this->Commands.begin(); for(std::map<std::string, cmCommand*>::iterator j = this->Commands.begin();
j != this->Commands.end(); ) j != this->Commands.end(); )
{ {
@ -415,11 +416,21 @@ void cmState::RemoveUserDefinedCommands()
delete j->second; delete j->second;
this->Commands.erase(j++); this->Commands.erase(j++);
} }
else if (j->first != j->second->GetName())
{
renamedCommands.push_back(j->second);
this->Commands.erase(j++);
}
else else
{ {
++j; ++j;
} }
} }
for (std::vector<cmCommand*>::const_iterator it = renamedCommands.begin();
it != renamedCommands.end(); ++it)
{
this->Commands[cmSystemTools::LowerCase((*it)->GetName())] = *it;
}
} }
void cmState::SetGlobalProperty(const std::string& prop, const char* value) void cmState::SetGlobalProperty(const std::string& prop, const char* value)

View File

@ -4,6 +4,13 @@
cmake_minimum_required(VERSION 2.4) cmake_minimum_required(VERSION 2.4)
project (Complex) project (Complex)
# Test that renaming a built-in works when configured multiple times.
message("message")
function(message)
_message(${ARGN})
endfunction()
message("message")
# Try setting a new policy. The IF test is for coverage. # Try setting a new policy. The IF test is for coverage.
if(POLICY CMP0003) if(POLICY CMP0003)
cmake_policy(SET CMP0003 NEW) cmake_policy(SET CMP0003 NEW)