1
0
mirror of https://github.com/Kitware/CMake.git synced 2025-10-17 15:32:10 +08:00

Add SKIP_LINTING target property and CMAKE_SKIP_LINTING variable

These offer target-wide settings to disable lints.

Closes: #27191
This commit is contained in:
Alex Turbov
2025-09-03 21:10:36 +04:00
committed by Brad King
parent 0d6b5d54b2
commit f100769d72
17 changed files with 143 additions and 31 deletions

View File

@@ -401,6 +401,7 @@ Properties on Targets
/prop_tgt/RUNTIME_OUTPUT_NAME
/prop_tgt/RUNTIME_OUTPUT_NAME_CONFIG
/prop_tgt/SKIP_BUILD_RPATH
/prop_tgt/SKIP_LINTING
/prop_tgt/SOURCE_DIR
/prop_tgt/SOURCES
/prop_tgt/SOVERSION

View File

@@ -573,6 +573,7 @@ Variables that Control the Build
/variable/CMAKE_SHARED_LINKER_FLAGS_INIT
/variable/CMAKE_SKIP_BUILD_RPATH
/variable/CMAKE_SKIP_INSTALL_RPATH
/variable/CMAKE_SKIP_LINTING
/variable/CMAKE_STATIC_LINKER_FLAGS
/variable/CMAKE_STATIC_LINKER_FLAGS_CONFIG
/variable/CMAKE_STATIC_LINKER_FLAGS_CONFIG_INIT

View File

@@ -41,3 +41,8 @@ By using the ``SKIP_LINTING`` property, you can selectively exclude specific
source files from the linting process. This allows you to focus the
linting tools on the relevant parts of your project, enhancing the efficiency
and effectiveness of the linting workflow.
See Also
^^^^^^^^
* :prop_tgt:`SKIP_LINTING` target property

View File

@@ -0,0 +1,25 @@
SKIP_LINTING
------------
.. versionadded:: 4.2
Exclude all sources of a target from running configured linting tools.
When this boolean property is enabled on a target, C/C++ linting tools enabled
for that target (e.g. :prop_tgt:`<LANG>_CPPLINT`, :prop_tgt:`<LANG>_CLANG_TIDY`,
:prop_tgt:`<LANG>_CPPCHECK`, :prop_tgt:`<LANG>_ICSTAT` and
:prop_tgt:`<LANG>_INCLUDE_WHAT_YOU_USE`) will not be invoked for source files
compiled by the target. If the :prop_sf:`SKIP_LINTING` source-file property
is set on a specific source, it takes precedence over this target-wide property.
This is a convenience alternative to setting the :prop_sf:`SKIP_LINTING`
source file property individually on each source. If either the target's
:prop_tgt:`SKIP_LINTING` or a sources :prop_sf:`SKIP_LINTING` is enabled,
that source will be excluded from linting.
The property has no effect on targets that do not have sources.
See Also
^^^^^^^^
* :prop_sf:`SKIP_LINTING` source file property

View File

@@ -0,0 +1,7 @@
target-SKIP_LINTING
-------------------
* The :variable:`CMAKE_SKIP_LINTING` variable and corresponding
:prop_tgt:`SKIP_LINTING` target property were added to tell the
:ref:`Command-Line Build Tool Generators` to skip linting all
sources in a target.

View File

@@ -0,0 +1,9 @@
CMAKE_SKIP_LINTING
------------------
.. versionadded:: 4.2
Default value for the :prop_tgt:`SKIP_LINTING` target property.
This is used to initialize the :prop_tgt:`SKIP_LINTING` target property
for all targets created *afterward*.

View File

@@ -1008,14 +1008,18 @@ void cmFastbuildNormalTargetGenerator::CollapseAllExecsIntoOneScriptfile(
std::string cmFastbuildNormalTargetGenerator::ComputeCodeCheckOptions(
cmSourceFile const& srcFile)
{
cmValue const skipCodeCheck = srcFile.GetProperty("SKIP_LINTING");
std::string staticCheckRule;
if (!skipCodeCheck.IsOn()) {
std::string compilerLauncher;
staticCheckRule = this->GenerateCodeCheckRules(srcFile, compilerLauncher,
"", Config, nullptr);
LogMessage(cmStrCat("CodeCheck: ", staticCheckRule));
cmValue const srcSkipCodeCheckVal = srcFile.GetProperty("SKIP_LINTING");
bool const skipCodeCheck = srcSkipCodeCheckVal.IsSet()
? srcSkipCodeCheckVal.IsOn()
: this->GetGeneratorTarget()->GetPropertyAsBool("SKIP_LINTING");
if (skipCodeCheck) {
return {};
}
std::string compilerLauncher;
std::string staticCheckRule = this->GenerateCodeCheckRules(
srcFile, compilerLauncher, "", Config, nullptr);
LogMessage(cmStrCat("CodeCheck: ", staticCheckRule));
return staticCheckRule;
}

View File

@@ -1091,8 +1091,12 @@ void cmMakefileTargetGenerator::WriteObjectRuleFiles(
compilerLauncher = GetCompilerLauncher(lang, config);
}
cmValue const skipCodeCheck = source.GetProperty("SKIP_LINTING");
if (!skipCodeCheck.IsOn()) {
cmValue const srcSkipCodeCheckVal = source.GetProperty("SKIP_LINTING");
bool const skipCodeCheck = srcSkipCodeCheckVal.IsSet()
? srcSkipCodeCheckVal.IsOn()
: this->GetGeneratorTarget()->GetPropertyAsBool("SKIP_LINTING");
if (!skipCodeCheck) {
std::string const codeCheck = this->GenerateCodeCheckRules(
source, compilerLauncher, "$(CMAKE_COMMAND)", config, nullptr);
if (!codeCheck.empty()) {

View File

@@ -1423,8 +1423,12 @@ void cmNinjaTargetGenerator::WriteObjectBuildStatement(
auto compilerLauncher = this->GetCompilerLauncher(language, config);
cmValue const skipCodeCheck = source->GetProperty("SKIP_LINTING");
if (!skipCodeCheck.IsOn()) {
cmValue const srcSkipCodeCheckVal = source->GetProperty("SKIP_LINTING");
bool const skipCodeCheck = srcSkipCodeCheckVal.IsSet()
? srcSkipCodeCheckVal.IsOn()
: this->GetGeneratorTarget()->GetPropertyAsBool("SKIP_LINTING");
if (!skipCodeCheck) {
auto const cmakeCmd = this->GetLocalGenerator()->ConvertToOutputFormat(
cmSystemTools::GetCMakeCommand(), cmLocalGenerator::SHELL);
vars["CODE_CHECK"] =

View File

@@ -464,6 +464,7 @@ TargetProperty const StaticTargetProperties[] = {
{ "Fortran_LINKER_LAUNCHER"_s, IC::CanCompileSources },
// Static analysis
{ "SKIP_LINTING"_s, IC::CanCompileSources },
// -- C
{ "C_CLANG_TIDY"_s, IC::CanCompileSources },
{ "C_CLANG_TIDY_EXPORT_FIXES_DIR"_s, IC::CanCompileSources },
@@ -1804,6 +1805,7 @@ void cmTarget::CopyImportedCxxModulesProperties(cmTarget const* tgt)
"CXX_CPPCHECK",
"CXX_ICSTAT",
"CXX_INCLUDE_WHAT_YOU_USE",
"SKIP_LINTING",
// Build graph properties
"EXCLUDE_FROM_ALL",

View File

@@ -1,3 +1,3 @@
enable_language(CXX)
include(${CMAKE_CURRENT_LIST_DIR}/setup_skip_linter_test.cmake)
setup_skip_linter_test(CXX OFF)
setup_skip_linter_test(CXX)

View File

@@ -1,3 +1,3 @@
enable_language(CXX)
include(${CMAKE_CURRENT_LIST_DIR}/setup_skip_linter_test.cmake)
setup_skip_linter_test(CXX ON)
setup_skip_linter_test(CXX)

View File

@@ -1,3 +1,3 @@
enable_language(C)
include(${CMAKE_CURRENT_LIST_DIR}/setup_skip_linter_test.cmake)
setup_skip_linter_test(C OFF)
setup_skip_linter_test(C)

View File

@@ -1,3 +1,3 @@
enable_language(C)
include(${CMAKE_CURRENT_LIST_DIR}/setup_skip_linter_test.cmake)
setup_skip_linter_test(C ON)
setup_skip_linter_test(C)

View File

@@ -27,22 +27,64 @@ if(NOT RunCMake_GENERATOR STREQUAL "Watcom WMake")
run_multilint(genex)
endif()
function(run_skip_linting test_name)
set(RunCMake_TEST_BINARY_DIR "${RunCMake_BINARY_DIR}/${test_name}-build")
set(RunCMake_TEST_NO_CLEAN 1)
function(run_skip_linting test_name prop_sf prop_tgt)
set(RunCMake_TEST_VARIANT_DESCRIPTION " (prop_sf=${prop_sf}, prop_tgt=${prop_tgt})")
list(APPEND RunCMake_TEST_OPTIONS "-Dprop_sf=${prop_sf}" "-Dprop_tgt=${prop_tgt}")
run_cmake(${test_name})
set(RunCMake_TEST_OUTPUT_MERGE 1)
run_cmake_command(${test_name}-Build ${CMAKE_COMMAND} --build .)
set(RunCMake_TEST_BINARY_DIR "${RunCMake_BINARY_DIR}/${test_name}-build")
set(RunCMake_TEST_NO_CLEAN 1)
run_cmake(${test_name})
set(RunCMake_TEST_OUTPUT_MERGE 1)
run_cmake_command(${test_name}-Build ${CMAKE_COMMAND} --build .)
endfunction()
foreach(lang IN ITEMS C CXX)
# Testing `SKIP_LINTING=ON`
run_skip_linting(${lang}_skip_linting_ON)
if(NOT RunCMake_GENERATOR STREQUAL "Watcom WMake")
run_skip_linting(${lang}-launch_skip_linting_ON)
endif()
# There are a few `SKIP_LINTING` source/target propertiy combinations
# that affect the final result:
#
# prop_sf prop_tgt result
# ---------------------------
# - - OFF
# OFF - OFF
# ON - ON
# - OFF OFF
# OFF OFF OFF
# ON OFF ON
# - ON ON
# OFF ON OFF
# ON ON ON
#
# where `-` means unset property.
#
# Here's the same table for convenience sorted by `result`:
#
# prop_sf prop_tgt result
# ---------------------------
# - - OFF
# OFF - OFF
# - OFF OFF
# OFF OFF OFF
# OFF ON OFF
# ON - ON
# ON OFF ON
# - ON ON
# ON ON ON
# Testing `SKIP_LINTING=OFF`
run_skip_linting(${lang}_skip_linting_OFF)
foreach(lang IN ITEMS C CXX)
# Testing `SKIP_LINTING=OFF` (first half of the table above)
set(prop_sf_OFF_variants "-" OFF "-" OFF OFF)
set(prop_tgt_OFF_variants "-" "-" OFF OFF ON)
foreach(prop_fs prop_tgt IN ZIP_LISTS prop_sf_OFF_variants prop_tgt_OFF_variants)
run_skip_linting(${lang}_skip_linting_OFF "${prop_fs}" "${prop_tgt}")
endforeach()
# Testing `SKIP_LINTING=ON` (second half of the table above)
set(prop_sf_ON_variants ON ON "-" ON)
set(prop_tgt_ON_variants "-" OFF ON ON)
foreach(prop_fs prop_tgt IN ZIP_LISTS prop_sf_ON_variants prop_tgt_ON_variants)
run_skip_linting(${lang}_skip_linting_ON "${prop_fs}" "${prop_tgt}")
if(NOT RunCMake_GENERATOR STREQUAL "Watcom WMake")
run_skip_linting(${lang}-launch_skip_linting_ON "${prop_fs}" "${prop_tgt}")
endif()
endforeach()
endforeach()

View File

@@ -1,6 +1,6 @@
include_guard()
function(setup_skip_linter_test lang state)
function(setup_skip_linter_test lang)
if(lang STREQUAL "CXX")
set(maybe_genex_pre "$<1:")
set(maybe_genex_post ">")
@@ -13,5 +13,12 @@ function(setup_skip_linter_test lang state)
string(TOLOWER "${lang}" ext)
add_executable(main main.${ext})
set_source_files_properties(main.${ext} PROPERTIES SKIP_LINTING ${state})
if(NOT prop_sf STREQUAL "-")
set_source_files_properties(main.${ext} PROPERTIES SKIP_LINTING ${prop_sf})
endif()
if(NOT prop_tgt STREQUAL "-")
set_target_properties(main PROPERTIES SKIP_LINTING ${prop_tgt})
endif()
endfunction()

View File

@@ -113,6 +113,7 @@ set(properties
"OBJCXX_LINKER_LAUNCHER" "ccache" "<SAME>"
# Static analysis
"SKIP_LINTING" "OFF" "<SAME>"
## C
"C_CLANG_TIDY" "clang-tidy" "<SAME>"
"C_CLANG_TIDY_EXPORT_FIXES_DIR" "${dir}" "<SAME>"