mirror of
https://github.com/Kitware/CMake.git
synced 2026-08-10 17:14:10 +00:00
77 lines
1.8 KiB
C++
77 lines
1.8 KiB
C++
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
|
file LICENSE.rst or https://cmake.org/licensing for details. */
|
|
#pragma once
|
|
|
|
#include "cmConfigure.h" // IWYU pragma: keep
|
|
|
|
#include <map>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
#include <cm/optional>
|
|
|
|
/**
|
|
* Helper class to represent an environment.
|
|
*/
|
|
class cmEnvironment
|
|
{
|
|
public:
|
|
/** Initialize from `NAME=VALUE` strings. */
|
|
cmEnvironment(std::vector<std::string> const& env = {});
|
|
|
|
/**
|
|
* Add a single variable (or remove if no = sign) to the current
|
|
* environment.
|
|
*/
|
|
void PutEnv(std::string const& env);
|
|
|
|
/** Remove a single variable from the current environment. */
|
|
void UnPutEnv(std::string const& env);
|
|
|
|
/**
|
|
* Move the environment entries from `other` into this one, overwriting
|
|
* existing variables when a key is already present. */
|
|
void Update(cmEnvironment&& other);
|
|
|
|
/** Modify the value of a variable in-place using a transform function. */
|
|
template <typename F>
|
|
void Modify(std::string const& name, F&& transform)
|
|
{
|
|
cm::optional<std::string>& val = this->Map[name];
|
|
if (!val.has_value()) {
|
|
val = std::string{};
|
|
}
|
|
transform(*val);
|
|
}
|
|
|
|
std::vector<std::string> GetVariables() const;
|
|
|
|
std::string RecordDifference(cmEnvironment const& original) const;
|
|
|
|
protected:
|
|
struct EnvNameLess
|
|
{
|
|
bool operator()(std::string const& lhs, std::string const& rhs) const;
|
|
};
|
|
std::map<std::string, cm::optional<std::string>, EnvNameLess> Map;
|
|
};
|
|
|
|
class cmEnvironmentModification
|
|
{
|
|
public:
|
|
bool Add(std::string const& envmod);
|
|
bool Add(std::vector<std::string> const& envmod);
|
|
|
|
void ApplyTo(cmEnvironment& env);
|
|
|
|
private:
|
|
struct Entry
|
|
{
|
|
std::string Name;
|
|
std::string Value;
|
|
std::string Op;
|
|
};
|
|
|
|
std::vector<Entry> Entries;
|
|
};
|