I try to use clang-tidy on Windows - so far without being successfull.
As a precondition I've installed LLVM 3.9.1.
My normal compiler is MSVC 2015, my build system is QBS 1.7.2. Using QBS I have generated compile_commands.json. Of course that file contains MSVC 2015 cl.exe flags/arguments. Here is an excerpt showing the entry for one file:
{
"arguments": [
"C:/Programs/MVS14/VC/bin/amd64/cl.exe",
"/nologo",
"/c",
"/EHsc",
"/Zi",
"/MDd",
"/IC:\\some_ci_job_folder\\src\\some_component\\include",
"/IC:\\some_ci_job_folder\\src\\some_needed_component\\include",
"/IC:\\Programs\\Qt\\Online\\5.6\\msvc2015_64\\include",
"/IC:\\Programs\\Qt\\Online\\5.6\\msvc2015_64\\include\\QtCore",
"/IC:\\Programs\\Qt\\Online\\5.6\\msvc2015_64\\mkspecs\\win32-msvc2015",
"/IC:\\some_ci_job_folder\\target\\build\\win64-vc14-qt56x-debug\\some_component.win64-vc14-qt56x.ce20db24\\qt.headers",
"/D_MBCS",
"/DWIN32",
"/DQT_CORE_LIB",
"/DNOMINMAX",
"/DQT_DISABLE_DEPRECATED_BEFORE=0x000000",
"/DVERSION_ID=\"MAJOR_UNDEF.MINOR_UNDEF-REVISION_UNDEF\"",
"/DVERSION_MAJOR=0",
"/DVERSION_MINOR=0",
"/DVERSION_REVISION=0",
"/DUSES_QT",
"/D_DEBUG",
"/D__mswin__",
"/DUSE_RVALUE_REFS=1",
"/D_CRT_SECURE_NO_DEPRECATE",
"/D_SCL_SECURE_NO_WARNINGS",
"/DWINVER=0x0502",
"/D_WIN32_WINNT=0x0502",
"/D_WIN32_WINDOWS=0x0502",
"/TP",
"/FS",
"/Zm200",
"/W4",
"/FS",
"/GR",
"/wd4018",
"/wd4063",
"/wd4100",
"/wd4121",
"/wd4127",
"/wd4150",
"/wd4189",
"/wd4238",
"/wd4239",
"/wd4244",
"/wd4245",
"/wd4267",
"/wd4290",
"/wd4389",
"/wd4510",
"/wd4512",
"/wd4610",
"/wd4718",
"/wd4481",
"/FoC:\\some_ci_job_folder\\target\\build\\win64-vc14-qt56x-debug\\some_component.win64-vc14-qt56x.ce20db24\\.obj\\f27fede2220bcd32\\foo.cpp.obj",
"/FdC:\\some_ci_job_folder\\target\\build\\win64-vc14-qt56x-debug\\some_component.win64-vc14-qt56x.ce20db24\\.obj\\f27fede2220bcd32\\",
"C:\\some_ci_job_folder\\src\\some_component\\src\\foo.cpp"
],
"directory": "C:/some_ci_job_folder/target/build/win64-vc14-qt56x-debug/some_component.win64-vc14-qt56x.ce20db24/.obj",
"file": "C:/some_ci_job_folder/src/some_component/src/foo.cpp"
},
Switching to the job/project folder C:/some_ci_job_folder/ and running
clang-tidy -p target\build\win64-vc14-qt56x-debug src\some_component\src\foo.cpp 1>clang-tidy.txt 2>&1
gives me the following warnings and one error:
... warnings and 1 error generated.
Error while processing C:\some_ci_job_folder\src\some_component\src\foo.cpp.
warning: /DNOMINMAX: 'linker' input unused [clang-diagnostic-unused-command-line-argument]
warning: /DQT_CORE_LIB: 'linker' input unused [clang-diagnostic-unused-command-line-argument]
... more warnings about defines ...
warning: /D_WIN32_WINDOWS=0x0502: 'linker' input unused [clang-diagnostic-unused-command-line-argument]
warning: /D_WIN32_WINNT=0x0502: 'linker' input unused [clang-diagnostic-unused-command-line-argument]
warning: /D__mswin__: 'linker' input unused [clang-diagnostic-unused-command-line-argument]
warning: /EHsc: 'linker' input unused [clang-diagnostic-unused-command-line-argument]
warning: /FS: 'linker' input unused [clang-diagnostic-unused-command-line-argument]
warning: /FdC:\some_ci_job_folder\target\build\win64-vc14-qt56x-debug\some_component.win64-vc14-qt56x.ce20db24\.obj\f27fede2220bcd32\: 'linker' input unused [clang-diagnostic-unused-command-line-argument]
warning: /FoC:\some_ci_job_folder\target\build\win64-vc14-qt56x-debug\some_component.win64-vc14-qt56x.ce20db24\.obj\f27fede2220bcd32\foo.cpp.obj: 'linker' input unused [clang-diagnostic-unused-command-line-argument]
warning: /GR: 'linker' input unused [clang-diagnostic-unused-command-line-argument]
warning: /IC:\Programs\Qt\Online\5.6\msvc2015_64\include: 'linker' input unused [clang-diagnostic-unused-command-line-argument]
warning: /IC:\Programs\Qt\Online\5.6\msvc2015_64\include\QtCore: 'linker' input unused [clang-diagnostic-unused-command-line-argument]
warning: /IC:\Programs\Qt\Online\5.6\msvc2015_64\mkspecs\win32-msvc2015: 'linker' input unused [clang-diagnostic-unused-command-line-argument]
warning: /IC:\some_ci_job_folder\src\shared\some_needed_component\include: 'linker' input unused [clang-diagnostic-unused-command-line-argument]
warning: /IC:\some_ci_job_folder\src\shared\some_component\include: 'linker' input unused [clang-diagnostic-unused-command-line-argument]
warning: /IC:\some_ci_job_folder\target\build\win64-vc14-qt56x-debug\some_component.win64-vc14-qt56x.ce20db24\qt.headers: 'linker' input unused [clang-diagnostic-unused-command-line-argument]
warning: /MDd: 'linker' input unused [clang-diagnostic-unused-command-line-argument]
warning: /TP: 'linker' input unused [clang-diagnostic-unused-command-line-argument]
warning: /W4: 'linker' input unused [clang-diagnostic-unused-command-line-argument]
warning: /Zi: 'linker' input unused [clang-diagnostic-unused-command-line-argument]
warning: /Zm200: 'linker' input unused [clang-diagnostic-unused-command-line-argument]
warning: /c: 'linker' input unused [clang-diagnostic-unused-command-line-argument]
warning: /nologo: 'linker' input unused [clang-diagnostic-unused-command-line-argument]
warning: /wd4189: 'linker' input unused [clang-diagnostic-unused-command-line-argument]
... more warnings ...
warning: /wd4718: 'linker' input unused [clang-diagnostic-unused-command-line-argument]
C:\some_ci_job_folder\src\some_component\src/foo.h:71:10: error: 'some_needed_component/bar.h' file not found [clang-diagnostic-error]
#include "some_needed_component/bar.h"
^
Any idea why clang-tidy does not interpret the cl options correctly (by default)?
Okay, after googling I found that adding --driver-mode=cl might improve things. But
clang-tidy -p target\build\win64-vc14-qt56x-debug src\some_component\src\foo.cpp -- --driver-mode=cl 1>clang-tidy.txt 2>&1
still gives me
1 warning and 1 error generated.
Error while processing C:\some_ci_job_folder\src\some_component\src\foo.cpp.
warning: unknown argument ignored in clang-cl: '-resource-dir=C:\Programs\LLVM-3.9.1\bin\..\lib\clang\3.9.1' [clang-diagnostic-unknown-argument]
C:\some_ci_job_folder\src\some_component\src/foo.h:71:10: error: 'some_needed_component/bar.h' file not found [clang-diagnostic-error]
#include "some_needed_component/bar.h"
^
So it no longer complains about the include path arguments but as far as I can tell those arguments are just ignored?
BTW: I run clang-tidy from within the Developer Command Prompt for VS2015. So far I'm not really sure whether this is required?
Any ideas ... how to solve the problem, how to debug the evaluation of the include path arguments, ... ?
I am a Cppcheck developer.
clang-tidy has been integrated in the Cppcheck GUI.
You can run clang-tidy on compile databases or visual studio solutions using the Cppcheck GUI. Cppcheck GUI uses its own compile database parser that possibly works differently than the clang-tidy builtin parser.
It is a free open source (GPL) tool. It can be downloaded here: http://cppcheck.sf.net
Here are some screenshots: http://cppcheck.sf.net/clangtidy/index.html
Feel free to try it and don't hesitate to tell me if there is anything we can fix.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With