diff options
author | Brad King <brad.king@kitware.com> | 2023-05-30 21:23:42 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2023-05-30 21:44:43 (GMT) |
commit | da27ff1e963b11dd91060fddb9e47a3135b4ac6c (patch) | |
tree | e82cf3edfcf507fbd0cb2a97a3bfdce6b7b0a60a | |
parent | e0b48284a1beaef7f5a49073c8d4684418476ae1 (diff) | |
download | CMake-da27ff1e963b11dd91060fddb9e47a3135b4ac6c.zip CMake-da27ff1e963b11dd91060fddb9e47a3135b4ac6c.tar.gz CMake-da27ff1e963b11dd91060fddb9e47a3135b4ac6c.tar.bz2 |
Preserve --compile-no-warning-as-error in automatic CMake re-runs
When the build system re-runs `cmake` to regenerate itself, preserve the
`--compile-no-warning-as-error` option if it was used when `cmake` was
last explicitly invoked. Normally such settings are preserved in the
cache, but the purpose of this option is to be beyond the reach of
project code.
-rw-r--r-- | Source/cmGlobalGenerator.cxx | 6 | ||||
-rw-r--r-- | Source/cmGlobalNinjaGenerator.cxx | 19 | ||||
-rw-r--r-- | Source/cmGlobalVisualStudio8Generator.cxx | 3 | ||||
-rw-r--r-- | Source/cmGlobalXCodeGenerator.cxx | 14 | ||||
-rw-r--r-- | Source/cmLocalUnixMakefileGenerator3.cxx | 6 | ||||
-rw-r--r-- | Source/cmLocalVisualStudio7Generator.cxx | 4 | ||||
-rw-r--r-- | Tests/RunCMake/CompileWarningAsError/RunCMakeTest.cmake | 4 |
7 files changed, 38 insertions, 18 deletions
diff --git a/Source/cmGlobalGenerator.cxx b/Source/cmGlobalGenerator.cxx index 22d5aeb..815629b 100644 --- a/Source/cmGlobalGenerator.cxx +++ b/Source/cmGlobalGenerator.cxx @@ -2821,6 +2821,9 @@ void cmGlobalGenerator::AddGlobalTarget_EditCache( std::string edit_cmd = this->GetEditCacheCommand(); if (!edit_cmd.empty()) { singleLine.push_back(std::move(edit_cmd)); + if (this->GetCMakeInstance()->GetIgnoreWarningAsError()) { + singleLine.push_back("--compile-no-warning-as-error"); + } singleLine.push_back("-S$(CMAKE_SOURCE_DIR)"); singleLine.push_back("-B$(CMAKE_BINARY_DIR)"); gti.Message = "Running CMake cache editor..."; @@ -2854,6 +2857,9 @@ void cmGlobalGenerator::AddGlobalTarget_RebuildCache( cmCustomCommandLine singleLine; singleLine.push_back(cmSystemTools::GetCMakeCommand()); singleLine.push_back("--regenerate-during-build"); + if (this->GetCMakeInstance()->GetIgnoreWarningAsError()) { + singleLine.push_back("--compile-no-warning-as-error"); + } singleLine.push_back("-S$(CMAKE_SOURCE_DIR)"); singleLine.push_back("-B$(CMAKE_BINARY_DIR)"); gti.CommandLines.push_back(std::move(singleLine)); diff --git a/Source/cmGlobalNinjaGenerator.cxx b/Source/cmGlobalNinjaGenerator.cxx index 8698e77..9380d7d 100644 --- a/Source/cmGlobalNinjaGenerator.cxx +++ b/Source/cmGlobalNinjaGenerator.cxx @@ -1816,17 +1816,21 @@ void cmGlobalNinjaGenerator::WriteTargetRebuildManifest(std::ostream& os) if (this->GlobalSettingIsOn("CMAKE_SUPPRESS_REGENERATION")) { return; } + + cmake* cm = this->GetCMakeInstance(); const auto& lg = this->LocalGenerators[0]; { cmNinjaRule rule("RERUN_CMAKE"); - rule.Command = - cmStrCat(this->CMakeCmd(), " --regenerate-during-build -S", - lg->ConvertToOutputFormat(lg->GetSourceDirectory(), - cmOutputConverter::SHELL), - " -B", - lg->ConvertToOutputFormat(lg->GetBinaryDirectory(), - cmOutputConverter::SHELL)); + rule.Command = cmStrCat( + this->CMakeCmd(), " --regenerate-during-build", + cm->GetIgnoreWarningAsError() ? " --compile-no-warning-as-error" : "", + " -S", + lg->ConvertToOutputFormat(lg->GetSourceDirectory(), + cmOutputConverter::SHELL), + " -B", + lg->ConvertToOutputFormat(lg->GetBinaryDirectory(), + cmOutputConverter::SHELL)); rule.Description = "Re-running CMake..."; rule.Comment = "Rule for re-running cmake."; rule.Generator = true; @@ -1850,7 +1854,6 @@ void cmGlobalNinjaGenerator::WriteTargetRebuildManifest(std::ostream& os) reBuild.Variables["pool"] = "console"; } - cmake* cm = this->GetCMakeInstance(); if (this->SupportsManifestRestat() && cm->DoWriteGlobVerifyTarget()) { { cmNinjaRule rule("VERIFY_GLOBS"); diff --git a/Source/cmGlobalVisualStudio8Generator.cxx b/Source/cmGlobalVisualStudio8Generator.cxx index 819bb09..aefb67a 100644 --- a/Source/cmGlobalVisualStudio8Generator.cxx +++ b/Source/cmGlobalVisualStudio8Generator.cxx @@ -354,6 +354,9 @@ bool cmGlobalVisualStudio8Generator::AddCheckTarget() cmCustomCommandLines commandLines = cmMakeSingleCommandLine( { cmSystemTools::GetCMakeCommand(), argS, argB, "--check-stamp-list", stampList, "--vs-solution-file", sln }); + if (cm->GetIgnoreWarningAsError()) { + commandLines[0].emplace_back("--compile-no-warning-as-error"); + } // Add the rule. Note that we cannot use the CMakeLists.txt // file as the main dependency because it would get diff --git a/Source/cmGlobalXCodeGenerator.cxx b/Source/cmGlobalXCodeGenerator.cxx index a1a6028..fd58f75 100644 --- a/Source/cmGlobalXCodeGenerator.cxx +++ b/Source/cmGlobalXCodeGenerator.cxx @@ -753,14 +753,12 @@ void cmGlobalXCodeGenerator::CreateReRunCMakeFile( makefileStream << this->ConvertToRelativeForMake(checkCache) << ": $(TARGETS)\n"; - makefileStream << "\t" - << this->ConvertToRelativeForMake( - cmSystemTools::GetCMakeCommand()) - << " -S" - << this->ConvertToRelativeForMake(root->GetSourceDirectory()) - << " -B" - << this->ConvertToRelativeForMake(root->GetBinaryDirectory()) - << "\n"; + makefileStream + << "\t" << this->ConvertToRelativeForMake(cmSystemTools::GetCMakeCommand()) + << " -S" << this->ConvertToRelativeForMake(root->GetSourceDirectory()) + << " -B" << this->ConvertToRelativeForMake(root->GetBinaryDirectory()) + << (cm->GetIgnoreWarningAsError() ? " --compile-no-warning-as-error" : "") + << "\n"; } static bool objectIdLessThan(const std::unique_ptr<cmXCodeObject>& l, diff --git a/Source/cmLocalUnixMakefileGenerator3.cxx b/Source/cmLocalUnixMakefileGenerator3.cxx index cfe4eb6..43711b3 100644 --- a/Source/cmLocalUnixMakefileGenerator3.cxx +++ b/Source/cmLocalUnixMakefileGenerator3.cxx @@ -828,7 +828,8 @@ void cmLocalUnixMakefileGenerator3::WriteSpecialTargetsBottom( } std::string cmakefileName = "CMakeFiles/Makefile.cmake"; std::string runRule = cmStrCat( - "$(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) " + "$(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) ", + cm->GetIgnoreWarningAsError() ? "--compile-no-warning-as-error " : "", "--check-build-system ", this->ConvertToOutputFormat(cmakefileName, cmOutputConverter::SHELL), " 0"); @@ -1805,7 +1806,8 @@ void cmLocalUnixMakefileGenerator3::WriteLocalAllRules( std::string cmakefileName = "CMakeFiles/Makefile.cmake"; { std::string runRule = cmStrCat( - "$(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) " + "$(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) ", + cm->GetIgnoreWarningAsError() ? "--compile-no-warning-as-error " : "", "--check-build-system ", this->ConvertToOutputFormat(cmakefileName, cmOutputConverter::SHELL), " 1"); diff --git a/Source/cmLocalVisualStudio7Generator.cxx b/Source/cmLocalVisualStudio7Generator.cxx index a7ea0df..af0e118 100644 --- a/Source/cmLocalVisualStudio7Generator.cxx +++ b/Source/cmLocalVisualStudio7Generator.cxx @@ -262,6 +262,10 @@ cmSourceFile* cmLocalVisualStudio7Generator::CreateVCProjBuildRule() cmCustomCommandLines commandLines = cmMakeSingleCommandLine({ cmSystemTools::GetCMakeCommand(), argS, argB, "--check-stamp-file", stampName }); + + if (cm->GetIgnoreWarningAsError()) { + commandLines[0].emplace_back("--compile-no-warning-as-error"); + } std::string comment = cmStrCat("Building Custom Rule ", makefileIn); auto cc = cm::make_unique<cmCustomCommand>(); cc->SetOutputs(stampName); diff --git a/Tests/RunCMake/CompileWarningAsError/RunCMakeTest.cmake b/Tests/RunCMake/CompileWarningAsError/RunCMakeTest.cmake index 392c921..18df14c 100644 --- a/Tests/RunCMake/CompileWarningAsError/RunCMakeTest.cmake +++ b/Tests/RunCMake/CompileWarningAsError/RunCMakeTest.cmake @@ -5,6 +5,10 @@ function(run_compile_warn test lang extension) set(RunCMake_TEST_OUTPUT_MERGE 1) run_cmake_with_options(${test}_${lang} "-DLANGUAGE=${lang}" "-DEXTENSION=${extension}" ${ARGN}) set(RunCMake_TEST_NO_CLEAN 1) + if(ARGN MATCHES "--compile-no-warning-as-error") + # Cause the build system to re-run CMake to verify that this option is preserved. + run_cmake_command(${test}_${lang}-Touch ${CMAKE_COMMAND} -E touch_nocreate CMakeCache.txt) + endif() run_cmake_command(${test}_${lang}-Build ${CMAKE_COMMAND} --build . ${verbose_args}) endfunction() |