diff --git a/src/messages/initialize.cc b/src/messages/initialize.cc index cc2d76c2..7c93511e 100644 --- a/src/messages/initialize.cc +++ b/src/messages/initialize.cc @@ -269,7 +269,9 @@ void Initialize(MessageHandler *m, InitializeParam ¶m, ReplyOnce &reply) { LOG_S(INFO) << "initializationOptions: " << output.GetString(); if (g_config->cacheDirectory.size()) { - g_config->cacheDirectory = NormalizePath(g_config->cacheDirectory); + SmallString<256> Path(g_config->cacheDirectory); + sys::fs::make_absolute(Path); + g_config->cacheDirectory = Path.str(); EnsureEndsInSlash(g_config->cacheDirectory); } } diff --git a/src/project.cc b/src/project.cc index ec48e16d..911e84d2 100644 --- a/src/project.cc +++ b/src/project.cc @@ -15,6 +15,7 @@ limitations under the License. #include "project.hh" +#include "clang_tu.hh" // llvm::vfs #include "filesystem.hh" #include "log.hh" #include "match.hh" @@ -328,6 +329,7 @@ LoadEntriesFromDirectory(ProjectConfig *project, std::vector result; ProjectProcessor proc(project); for (tooling::CompileCommand &Cmd : CDB->getAllCompileCommands()) { + static bool once; Project::Entry entry; entry.root = project->root; DoPathMapping(entry.root); @@ -342,7 +344,18 @@ LoadEntriesFromDirectory(ProjectConfig *project, DoPathMapping(arg); entry.args.push_back(Intern(arg)); } + + // Work around relative --sysroot= as it isn't affected by + // -working-directory=. chdir is thread hostile but this function runs + // before indexers do actual work and it works when there is only one + // workspace folder. + if (!once) { + once = true; + llvm::vfs::getRealFileSystem()->setCurrentWorkingDirectory( + entry.directory); + } proc.Process(entry); + if (Seen.insert(entry.filename).second) result.push_back(entry); }