mirror of
https://github.com/Kitware/CMake.git
synced 2025-06-12 08:42:47 +08:00

This option has been broken since commit b9f9915516 (cmMakefile: Remove VarUsageStack., 2015-05-17, v3.3.0-rc1~52^2). That commit removed the check that an initialized variable has actually been used and caused the option to warn on every variable ever set. This was not caught by the test suite because the test for the feature only checked that warnings appear when needed and not that they do not appear when not needed. The option was never very practical to use. Remove it to avoid the runtime cost of usage tracking and checks for every variable (which we were doing even when the option was not used).
110 lines
3.0 KiB
C++
110 lines
3.0 KiB
C++
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
|
file Copyright.txt or https://cmake.org/licensing for details. */
|
|
#include "cmDefinitions.h"
|
|
|
|
#include <cassert>
|
|
#include <functional>
|
|
#include <unordered_set>
|
|
#include <utility>
|
|
|
|
#include <cm/string_view>
|
|
|
|
cmDefinitions::Def cmDefinitions::NoDef;
|
|
|
|
cmDefinitions::Def const& cmDefinitions::GetInternal(const std::string& key,
|
|
StackIter begin,
|
|
StackIter end, bool raise)
|
|
{
|
|
assert(begin != end);
|
|
{
|
|
auto it = begin->Map.find(cm::String::borrow(key));
|
|
if (it != begin->Map.end()) {
|
|
return it->second;
|
|
}
|
|
}
|
|
StackIter it = begin;
|
|
++it;
|
|
if (it == end) {
|
|
return cmDefinitions::NoDef;
|
|
}
|
|
Def const& def = cmDefinitions::GetInternal(key, it, end, raise);
|
|
if (!raise) {
|
|
return def;
|
|
}
|
|
return begin->Map.emplace(key, def).first->second;
|
|
}
|
|
|
|
const std::string* cmDefinitions::Get(const std::string& key, StackIter begin,
|
|
StackIter end)
|
|
{
|
|
Def const& def = cmDefinitions::GetInternal(key, begin, end, false);
|
|
return def.Value ? def.Value.str_if_stable() : nullptr;
|
|
}
|
|
|
|
void cmDefinitions::Raise(const std::string& key, StackIter begin,
|
|
StackIter end)
|
|
{
|
|
cmDefinitions::GetInternal(key, begin, end, true);
|
|
}
|
|
|
|
bool cmDefinitions::HasKey(const std::string& key, StackIter begin,
|
|
StackIter end)
|
|
{
|
|
for (StackIter it = begin; it != end; ++it) {
|
|
if (it->Map.find(cm::String::borrow(key)) != it->Map.end()) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
cmDefinitions cmDefinitions::MakeClosure(StackIter begin, StackIter end)
|
|
{
|
|
cmDefinitions closure;
|
|
std::unordered_set<cm::string_view> undefined;
|
|
for (StackIter it = begin; it != end; ++it) {
|
|
// Consider local definitions.
|
|
for (auto const& mi : it->Map) {
|
|
// Use this key if it is not already set or unset.
|
|
if (closure.Map.find(mi.first) == closure.Map.end() &&
|
|
undefined.find(mi.first.view()) == undefined.end()) {
|
|
if (mi.second.Value) {
|
|
closure.Map.insert(mi);
|
|
} else {
|
|
undefined.emplace(mi.first.view());
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return closure;
|
|
}
|
|
|
|
std::vector<std::string> cmDefinitions::ClosureKeys(StackIter begin,
|
|
StackIter end)
|
|
{
|
|
std::vector<std::string> defined;
|
|
std::unordered_set<cm::string_view> bound;
|
|
|
|
for (StackIter it = begin; it != end; ++it) {
|
|
defined.reserve(defined.size() + it->Map.size());
|
|
for (auto const& mi : it->Map) {
|
|
// Use this key if it is not already set or unset.
|
|
if (bound.emplace(mi.first.view()).second && mi.second.Value) {
|
|
defined.push_back(*mi.first.str_if_stable());
|
|
}
|
|
}
|
|
}
|
|
|
|
return defined;
|
|
}
|
|
|
|
void cmDefinitions::Set(const std::string& key, cm::string_view value)
|
|
{
|
|
this->Map[key] = Def(value);
|
|
}
|
|
|
|
void cmDefinitions::Unset(const std::string& key)
|
|
{
|
|
this->Map[key] = Def();
|
|
}
|