1
0
mirror of https://github.com/Kitware/CMake.git synced 2025-06-12 08:42:47 +08:00
CMake/Source/cmDefinitions.cxx
Brad King df6b077625 cmake: Remove broken '--warn-unused-vars' option
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).
2020-06-29 17:23:27 -04:00

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();
}