diff options
author | Craig Scott <craig.scott@crascit.com> | 2022-10-06 05:14:04 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2022-10-07 14:33:32 (GMT) |
commit | 3f4e0839c48480b0cb3396ddbcadef25e69854ee (patch) | |
tree | 58c0aeaa4804ab2685d0e0c1db5e2295089d99ef | |
parent | 1e364201e6738a34d39a9522c050768b7ad88559 (diff) | |
download | CMake-3f4e0839c48480b0cb3396ddbcadef25e69854ee.zip CMake-3f4e0839c48480b0cb3396ddbcadef25e69854ee.tar.gz CMake-3f4e0839c48480b0cb3396ddbcadef25e69854ee.tar.bz2 |
clang-tidy: Don't append compiler commands if using -p
When the -p option is given to clang-tidy, it doesn't need the compile
command line to be appended. It can get everything it needs from the
compile_commands.json file in the directory specified with the -p option.
When the compiler being used is not the system default compiler,
clang-tidy has been observed to pick up the wrong headers when the
compiler command line is given, but not if only the -p option is used.
Therefore, don't append the compiler command line if -p is present in
the <LANG>_CLANG_TIDY target property.
Fixes: #24017
-rw-r--r-- | Help/prop_tgt/LANG_CLANG_TIDY.rst | 18 | ||||
-rw-r--r-- | Help/release/dev/clang-tidy-prefer-p-option.rst | 5 | ||||
-rw-r--r-- | Source/cmcmd.cxx | 26 | ||||
-rw-r--r-- | Tests/RunCMake/ClangTidy/RunCMakeTest.cmake | 1 | ||||
-rw-r--r-- | Tests/RunCMake/ClangTidy/compdb.cmake | 7 | ||||
-rw-r--r-- | Tests/RunCMake/pseudo_tidy.c | 10 |
6 files changed, 57 insertions, 10 deletions
diff --git a/Help/prop_tgt/LANG_CLANG_TIDY.rst b/Help/prop_tgt/LANG_CLANG_TIDY.rst index af16d3c..ffa0b9a 100644 --- a/Help/prop_tgt/LANG_CLANG_TIDY.rst +++ b/Help/prop_tgt/LANG_CLANG_TIDY.rst @@ -3,13 +3,25 @@ .. versionadded:: 3.6 -This property is implemented only when ``<LANG>`` is ``C``, ``CXX``, ``OBJC`` or ``OBJCXX``. +This property is implemented only when ``<LANG>`` is ``C``, ``CXX``, ``OBJC`` +or ``OBJCXX``. -Specify a :ref:`semicolon-separated list <CMake Language Lists>` containing a command -line for the ``clang-tidy`` tool. The :ref:`Makefile Generators` +Specify a :ref:`semicolon-separated list <CMake Language Lists>` containing +a command line for the ``clang-tidy`` tool. The :ref:`Makefile Generators` and the :generator:`Ninja` generator will run this tool along with the compiler and report a warning if the tool reports any problems. +The specified ``clang-tidy`` command line will be invoked with additional +arguments specifying the source file and, after ``--``, the full compiler +command line. + +.. versionchanged:: 3.25 + + If the specified ``clang-tidy`` command line includes the ``-p`` option, + it will invoked without ``--`` and the full compiler command line. + ``clang-tidy`` will look up the source file in the specified compiler + commands database. + This property is initialized by the value of the :variable:`CMAKE_<LANG>_CLANG_TIDY` variable if it is set when a target is created. diff --git a/Help/release/dev/clang-tidy-prefer-p-option.rst b/Help/release/dev/clang-tidy-prefer-p-option.rst new file mode 100644 index 0000000..816c7dd --- /dev/null +++ b/Help/release/dev/clang-tidy-prefer-p-option.rst @@ -0,0 +1,5 @@ +clang-tidy-prefer-p-option +-------------------------- + +* If :prop_tgt:`<LANG>_CLANG_TIDY` includes a ``-p`` argument, the + full compiler command line is no longer appended after ``--``. diff --git a/Source/cmcmd.cxx b/Source/cmcmd.cxx index 00c9bda..4ba8d36 100644 --- a/Source/cmcmd.cxx +++ b/Source/cmcmd.cxx @@ -360,17 +360,29 @@ int HandleIWYU(const std::string& runCmd, const std::string& /* sourceFile */, int HandleTidy(const std::string& runCmd, const std::string& sourceFile, const std::vector<std::string>& orig_cmd) { - // Construct the clang-tidy command line by taking what was given - // and adding our compiler command line. The clang-tidy tool will - // automatically skip over the compiler itself and extract the - // options. - int ret; std::vector<std::string> tidy_cmd = cmExpandedList(runCmd, true); tidy_cmd.push_back(sourceFile); - tidy_cmd.emplace_back("--"); - cm::append(tidy_cmd, orig_cmd); + + // clang-tidy supports working out the compile commands from a + // compile_commands.json file in a directory given by a "-p" option, or by + // passing the compiler command line arguments after --. When the latter + // strategy is used and the build is using a compiler other than the system + // default, clang-tidy may erroneously use the system default compiler's + // headers instead of those from the custom compiler. It doesn't do that if + // given a compile_commands.json to work with instead, so prefer to use the + // compile_commands.json file when "-p" is present. + if (!cm::contains(tidy_cmd.cbegin(), tidy_cmd.cend() - 1, "-p")) { + // Construct the clang-tidy command line by taking what was given + // and adding our compiler command line. The clang-tidy tool will + // automatically skip over the compiler itself and extract the + // options. If the compiler is a custom compiler, clang-tidy might + // not correctly handle that with this approach. + tidy_cmd.emplace_back("--"); + cm::append(tidy_cmd, orig_cmd); + } // Run the tidy command line. Capture its stdout and hide its stderr. + int ret; std::string stdOut; std::string stdErr; if (!cmSystemTools::RunSingleCommand(tidy_cmd, &stdOut, &stdErr, &ret, diff --git a/Tests/RunCMake/ClangTidy/RunCMakeTest.cmake b/Tests/RunCMake/ClangTidy/RunCMakeTest.cmake index ee41d94..5e3fbc4 100644 --- a/Tests/RunCMake/ClangTidy/RunCMakeTest.cmake +++ b/Tests/RunCMake/ClangTidy/RunCMakeTest.cmake @@ -29,3 +29,4 @@ if (NOT RunCMake_GENERATOR STREQUAL "Watcom WMake") endif() endif() run_tidy(C-bad) +run_tidy(compdb) diff --git a/Tests/RunCMake/ClangTidy/compdb.cmake b/Tests/RunCMake/ClangTidy/compdb.cmake new file mode 100644 index 0000000..f83e0ae --- /dev/null +++ b/Tests/RunCMake/ClangTidy/compdb.cmake @@ -0,0 +1,7 @@ +enable_language(C) + +# Include a --checks option to confirm that we don't match options that start +# with --, only a standalone -- +set(CMAKE_C_CLANG_TIDY "${PSEUDO_TIDY}" -p ${CMAKE_BINARY_DIR} --checks=*) + +add_executable(main main.c) diff --git a/Tests/RunCMake/pseudo_tidy.c b/Tests/RunCMake/pseudo_tidy.c index 2feeb0f..a43133b 100644 --- a/Tests/RunCMake/pseudo_tidy.c +++ b/Tests/RunCMake/pseudo_tidy.c @@ -5,6 +5,16 @@ int main(int argc, char* argv[]) { int i; for (i = 1; i < argc; ++i) { + if (strcmp(argv[i], "-p") == 0) { + // Ensure compile commands were not appended after the source file + for (++i; i < argc; ++i) { + if (strcmp(argv[i], "--") == 0) { + fprintf(stderr, "Command line arguments unexpectedly appended\n"); + return 1; + } + } + return 0; + } if (strcmp(argv[i], "-bad") == 0) { fprintf(stdout, "stdout from bad command line arg '-bad'\n"); fprintf(stderr, "stderr from bad command line arg '-bad'\n"); |