| /* 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; | |
| }; |