Browse Source

cmExperimental: add a mechanism for experimental CMake features

Ben Boeckel 3 years ago
parent
commit
fb289dfcd9
4 changed files with 78 additions and 0 deletions
  1. 2 0
      Source/CMakeLists.txt
  2. 56 0
      Source/cmExperimental.cxx
  3. 19 0
      Source/cmExperimental.h
  4. 1 0
      bootstrap

+ 2 - 0
Source/CMakeLists.txt

@@ -543,6 +543,8 @@ set(SRCS
   cmExecuteProcessCommand.h
   cmExpandedCommandArgument.cxx
   cmExpandedCommandArgument.h
+  cmExperimental.cxx
+  cmExperimental.h
   cmExportCommand.cxx
   cmExportCommand.h
   cmExportLibraryDependenciesCommand.cxx

+ 56 - 0
Source/cmExperimental.cxx

@@ -0,0 +1,56 @@
+/* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
+   file Copyright.txt or https://cmake.org/licensing for details.  */
+
+#include "cmExperimental.h"
+
+#include <cassert>
+#include <cstddef>
+#include <string>
+
+#include "cmMakefile.h"
+#include "cmMessageType.h"
+#include "cmValue.h"
+
+namespace {
+
+/*
+ * The `Uuid` fields of these objects should change periodically.
+ * Search for other instances to keep the documentation and test suite
+ * up-to-date.
+ */
+
+struct FeatureData
+{
+  std::string const Uuid;
+  std::string const Variable;
+  std::string const Description;
+  bool Warned;
+} LookupTable[] = {};
+static_assert(sizeof(LookupTable) / sizeof(LookupTable[0]) ==
+                static_cast<size_t>(cmExperimental::Feature::Sentinel),
+              "Experimental feature lookup table mismatch");
+
+FeatureData& DataForFeature(cmExperimental::Feature f)
+{
+  assert(f != cmExperimental::Feature::Sentinel);
+  return LookupTable[static_cast<size_t>(f)];
+}
+}
+
+bool cmExperimental::HasSupportEnabled(cmMakefile const& mf, Feature f)
+{
+  bool enabled = false;
+  auto& data = DataForFeature(f);
+
+  auto value = mf.GetDefinition(data.Variable);
+  if (value == data.Uuid) {
+    enabled = true;
+  }
+
+  if (enabled && !data.Warned) {
+    mf.IssueMessage(MessageType::AUTHOR_WARNING, data.Description);
+    data.Warned = true;
+  }
+
+  return enabled;
+}

+ 19 - 0
Source/cmExperimental.h

@@ -0,0 +1,19 @@
+/* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
+   file Copyright.txt or https://cmake.org/licensing for details.  */
+
+#pragma once
+
+#include "cmConfigure.h" // IWYU pragma: keep
+
+class cmMakefile;
+
+class cmExperimental
+{
+public:
+  enum class Feature
+  {
+    Sentinel,
+  };
+
+  static bool HasSupportEnabled(cmMakefile const& mf, Feature f);
+};

+ 1 - 0
bootstrap

@@ -337,6 +337,7 @@ CMAKE_CXX_SOURCES="\
   cmExecProgramCommand \
   cmExecuteProcessCommand \
   cmExpandedCommandArgument \
+  cmExperimental \
   cmExportBuildFileGenerator \
   cmExportFileGenerator \
   cmExportInstallFileGenerator \