diff --git a/Source/CTest/cmCTestConfigureCommand.cxx b/Source/CTest/cmCTestConfigureCommand.cxx index bb9b277d08..c137d48c94 100644 --- a/Source/CTest/cmCTestConfigureCommand.cxx +++ b/Source/CTest/cmCTestConfigureCommand.cxx @@ -24,6 +24,7 @@ #include "cmJSONState.h" #include "cmList.h" #include "cmMakefile.h" +#include "cmOutputConverter.h" #include "cmStringAlgorithms.h" #include "cmSystemTools.h" #include "cmValue.h" @@ -127,17 +128,29 @@ bool ConstructConfigureCommand(cmExecutionStatus& status, cmMakefile& mf, // Propagate CTEST_SITE / CTEST_BUILD_NAME into the SITE / BUILDNAME // cache variables so DartConfiguration.tcl gets generated with - // correct values. + // correct values. We use an initial cache script (-C) instead of + // defining them on the command-line (-D) to avoid unused-cli warnings + // for projects that don't include the CTest module. cmValue site = mf.GetDefinition("CTEST_SITE"); - if (cmNonempty(site)) { - configureCommand += " \"-DSITE:STRING="; - configureCommand += *site; - configureCommand += "\""; - } cmValue buildName = mf.GetDefinition("CTEST_BUILD_NAME"); - if (cmNonempty(buildName)) { - configureCommand += " \"-DBUILDNAME:STRING="; - configureCommand += *buildName; + if (cmNonempty(site) || cmNonempty(buildName)) { + std::string const initialCacheFile = + cmStrCat(cmSystemTools::CollapseFullPath(buildDirectory), + "/Testing/Temporary/CTestConfigureInitialCache.cmake"); + cmGeneratedFileStream initialCache(initialCacheFile); + if (cmNonempty(site)) { + initialCache << "set(SITE " << cmOutputConverter::EscapeForCMake(*site) + << " CACHE STRING \"\")\n"; + } + if (cmNonempty(buildName)) { + initialCache << "set(BUILDNAME " + << cmOutputConverter::EscapeForCMake(*buildName) + << " CACHE STRING \"\")\n"; + } + initialCache.Close(); + + configureCommand += " \"-C"; + configureCommand += initialCacheFile; configureCommand += "\""; } diff --git a/Tests/RunCMake/CTestCommandLine/RunCMakeTest.cmake b/Tests/RunCMake/CTestCommandLine/RunCMakeTest.cmake index 1203bbb8b4..36d4fe4741 100644 --- a/Tests/RunCMake/CTestCommandLine/RunCMakeTest.cmake +++ b/Tests/RunCMake/CTestCommandLine/RunCMakeTest.cmake @@ -694,6 +694,33 @@ function(run_configure_empty_bindir) endfunction() run_configure_empty_bindir() +# Verify that ctest_configure() does not trigger a spurious unused-cli +# warning about BUILDNAME/SITE when CTEST_SITE/CTEST_BUILD_NAME are set +# but the project does not include(CTest). See issue #27953. +function(run_configure_site_buildname_no_unused_cli) + set(src "${RunCMake_BINARY_DIR}/configure-site-buildname-no-unused-cli-src") + set(bin "${RunCMake_BINARY_DIR}/configure-site-buildname-no-unused-cli-bin") + file(REMOVE_RECURSE "${src}" "${bin}") + file(MAKE_DIRECTORY "${src}") + file(WRITE "${src}/CMakeLists.txt" + "cmake_minimum_required(VERSION 3.10)\nproject(Minimal LANGUAGES NONE)\n") + set(RunCMake_TEST_BINARY_DIR "${bin}") + set(RunCMake_TEST_NO_CLEAN 1) + ctest_source_dir_generator_args(generator_args) + set(RunCMake_TEST_NOT_EXPECT_stdout "CMake Warning \\(unused-cli\\)") + run_cmake_command(configure-site-buildname-no-unused-cli + ${CMAKE_CTEST_COMMAND} + --source-dir "${src}" + --build-dir "${bin}" + ${generator_args} + -D "CTEST_SITE=Test Site" + -D "CTEST_BUILD_NAME=Test Build" + -T Configure + -V) + unset(RunCMake_TEST_NOT_EXPECT_stdout) +endfunction() +run_configure_site_buildname_no_unused_cli() + # Verify expected error condition when --source-dir does not contain # a CMakeLists.txt file. function(run_configure_no_cmakelists) diff --git a/Tests/RunCMake/CTestCommandLine/configure-site-buildname-no-unused-cli-stderr.txt b/Tests/RunCMake/CTestCommandLine/configure-site-buildname-no-unused-cli-stderr.txt new file mode 100644 index 0000000000..302556fa41 --- /dev/null +++ b/Tests/RunCMake/CTestCommandLine/configure-site-buildname-no-unused-cli-stderr.txt @@ -0,0 +1,2 @@ +^Cannot find file: [^ +]*/DartConfiguration\.tcl$