1
0
mirror of https://github.com/Kitware/CMake.git synced 2025-10-14 19:08:07 +08:00

TargetGenerator: Add SKIP_LINTING source property

The `SKIP_LINTING` source property was added to disable code check for
desired source files. The `SKIP_LINTING`includes `cpplint`, `clang-tidy`, \
`cppcheck` and `include-what-you-use`. If `SKIP_LINTING` is set on a
source file, the tools mentioned above will not be run on that source file.
This commit is contained in:
Orkun Tokdemir
2023-05-12 16:49:03 +02:00
committed by Brad King
parent 993dde925f
commit b480315e0c
20 changed files with 152 additions and 11 deletions

View File

@@ -329,6 +329,7 @@ syn keyword cmakeProperty contained
\ SKIP_REGULAR_EXPRESSION
\ SKIP_RETURN_CODE
\ SKIP_UNITY_BUILD_INCLUSION
\ SKIP_LINTING
\ SOURCES
\ SOURCE_DIR
\ SOVERSION

View File

@@ -559,6 +559,7 @@ Properties on Source Files
/prop_sf/SKIP_AUTOUIC
/prop_sf/SKIP_PRECOMPILE_HEADERS
/prop_sf/SKIP_UNITY_BUILD_INCLUSION
/prop_sf/SKIP_LINTING
/prop_sf/Swift_DEPENDENCIES_FILE
/prop_sf/Swift_DIAGNOSTICS_FILE
/prop_sf/SYMBOLIC

View File

@@ -0,0 +1,41 @@
SKIP_LINTING
------------
.. versionadded:: 3.27
This property allows you to exclude a specific source file
from the linting process. The linting process involves running
tools such as :prop_tgt:`<LANG>_CPPLINT`, :prop_tgt:`<LANG>_CLANG_TIDY`,
:prop_tgt:`<LANG>_CPPCHECK`, and :prop_tgt:`<LANG>_INCLUDE_WHAT_YOU_USE`
on the source files. By setting `SKIP_LINTING` on a source file,
the mentioned linting tools will not be executed for that
particular file.
EXAMPLE
^^^^^^^
Consider a `C++` project that includes multiple source files,
such as `main.cpp`, `things.cpp`, and `generatedBindings.cpp`.
In this example, you want to exclude the `generatedBindings.cpp`
file from the linting process. To achieve this, you can utilize
the `SKIP_LINTING` property with the `set_source_files_properties`
command as shown below:
.. code-block:: cmake
add_executable(MyApp main.cpp things.cpp generatedBindings.cpp)
set_source_files_properties(generatedBindings.cpp PROPERTIES
SKIP_LINTING ON
)
In the provided code snippet, the `SKIP_LINTING` property is set to `ON`
for the `generatedBindings.cpp` source file. As a result, when the linting
tools, such as :prop_tgt:`<LANG>_CPPLINT`, :prop_tgt:`<LANG>_CLANG_TIDY`,
:prop_tgt:`<LANG>_CPPCHECK`, and :prop_tgt:`<LANG>_INCLUDE_WHAT_YOU_USE`,
are executed, they will skip analyzing the `generatedBindings.cpp` file.
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.

View File

@@ -30,3 +30,10 @@ when a target is created.
This property supports
:manual:`generator expressions <cmake-generator-expressions(7)>`.
:prop_sf:`SKIP_LINTING` can be set on individual source files to exclude
them from the linting process, which includes tools like
:prop_tgt:`<LANG>_CPPLINT`, :prop_tgt:`<LANG>_CLANG_TIDY`,
:prop_tgt:`<LANG>_CPPCHECK`, and :prop_tgt:`<LANG>_INCLUDE_WHAT_YOU_USE`.
When :prop_sf:`SKIP_LINTING` is set on a source file, the mentioned tools
will not be run on that specific file.

View File

@@ -20,3 +20,10 @@ created.
This property supports
:manual:`generator expressions <cmake-generator-expressions(7)>`.
:prop_sf:`SKIP_LINTING` can be set on individual source files to exclude
them from the linting process, which includes tools like
:prop_tgt:`<LANG>_CPPLINT`, :prop_tgt:`<LANG>_CLANG_TIDY`,
:prop_tgt:`<LANG>_CPPCHECK`, and :prop_tgt:`<LANG>_INCLUDE_WHAT_YOU_USE`.
When :prop_sf:`SKIP_LINTING` is set on a source file, the mentioned tools
will not be run on that specific file.

View File

@@ -18,3 +18,10 @@ created.
This property supports
:manual:`generator expressions <cmake-generator-expressions(7)>`.
:prop_sf:`SKIP_LINTING` can be set on individual source files to exclude
them from the linting process, which includes tools like
:prop_tgt:`<LANG>_CPPLINT`, :prop_tgt:`<LANG>_CLANG_TIDY`,
:prop_tgt:`<LANG>_CPPCHECK`, and :prop_tgt:`<LANG>_INCLUDE_WHAT_YOU_USE`.
When :prop_sf:`SKIP_LINTING` is set on a source file, the mentioned tools
will not be run on that specific file.

View File

@@ -18,3 +18,10 @@ when a target is created.
This property supports
:manual:`generator expressions <cmake-generator-expressions(7)>`.
:prop_sf:`SKIP_LINTING` can be set on individual source files to exclude
them from the linting process, which includes tools like
:prop_tgt:`<LANG>_CPPLINT`, :prop_tgt:`<LANG>_CLANG_TIDY`,
:prop_tgt:`<LANG>_CPPCHECK`, and :prop_tgt:`<LANG>_INCLUDE_WHAT_YOU_USE`.
When :prop_sf:`SKIP_LINTING` is set on a source file, the mentioned tools
will not be run on that specific file.

View File

@@ -0,0 +1,5 @@
skip-linting
------------
* The :prop_sf:`SKIP_LINTING` source file property was added to suppress
target-wide code checks on specific sources.

View File

@@ -1057,10 +1057,13 @@ void cmMakefileTargetGenerator::WriteObjectRuleFiles(
compilerLauncher = GetCompilerLauncher(lang, config);
}
std::string const codeCheck = this->GenerateCodeCheckRules(
source, compilerLauncher, "$(CMAKE_COMMAND)", config, nullptr);
if (!codeCheck.empty()) {
compileCommands.front().insert(0, codeCheck);
cmValue const skipCodeCheck = source.GetProperty("SKIP_LINTING");
if (!skipCodeCheck.IsOn()) {
std::string const codeCheck = this->GenerateCodeCheckRules(
source, compilerLauncher, "$(CMAKE_COMMAND)", config, nullptr);
if (!codeCheck.empty()) {
compileCommands.front().insert(0, codeCheck);
}
}
// If compiler launcher was specified and not consumed above, it

View File

@@ -1219,15 +1219,19 @@ void cmNinjaTargetGenerator::WriteObjectBuildStatement(
vars["FLAGS"] = this->ComputeFlagsForObject(source, language, config);
vars["DEFINES"] = this->ComputeDefines(source, language, config);
vars["INCLUDES"] = this->ComputeIncludes(source, language, config);
auto const cmakeCmd = this->GetLocalGenerator()->ConvertToOutputFormat(
cmSystemTools::GetCMakeCommand(), cmLocalGenerator::SHELL);
auto compilerLauncher = this->GetCompilerLauncher(language, config);
vars["CODE_CHECK"] =
this->GenerateCodeCheckRules(*source, compilerLauncher, cmakeCmd, config,
[this](std::string const& path) {
return this->ConvertToNinjaPath(path);
});
cmValue const skipCodeCheck = source->GetProperty("SKIP_LINTING");
if (!skipCodeCheck.IsOn()) {
auto const cmakeCmd = this->GetLocalGenerator()->ConvertToOutputFormat(
cmSystemTools::GetCMakeCommand(), cmLocalGenerator::SHELL);
vars["CODE_CHECK"] =
this->GenerateCodeCheckRules(*source, compilerLauncher, cmakeCmd, config,
[this](const std::string& path) {
return this->ConvertToNinjaPath(path);
});
}
// If compiler launcher was specified and not consumed above, it
// goes to the beginning of the command line.

View File

@@ -0,0 +1,3 @@
set(CTEST_USE_LAUNCHERS 1)
include(CTestUseLaunchers)
include(C_skip_linting_ON.cmake)

View File

@@ -0,0 +1,3 @@
cmake_minimum_required(VERSION 3.5)
project(${RunCMake_TEST} NONE)
include(${RunCMake_TEST}.cmake)

View File

@@ -0,0 +1,3 @@
set(CTEST_USE_LAUNCHERS 1)
include(CTestUseLaunchers)
include(CXX_skip_linting_ON.cmake)

View File

@@ -0,0 +1 @@
(1|2)

View File

@@ -0,0 +1,7 @@
enable_language(CXX)
set(CMAKE_CXX_INCLUDE_WHAT_YOU_USE "$<1:${PSEUDO_IWYU}>" -some -args)
set(CMAKE_CXX_CLANG_TIDY "$<1:${PSEUDO_TIDY}>" -bad)
set(CMAKE_CXX_CPPLINT "$<1:${PSEUDO_CPPLINT}>" --error)
set(CMAKE_CXX_CPPCHECK "$<1:${PSEUDO_CPPCHECK}>" -error)
add_executable(main main.cxx)
set_source_files_properties(main.cxx PROPERTIES SKIP_LINTING OFF)

View File

@@ -0,0 +1,7 @@
enable_language(CXX)
set(CMAKE_CXX_INCLUDE_WHAT_YOU_USE "$<1:${PSEUDO_IWYU}>" -some -args)
set(CMAKE_CXX_CLANG_TIDY "$<1:${PSEUDO_TIDY}>" -bad)
set(CMAKE_CXX_CPPLINT "$<1:${PSEUDO_CPPLINT}>" --error)
set(CMAKE_CXX_CPPCHECK "$<1:${PSEUDO_CPPCHECK}>" -error)
add_executable(main main.cxx)
set_source_files_properties(main.cxx PROPERTIES SKIP_LINTING ON)

View File

@@ -0,0 +1 @@
(1|2)

View File

@@ -0,0 +1,7 @@
enable_language(C)
set(CMAKE_C_INCLUDE_WHAT_YOU_USE "${PSEUDO_IWYU}" -some -args)
set(CMAKE_C_CLANG_TIDY "${PSEUDO_TIDY}" -bad)
set(CMAKE_C_CPPLINT "${PSEUDO_CPPLINT}" --error)
set(CMAKE_C_CPPCHECK "${PSEUDO_CPPCHECK}" -error)
add_executable(main main.c)
set_source_files_properties(main.c PROPERTIES SKIP_LINTING OFF)

View File

@@ -0,0 +1,7 @@
enable_language(C)
set(CMAKE_C_INCLUDE_WHAT_YOU_USE "${PSEUDO_IWYU}" -some -args)
set(CMAKE_C_CLANG_TIDY "${PSEUDO_TIDY}" -bad)
set(CMAKE_C_CPPLINT "${PSEUDO_CPPLINT}" --error)
set(CMAKE_C_CPPCHECK "${PSEUDO_CPPCHECK}" -error)
add_executable(main main.c)
set_source_files_properties(main.c PROPERTIES SKIP_LINTING ON)

View File

@@ -25,3 +25,22 @@ if(NOT RunCMake_GENERATOR STREQUAL "Watcom WMake")
run_multilint(C-launch)
run_multilint(CXX-launch)
endif()
function(run_skip_linting test_name)
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()
run_skip_linting(C_skip_linting_ON)
run_skip_linting(CXX_skip_linting_ON)
run_skip_linting(C_skip_linting_OFF)
run_skip_linting(CXX_skip_linting_OFF)
if(NOT RunCMake_GENERATOR STREQUAL "Watcom WMake")
run_skip_linting(C-launch_skip_linting_ON)
run_skip_linting(CXX-launch_skip_linting_ON)
endif()