Background:
On a Windows 10 PC, I have a c++ codebase. Using CMAKE I generate an Mingw-w64 project (using Eclipse IDE) and a Visual Studio 2017 project. I like compiling my projects with different build systems as each gives different warnings and errors. As part of the Mingw build, I can enable clang-tidy checks using CMAKE's CXX_CLANG_TIDY. This works well, producing a co-compile showing many interesting warnings from clang-tidy.
When I installed mingw-w64, llvm and VS I was careful not to allow these to populate the PATH environment variable, so a regular command prompt won't run gcc, clang, or CL or any associated tools. The environment is set up by a batch file before launching Eclipse or Visual Studio.
This has worked well for years (I'm still using clang 7.0.1). Both IDE's compile the same code base just fine...
Until I upgrade to Visual Studio 2019, including it's own copy of clang 10.0.0.
Now, my original clang 7.0.1 has stopped working! As I only use clang-tidy it took a while to narrow this down, but the original clang is looking for the system headers in the new clang's include location. The headers it finds are too new and the build fails.
I have found many things to try on SO and elsewhere (although any pointers are welcome) like supplying a --sysroot
switch, so this question is more specific:
Question:
When there are no apparent environment variables to point to a specific clang location, where does clang find it's default target triple and therefore it's -internal-isystem
paths? Why does my previously-working clang installation now look for it's system headers in a more recently installed clang location?
With a Windows command prompt:
cd C:\Program Files\LLVM\bin
(my original clang location)
C:\Program Files\LLVM\bin>clang test.cpp -v
clang version 7.0.1 (tags/RELEASE_701/final)
Target: x86_64-pc-windows-msvc
Thread model: posix
InstalledDir: C:\Program Files\LLVM\bin
"C:\\Program Files\\LLVM\\bin\\clang.exe" -cc1 -triple x86_64-pc-windows-msvc19.26.28806 -emit-obj -mrelax-all -mincremental-linker-compatible -disable-free -disable-llvm-verifier -discard-value-names -main-file-name test.cpp -mrelocation-model pic -pic-level 2 -mthread-model posix -fmath-errno -masm-verbose -mconstructor-aliases -munwind-tables -target-cpu x86-64 -dwarf-column-info -debugger-tuning=gdb -momit-leaf-frame-pointer -v -resource-dir "C:\\Program Files\\LLVM\\lib\\clang\\7.0.1" -internal-isystem "C:\\Program Files\\LLVM\\lib\\clang\\7.0.1\\include" -internal-isystem "C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community\\VC\\Tools\\MSVC\\14.26.28801\\include" -internal-isystem "C:\\Program Files (x86)\\Windows Kits\\10\\Include\\10.0.18362.0\\ucrt" -internal-isystem "C:\\Program Files (x86)\\Windows Kits\\10\\include\\10.0.18362.0\\shared" -internal-isystem "C:\\Program Files (x86)\\Windows Kits\\10\\include\\10.0.18362.0\\um" -internal-isystem "C:\\Program Files (x86)\\Windows Kits\\10\\include\\10.0.18362.0\\winrt" -fdeprecated-macro -fdebug-compilation-dir "C:\\Program Files\\LLVM\\bin" -ferror-limit 19 -fmessage-length 120 -fno-use-cxa-atexit -fms-extensions -fms-compatibility -fms-compatibility-version=19.26.28806 -std=c++14 -fdelayed-template-parsing -fobjc-runtime=gcc -fcxx-exceptions -fexceptions -fdiagnostics-show-option -fcolor-diagnostics -o "C:\\Users\\Foo\\AppData\\Local\\Temp\\test-c0aac1.o" -x c++ test.cpp
clang -cc1 version 7.0.1 based upon LLVM 7.0.1 default target x86_64-pc-win32
#include "..." search starts here:
#include <...> search starts here:
C:\Program Files\LLVM\lib\clang\7.0.1\include
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.26.28801\include
C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\ucrt
C:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\shared
C:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\um
C:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\winrt
End of search list.
In file included from test.cpp:1:
In file included from C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.26.28801\include\string:9:
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.26.28801\include\yvals_core.h:462:2: error:
STL1000: Unexpected compiler version, expected Clang 9.0.0 or newer.
#error STL1000: Unexpected compiler version, expected Clang 9.0.0 or newer.
Where C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.26.28801\include
is the installed-only-today clang 10.0.0 location, so clearly not compiled into clang.exe.
Where does clang get it's defaults from?