CLI: Suppress the unused warning if the key value pair is cached.

It is common to specify a CMAKE_TOOLCHAIN_FILE and get a warning
for using it despite it not being used.

The WarnUnusedCliUnused test relies on the warning being emitted
each time cmake is run on an existing build. That behavior is changed
by this patch to warn only on the first invokation of CMake, and not
on subsequent invokations (because the variable is in the cache with
the same value). For that test, a clean target is added which clears
the cache and cause the warning to be emitted each time.

As the Ninja generator does not support the feature needed to test
this, it is not tested with that generator.
This commit is contained in:
Stephen Kelly 2013-05-16 21:51:45 +02:00
parent 590a41ba0e
commit 273ecab96d
5 changed files with 49 additions and 12 deletions

View File

@ -750,6 +750,10 @@ void cmCacheManager::AddCacheEntry(const char* key,
} }
e.SetProperty("HELPSTRING", helpString? helpString : e.SetProperty("HELPSTRING", helpString? helpString :
"(This variable does not exist and should not be used)"); "(This variable does not exist and should not be used)");
if (this->Cache[key].Value == e.Value)
{
this->CMakeInstance->UnwatchUnusedCli(key);
}
this->Cache[key] = e; this->Cache[key] = e;
} }

View File

@ -383,13 +383,24 @@ bool cmake::SetCacheArgs(const std::vector<std::string>& args)
cmCacheManager::CacheEntryType type = cmCacheManager::UNINITIALIZED; cmCacheManager::CacheEntryType type = cmCacheManager::UNINITIALIZED;
if(cmCacheManager::ParseEntry(entry.c_str(), var, value, type)) if(cmCacheManager::ParseEntry(entry.c_str(), var, value, type))
{ {
// The value is transformed if it is a filepath for example, so
// we can't compare whether the value is already in the cache until
// after we call AddCacheEntry.
const char *cachedValue =
this->CacheManager->GetCacheValue(var.c_str());
this->CacheManager->AddCacheEntry(var.c_str(), value.c_str(), this->CacheManager->AddCacheEntry(var.c_str(), value.c_str(),
"No help, variable specified on the command line.", type); "No help, variable specified on the command line.", type);
if(this->WarnUnusedCli) if(this->WarnUnusedCli)
{ {
if (!cachedValue
|| strcmp(this->CacheManager->GetCacheValue(var.c_str()),
cachedValue) != 0)
{
this->WatchUnusedCli(var.c_str()); this->WatchUnusedCli(var.c_str());
} }
} }
}
else else
{ {
std::cerr << "Parse error in command line argument: " << arg << "\n" std::cerr << "Parse error in command line argument: " << arg << "\n"

View File

@ -1618,17 +1618,23 @@ ${CMake_BINARY_DIR}/bin/cmake -DVERSION=master -P ${CMake_SOURCE_DIR}/Utilities/
FAIL_REGULAR_EXPRESSION "CMake Warning .*VariableUnusedViaUnset.CMakeLists.txt:5 \\(set\\):") FAIL_REGULAR_EXPRESSION "CMake Warning .*VariableUnusedViaUnset.CMakeLists.txt:5 \\(set\\):")
list(APPEND TEST_BUILD_DIRS "${CMake_BINARY_DIR}/Tests/WarnUnusedUnusedViaUnset") list(APPEND TEST_BUILD_DIRS "${CMake_BINARY_DIR}/Tests/WarnUnusedUnusedViaUnset")
if("${CMAKE_TEST_GENERATOR}" MATCHES "Makefile")
# Ninja does not support ADDITIONAL_MAKE_CLEAN_FILES and therefore fails
# this test. (See #13371)
# Apparently Visual Studio does not support it either. As the MakeClean
# test above is only run with the Makefiles generator, only run this
# test with the Makefiles generator also.
add_test(WarnUnusedCliUnused ${CMAKE_CTEST_COMMAND} add_test(WarnUnusedCliUnused ${CMAKE_CTEST_COMMAND}
--build-and-test --build-and-test
"${CMake_SOURCE_DIR}/Tests/VariableUsage" "${CMake_SOURCE_DIR}/Tests/WarnUnusedCliUnused"
"${CMake_BINARY_DIR}/Tests/WarnUnusedCliUnused" "${CMake_BINARY_DIR}/Tests/WarnUnusedCliUnused"
${build_generator_args} ${build_generator_args}
--build-noclean
--build-project WarnUnusedCliUnused --build-project WarnUnusedCliUnused
--build-options "-DUNUSED_CLI_VARIABLE=Unused") --build-options "-DUNUSED_CLI_VARIABLE=Unused")
set_tests_properties(WarnUnusedCliUnused PROPERTIES set_tests_properties(WarnUnusedCliUnused PROPERTIES
PASS_REGULAR_EXPRESSION "CMake Warning:.*Manually-specified variables were not used by the project:.* UNUSED_CLI_VARIABLE") PASS_REGULAR_EXPRESSION "CMake Warning:.*Manually-specified variables were not used by the project:.* UNUSED_CLI_VARIABLE")
list(APPEND TEST_BUILD_DIRS "${CMake_BINARY_DIR}/Tests/WarnUnusedCliUnused") list(APPEND TEST_BUILD_DIRS "${CMake_BINARY_DIR}/Tests/WarnUnusedCliUnused")
endif()
add_test(WarnUnusedCliUsed ${CMAKE_CTEST_COMMAND} add_test(WarnUnusedCliUsed ${CMAKE_CTEST_COMMAND}
--build-and-test --build-and-test

View File

@ -0,0 +1,9 @@
cmake_minimum_required(VERSION 2.8)
project(WarnUnusedCliUnused)
set_directory_properties(PROPERTIES
ADDITIONAL_MAKE_CLEAN_FILES "${CMAKE_BINARY_DIR}/CMakeCache.txt"
)
add_library(dummy empty.cpp)

View File

@ -0,0 +1,7 @@
#ifdef _WIN32
__declspec(dllexport)
#endif
int empty(void)
{
return 0;
}