1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
|
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
file LICENSE.rst or https://cmake.org/licensing for details. */
#include "cmExperimental.h"
#include <cassert>
#include <cstddef>
#include <string>
#include "cmGlobalGenerator.h"
#include "cmMakefile.h"
#include "cmMessageType.h"
#include "cmStringAlgorithms.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.
*/
cmExperimental::FeatureData const LookupTable[] = {
// ExportPackageDependencies
{ "ExportPackageDependencies",
"1942b4fa-b2c5-4546-9385-83f254070067",
"CMAKE_EXPERIMENTAL_EXPORT_PACKAGE_DEPENDENCIES",
"CMake's EXPORT_PACKAGE_DEPENDENCIES support is experimental. It is meant "
"only for experimentation and feedback to CMake developers.",
{},
cmExperimental::TryCompileCondition::Always },
// CxxImportStd
{ "CxxImportStd",
"d0edc3af-4c50-42ea-a356-e2862fe7a444",
"CMAKE_EXPERIMENTAL_CXX_IMPORT_STD",
"CMake's support for `import std;` in C++23 and newer is experimental. It "
"is meant only for experimentation and feedback to CMake developers.",
{},
cmExperimental::TryCompileCondition::Always },
// ImportPackageInfo
{ "ImportPackageInfo",
"e82e467b-f997-4464-8ace-b00808fff261",
"CMAKE_EXPERIMENTAL_FIND_CPS_PACKAGES",
"CMake's support for importing package information in the Common Package "
"Specification format (via find_package) is experimental. It is meant "
"only for experimentation and feedback to CMake developers.",
{},
cmExperimental::TryCompileCondition::Always },
// ExportPackageInfo
{ "ExportPackageInfo",
"b80be207-778e-46ba-8080-b23bba22639e",
"CMAKE_EXPERIMENTAL_EXPORT_PACKAGE_INFO",
"CMake's support for exporting package information in the Common Package "
"Specification format is experimental. It is meant only for "
"experimentation and feedback to CMake developers.",
{},
cmExperimental::TryCompileCondition::Always },
// ExportBuildDatabase
{ "ExportBuildDatabase",
"73194a1d-c0b5-41b9-9190-a4512925e192",
"CMAKE_EXPERIMENTAL_EXPORT_BUILD_DATABASE",
"CMake's support for exporting build databases is experimental. It is "
"meant only for experimentation and feedback to CMake developers.",
{},
cmExperimental::TryCompileCondition::Never },
// Instrumentation
{ "Instrumentation",
"a37d1069-1972-4901-b9c9-f194aaf2b6e0",
"CMAKE_EXPERIMENTAL_INSTRUMENTATION",
"CMake's support for collecting instrumentation data is experimental. It "
"is meant only for experimentation and feedback to CMake developers.",
{},
cmExperimental::TryCompileCondition::Never },
};
static_assert(sizeof(LookupTable) / sizeof(LookupTable[0]) ==
static_cast<size_t>(cmExperimental::Feature::Sentinel),
"Experimental feature lookup table mismatch");
cmExperimental::FeatureData const& DataForFeature(cmExperimental::Feature f)
{
assert(f != cmExperimental::Feature::Sentinel);
return LookupTable[static_cast<size_t>(f)];
}
}
cmExperimental::FeatureData const& cmExperimental::DataForFeature(Feature f)
{
return ::DataForFeature(f);
}
cm::optional<cmExperimental::Feature> cmExperimental::FeatureByName(
std::string const& name)
{
size_t idx = 0;
for (auto const& feature : LookupTable) {
if (feature.Name == name) {
return static_cast<Feature>(idx);
}
++idx;
}
return {};
}
bool cmExperimental::HasSupportEnabled(cmMakefile const& mf, Feature f)
{
bool enabled = false;
FeatureData const& data = cmExperimental::DataForFeature(f);
if (cmValue value = mf.GetDefinition(data.Variable)) {
enabled = *value == data.Uuid;
if (mf.GetGlobalGenerator()->ShouldWarnExperimental(data.Name, *value)) {
if (enabled) {
mf.IssueMessage(MessageType::AUTHOR_WARNING, data.Description);
} else {
mf.IssueMessage(
MessageType::AUTHOR_WARNING,
cmStrCat(
data.Variable, " is set to incorrect value\n ", value,
"\n"
"See 'Help/dev/experimental.rst' in the source tree of this "
"version of CMake for documentation of the experimental feature "
"and the corresponding activation value. This project's code "
"may require changes to work with this CMake's version of the "
"feature."));
}
}
}
return enabled;
}
|