summaryrefslogtreecommitdiffstats
path: root/Source/cmIDEOptions.h
diff options
context:
space:
mode:
Diffstat (limited to 'Source/cmIDEOptions.h')
-rw-r--r--Source/cmIDEOptions.h116
1 files changed, 116 insertions, 0 deletions
diff --git a/Source/cmIDEOptions.h b/Source/cmIDEOptions.h
new file mode 100644
index 0000000..f949ae3
--- /dev/null
+++ b/Source/cmIDEOptions.h
@@ -0,0 +1,116 @@
+/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
+ file Copyright.txt or https://cmake.org/licensing for details. */
+#ifndef cmIDEOptions_h
+#define cmIDEOptions_h
+
+#include "cmConfigure.h" // IWYU pragma: keep
+
+#include <map>
+#include <string>
+#include <vector>
+
+struct cmIDEFlagTable;
+
+/** \class cmIDEOptions
+ * \brief Superclass for IDE option processing
+ */
+class cmIDEOptions
+{
+public:
+ cmIDEOptions();
+ virtual ~cmIDEOptions();
+
+ // Store definitions, includes and flags.
+ void AddDefine(const std::string& define);
+ void AddDefines(std::string const& defines);
+ void AddDefines(const std::vector<std::string>& defines);
+ std::vector<std::string> const& GetDefines() const;
+
+ void AddInclude(const std::string& includes);
+ void AddIncludes(std::string const& includes);
+ void AddIncludes(const std::vector<std::string>& includes);
+ std::vector<std::string> const& GetIncludes() const;
+
+ void AddFlag(std::string const& flag, std::string const& value);
+ void AddFlag(std::string const& flag, std::vector<std::string> const& value);
+ void AppendFlag(std::string const& flag, std::string const& value);
+ void AppendFlag(std::string const& flag,
+ std::vector<std::string> const& value);
+ void AppendFlagString(std::string const& flag, std::string const& value);
+ void RemoveFlag(std::string const& flag);
+ bool HasFlag(std::string const& flag) const;
+ const char* GetFlag(std::string const& flag) const;
+
+protected:
+ // create a map of xml tags to the values they should have in the output
+ // for example, "BufferSecurityCheck" = "TRUE"
+ // first fill this table with the values for the configuration
+ // Debug, Release, etc,
+ // Then parse the command line flags specified in CMAKE_CXX_FLAGS
+ // and CMAKE_C_FLAGS
+ // and overwrite or add new values to this map
+ class FlagValue : public std::vector<std::string>
+ {
+ using derived = std::vector<std::string>;
+
+ public:
+ FlagValue& operator=(std::string const& r)
+ {
+ this->resize(1);
+ this->operator[](0) = r;
+ return *this;
+ }
+ FlagValue& operator=(std::vector<std::string> const& r)
+ {
+ this->derived::operator=(r);
+ return *this;
+ }
+ FlagValue& append_with_comma(std::string const& r)
+ {
+ return append_with_separator(r, ',');
+ }
+ FlagValue& append_with_space(std::string const& r)
+ {
+ return append_with_separator(r, ' ');
+ }
+
+ private:
+ FlagValue& append_with_separator(std::string const& r, char separator)
+ {
+ this->resize(1);
+ std::string& l = this->operator[](0);
+ if (!l.empty()) {
+ l += separator;
+ }
+ l += r;
+ return *this;
+ }
+ };
+ std::map<std::string, FlagValue> FlagMap;
+
+ // Preprocessor definitions.
+ std::vector<std::string> Defines;
+
+ // Include directories.
+ std::vector<std::string> Includes;
+
+ bool DoingDefine;
+ bool AllowDefine;
+ bool DoingInclude;
+ bool AllowInclude;
+ bool AllowSlash;
+ cmIDEFlagTable const* DoingFollowing;
+ enum
+ {
+ FlagTableCount = 16
+ };
+ cmIDEFlagTable const* FlagTable[FlagTableCount];
+ void HandleFlag(std::string const& flag);
+ bool CheckFlagTable(cmIDEFlagTable const* table, std::string const& flag,
+ bool& flag_handled);
+ void FlagMapUpdate(cmIDEFlagTable const* entry,
+ std::string const& new_value);
+ virtual void StoreUnknownFlag(std::string const& flag) = 0;
+};
+
+#endif