When doing a standalone build (i.e., building just LLDB against an existing LLVM/Clang
installation), LLDB is currently unable to find any Clang resource directory that contains
all the builtin headers we need to parse real source code. This causes several tests that
actually parse source code on disk within the expression parser to fail (most notably nearly
all the import-std-module tests).
The reason why LLDB can't find the resource directory is that we search based on the path
of the LLDB shared library path. We assumed that the Clang resource directory is in the
same prefix and has the same relative path to the LLDB shared library (e.g.,
../clang/10.0.0/include). However for a standalone build where the existing Clang can
be anywhere on the disk, so we can't just rely on the hardcoded relative paths to the
LLDB shared library.
It seems we can either solve this by copying the resource directory to the LLDB installation,
symlinking it there or we pass the path to the Clang installation to the code that is trying to find the resource
directory. When building the LLDB framework we currently copy the resource directory
over to the framework folder (this is why the import-std-module are not failing on the
Green Dragon standalone bot).
This patch symlinks the resource directory of Clang into the LLDB build directory. The
reason for that is simply that this is only needed when running LLDB from the build
directory. Once LLDB and Clang/LLVM are installed the already existing logic can find
the Clang resource directory by searching relative to the LLDB shared library.
I realize that this logic previously existed, but should this if/elseif chain check that these paths exists before committing to them? As it stands now, if Clang_DIR has a value that doesn't exist on disk, and meanwhile LLVM_DIR is also assigned, but does exist on disk, then this logic will take Clang_DIR over LLVM_DIR, when it shouldn't.