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:

committed by
Brad King

parent
993dde925f
commit
b480315e0c
@@ -329,6 +329,7 @@ syn keyword cmakeProperty contained
|
||||
\ SKIP_REGULAR_EXPRESSION
|
||||
\ SKIP_RETURN_CODE
|
||||
\ SKIP_UNITY_BUILD_INCLUSION
|
||||
\ SKIP_LINTING
|
||||
\ SOURCES
|
||||
\ SOURCE_DIR
|
||||
\ SOVERSION
|
||||
|
@@ -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
|
||||
|
41
Help/prop_sf/SKIP_LINTING.rst
Normal file
41
Help/prop_sf/SKIP_LINTING.rst
Normal 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.
|
@@ -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.
|
||||
|
@@ -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.
|
||||
|
@@ -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.
|
||||
|
@@ -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.
|
||||
|
5
Help/release/dev/skip-linting.rst
Normal file
5
Help/release/dev/skip-linting.rst
Normal 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.
|
@@ -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
|
||||
|
@@ -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.
|
||||
|
3
Tests/RunCMake/MultiLint/C-launch_skip_linting_ON.cmake
Normal file
3
Tests/RunCMake/MultiLint/C-launch_skip_linting_ON.cmake
Normal file
@@ -0,0 +1,3 @@
|
||||
set(CTEST_USE_LAUNCHERS 1)
|
||||
include(CTestUseLaunchers)
|
||||
include(C_skip_linting_ON.cmake)
|
3
Tests/RunCMake/MultiLint/CMakeLists copy.txt
Normal file
3
Tests/RunCMake/MultiLint/CMakeLists copy.txt
Normal file
@@ -0,0 +1,3 @@
|
||||
cmake_minimum_required(VERSION 3.5)
|
||||
project(${RunCMake_TEST} NONE)
|
||||
include(${RunCMake_TEST}.cmake)
|
@@ -0,0 +1,3 @@
|
||||
set(CTEST_USE_LAUNCHERS 1)
|
||||
include(CTestUseLaunchers)
|
||||
include(CXX_skip_linting_ON.cmake)
|
@@ -0,0 +1 @@
|
||||
(1|2)
|
7
Tests/RunCMake/MultiLint/CXX_skip_linting_OFF.cmake
Normal file
7
Tests/RunCMake/MultiLint/CXX_skip_linting_OFF.cmake
Normal 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)
|
7
Tests/RunCMake/MultiLint/CXX_skip_linting_ON.cmake
Normal file
7
Tests/RunCMake/MultiLint/CXX_skip_linting_ON.cmake
Normal 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)
|
@@ -0,0 +1 @@
|
||||
(1|2)
|
7
Tests/RunCMake/MultiLint/C_skip_linting_OFF.cmake
Normal file
7
Tests/RunCMake/MultiLint/C_skip_linting_OFF.cmake
Normal 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)
|
7
Tests/RunCMake/MultiLint/C_skip_linting_ON.cmake
Normal file
7
Tests/RunCMake/MultiLint/C_skip_linting_ON.cmake
Normal 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)
|
@@ -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()
|
||||
|
Reference in New Issue
Block a user