From 4d3a387ac6cca006ca3b35c67f562fa15702fa4c Mon Sep 17 00:00:00 2001 From: David Cole Date: Wed, 23 Dec 2009 14:34:46 -0500 Subject: Preserve environment variables across calls to cmCTestScriptHandler::RunConfigurationScript. This will help prevent problems like we are currently experiencing (regarding CMake continuous dashboards only running once each day because the HOME environment variable is modified indirectly by a command in a called script, but affects the environment in the calling script). --- Source/CTest/cmCTestScriptHandler.cxx | 4 ++++ Source/cmSystemTools.cxx | 12 ++++++++++++ Source/cmSystemTools.h | 14 ++++++++++++++ 3 files changed, 30 insertions(+) diff --git a/Source/CTest/cmCTestScriptHandler.cxx b/Source/CTest/cmCTestScriptHandler.cxx index 5983e68..fdf17e0 100644 --- a/Source/CTest/cmCTestScriptHandler.cxx +++ b/Source/CTest/cmCTestScriptHandler.cxx @@ -583,6 +583,10 @@ void cmCTestScriptHandler::SleepInSeconds(unsigned int secondsToWait) int cmCTestScriptHandler::RunConfigurationScript (const std::string& total_script_arg, bool pscope) { +#ifdef CMAKE_BUILD_WITH_CMAKE + cmSystemTools::SaveRestoreEnvironment sre; +#endif + int result; this->ScriptStartTime = diff --git a/Source/cmSystemTools.cxx b/Source/cmSystemTools.cxx index 89a241d..351e1b1 100644 --- a/Source/cmSystemTools.cxx +++ b/Source/cmSystemTools.cxx @@ -1673,6 +1673,18 @@ void cmSystemTools::RestoreEnv(const std::vector& env) PutEnv(eit->c_str()); } } + +//---------------------------------------------------------------------- +cmSystemTools::SaveRestoreEnvironment::SaveRestoreEnvironment() +{ + this->Env = cmSystemTools::GetEnvironmentVariables(); +} + +//---------------------------------------------------------------------- +cmSystemTools::SaveRestoreEnvironment::~SaveRestoreEnvironment() +{ + cmSystemTools::RestoreEnv(this->Env); +} #endif void cmSystemTools::EnableVSConsoleOutput() diff --git a/Source/cmSystemTools.h b/Source/cmSystemTools.h index e5bb305..ed924dd 100644 --- a/Source/cmSystemTools.h +++ b/Source/cmSystemTools.h @@ -358,6 +358,20 @@ public: AppendEnv to put the environment back to the way it was. */ static void RestoreEnv(const std::vector& env); + + /** Helper class to save and restore the environment. + Instantiate this class as an automatic variable on + the stack. Its constructor saves a copy of the current + environment and then its destructor restores the + original environment. */ + class SaveRestoreEnvironment + { + public: + SaveRestoreEnvironment(); + virtual ~SaveRestoreEnvironment(); + private: + std::vector Env; + }; #endif /** Setup the environment to enable VS 8 IDE output. */ -- cgit v0.12