From 273ecab96d47d6ddba129be6200bc93ba7910b8c Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Thu, 16 May 2013 21:51:45 +0200 Subject: [PATCH] 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. --- Source/cmCacheManager.cxx | 4 ++++ Source/cmake.cxx | 13 ++++++++++- Tests/CMakeLists.txt | 28 ++++++++++++++---------- Tests/WarnUnusedCliUnused/CMakeLists.txt | 9 ++++++++ Tests/WarnUnusedCliUnused/empty.cpp | 7 ++++++ 5 files changed, 49 insertions(+), 12 deletions(-) create mode 100644 Tests/WarnUnusedCliUnused/CMakeLists.txt create mode 100644 Tests/WarnUnusedCliUnused/empty.cpp diff --git a/Source/cmCacheManager.cxx b/Source/cmCacheManager.cxx index 864df8e05..ed09545cb 100644 --- a/Source/cmCacheManager.cxx +++ b/Source/cmCacheManager.cxx @@ -750,6 +750,10 @@ void cmCacheManager::AddCacheEntry(const char* key, } e.SetProperty("HELPSTRING", helpString? helpString : "(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; } diff --git a/Source/cmake.cxx b/Source/cmake.cxx index ae62edb9f..e757f3a6e 100644 --- a/Source/cmake.cxx +++ b/Source/cmake.cxx @@ -383,11 +383,22 @@ bool cmake::SetCacheArgs(const std::vector& args) cmCacheManager::CacheEntryType type = cmCacheManager::UNINITIALIZED; 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(), "No help, variable specified on the command line.", type); if(this->WarnUnusedCli) { - this->WatchUnusedCli(var.c_str()); + if (!cachedValue + || strcmp(this->CacheManager->GetCacheValue(var.c_str()), + cachedValue) != 0) + { + this->WatchUnusedCli(var.c_str()); + } } } else diff --git a/Tests/CMakeLists.txt b/Tests/CMakeLists.txt index 0b221e885..a91eac7cc 100644 --- a/Tests/CMakeLists.txt +++ b/Tests/CMakeLists.txt @@ -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\\):") list(APPEND TEST_BUILD_DIRS "${CMake_BINARY_DIR}/Tests/WarnUnusedUnusedViaUnset") - add_test(WarnUnusedCliUnused ${CMAKE_CTEST_COMMAND} - --build-and-test - "${CMake_SOURCE_DIR}/Tests/VariableUsage" - "${CMake_BINARY_DIR}/Tests/WarnUnusedCliUnused" - ${build_generator_args} - --build-noclean - --build-project WarnUnusedCliUnused - --build-options "-DUNUSED_CLI_VARIABLE=Unused") - set_tests_properties(WarnUnusedCliUnused PROPERTIES - 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") + 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} + --build-and-test + "${CMake_SOURCE_DIR}/Tests/WarnUnusedCliUnused" + "${CMake_BINARY_DIR}/Tests/WarnUnusedCliUnused" + ${build_generator_args} + --build-project WarnUnusedCliUnused + --build-options "-DUNUSED_CLI_VARIABLE=Unused") + set_tests_properties(WarnUnusedCliUnused PROPERTIES + 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") + endif() add_test(WarnUnusedCliUsed ${CMAKE_CTEST_COMMAND} --build-and-test diff --git a/Tests/WarnUnusedCliUnused/CMakeLists.txt b/Tests/WarnUnusedCliUnused/CMakeLists.txt new file mode 100644 index 000000000..7ed69bf3c --- /dev/null +++ b/Tests/WarnUnusedCliUnused/CMakeLists.txt @@ -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) diff --git a/Tests/WarnUnusedCliUnused/empty.cpp b/Tests/WarnUnusedCliUnused/empty.cpp new file mode 100644 index 000000000..7279c5e0b --- /dev/null +++ b/Tests/WarnUnusedCliUnused/empty.cpp @@ -0,0 +1,7 @@ +#ifdef _WIN32 +__declspec(dllexport) +#endif +int empty(void) +{ + return 0; +}