mirror of
https://github.com/Kitware/CMake.git
synced 2026-05-09 07:39:47 -05:00
ScopedEnv: add a RAII helper to temporarily manipulate the environment
This commit is contained in:
@@ -2310,6 +2310,41 @@ cmSystemTools::SaveRestoreEnvironment::~SaveRestoreEnvironment()
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
cmSystemTools::ScopedEnv::ScopedEnv(cm::string_view var)
|
||||||
|
{
|
||||||
|
std::string::size_type pos = var.find('=');
|
||||||
|
if (pos != std::string::npos) {
|
||||||
|
this->Key = std::string{ var.substr(0, pos) };
|
||||||
|
this->Original = cmSystemTools::GetEnvVar(this->Key);
|
||||||
|
|
||||||
|
cm::string_view value = var.substr(pos + 1);
|
||||||
|
|
||||||
|
if (!this->Original && value.empty()) {
|
||||||
|
// nothing to do if the environment variable wasn't already set and the
|
||||||
|
// new value is also empty. clear the Key member so the destructor also
|
||||||
|
// does nothing.
|
||||||
|
this->Key.clear();
|
||||||
|
} else {
|
||||||
|
if (value.empty()) {
|
||||||
|
cmSystemTools::UnPutEnv(this->Key);
|
||||||
|
} else {
|
||||||
|
cmSystemTools::PutEnv(cmStrCat(this->Key, '=', value));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
cmSystemTools::ScopedEnv::~ScopedEnv()
|
||||||
|
{
|
||||||
|
if (!this->Key.empty()) {
|
||||||
|
if (this->Original) {
|
||||||
|
cmSystemTools::PutEnv(cmStrCat(this->Key, '=', *this->Original));
|
||||||
|
} else {
|
||||||
|
cmSystemTools::UnPutEnv(Key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void cmSystemTools::EnableVSConsoleOutput()
|
void cmSystemTools::EnableVSConsoleOutput()
|
||||||
{
|
{
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
|
|||||||
@@ -517,6 +517,29 @@ public:
|
|||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/** \class ScopedEnv
|
||||||
|
* \brief An RAII class to temporarily set/unset an environment variable.
|
||||||
|
*
|
||||||
|
* The value passed to the constructor is put into the environment. This
|
||||||
|
* variable is of the form "var=value" and the original value of the "var"
|
||||||
|
* environment variable is saved. When the object is destroyed, the original
|
||||||
|
* value for the environment variable is restored. If the variable didn't
|
||||||
|
* exist, it will be unset.
|
||||||
|
*/
|
||||||
|
class ScopedEnv
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ScopedEnv(cm::string_view val);
|
||||||
|
~ScopedEnv();
|
||||||
|
|
||||||
|
ScopedEnv(ScopedEnv const&) = delete;
|
||||||
|
ScopedEnv& operator=(ScopedEnv const&) = delete;
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::string Key;
|
||||||
|
cm::optional<std::string> Original;
|
||||||
|
};
|
||||||
|
|
||||||
/** Setup the environment to enable VS 8 IDE output. */
|
/** Setup the environment to enable VS 8 IDE output. */
|
||||||
static void EnableVSConsoleOutput();
|
static void EnableVSConsoleOutput();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user