ソースを参照

Merge topic 'clang-tidy-prefer-p-option'

3f4e0839c4 clang-tidy: Don't append compiler commands if using -p

Acked-by: Kitware Robot <[email protected]>
Merge-request: !7753
Brad King 3 年 前
コミット
a07be2ffd1

+ 15 - 3
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.

+ 5 - 0
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 ``--``.

+ 19 - 7
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,

+ 1 - 0
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)

+ 7 - 0
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)

+ 10 - 0
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");