[clangd] (take 2) Try harder to find a plausible `clang` as argv0, particularly on Mac.
Summary:
This was originally committed in 88bccded8fa169481fa367debf5ec615640635a1,
and reverted in 93f77617abba512d2861e2fc50ce385883f587b6.
This version is now much more testable: the "detect toolchain properties" part
is still not tested but also not active in tests.
All the command manipulation based on the detected properties is
directly tested, and also not active in other tests.
Fixes https://github.com/clangd/clangd/issues/211
Fixes https://github.com/clangd/clangd/issues/178
Reviewers: kbobyrev, ilya-biryukov
Subscribers: mgorny, ormris, cfe-commits, usaxena95, kadircet, arphaman, jkorous, MaskRay
Tags: #clang
Differential Revision: https://reviews.llvm.org/D71029
2019-11-30 02:37:48 +08:00
|
|
|
//===--- CompileCommands.h - Manipulation of compile flags -------*- C++-*-===//
|
|
|
|
//
|
|
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
2019-12-06 19:27:15 +08:00
|
|
|
#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANGD_COMPILECOMMANDS_H
|
|
|
|
#define LLVM_CLANG_TOOLS_EXTRA_CLANGD_COMPILECOMMANDS_H
|
[clangd] (take 2) Try harder to find a plausible `clang` as argv0, particularly on Mac.
Summary:
This was originally committed in 88bccded8fa169481fa367debf5ec615640635a1,
and reverted in 93f77617abba512d2861e2fc50ce385883f587b6.
This version is now much more testable: the "detect toolchain properties" part
is still not tested but also not active in tests.
All the command manipulation based on the detected properties is
directly tested, and also not active in other tests.
Fixes https://github.com/clangd/clangd/issues/211
Fixes https://github.com/clangd/clangd/issues/178
Reviewers: kbobyrev, ilya-biryukov
Subscribers: mgorny, ormris, cfe-commits, usaxena95, kadircet, arphaman, jkorous, MaskRay
Tags: #clang
Differential Revision: https://reviews.llvm.org/D71029
2019-11-30 02:37:48 +08:00
|
|
|
|
|
|
|
#include "clang/Tooling/ArgumentsAdjusters.h"
|
|
|
|
#include "clang/Tooling/CompilationDatabase.h"
|
|
|
|
#include <string>
|
|
|
|
#include <vector>
|
|
|
|
|
|
|
|
namespace clang {
|
|
|
|
namespace clangd {
|
|
|
|
|
|
|
|
// CommandMangler transforms compile commands from some external source
|
|
|
|
// for use in clangd. This means:
|
|
|
|
// - running the frontend only, stripping args regarding output files etc
|
|
|
|
// - forcing the use of clangd's builtin headers rather than clang's
|
|
|
|
// - resolving argv0 as cc1 expects
|
|
|
|
// - injecting -isysroot flags on mac as the system clang does
|
|
|
|
struct CommandMangler {
|
|
|
|
// Absolute path to clang.
|
|
|
|
llvm::Optional<std::string> ClangPath;
|
|
|
|
// Directory containing builtin headers.
|
|
|
|
llvm::Optional<std::string> ResourceDir;
|
|
|
|
// Root for searching for standard library (passed to -isysroot).
|
|
|
|
llvm::Optional<std::string> Sysroot;
|
|
|
|
|
|
|
|
// A command-mangler that doesn't know anything about the system.
|
|
|
|
// This is hermetic for unit-tests, but won't work well in production.
|
|
|
|
static CommandMangler forTests();
|
|
|
|
// Probe the system and build a command-mangler that knows the toolchain.
|
|
|
|
// - try to find clang on $PATH, otherwise fake a path near clangd
|
|
|
|
// - find the resource directory installed near clangd
|
|
|
|
// - on mac, find clang and isysroot by querying the `xcrun` launcher
|
|
|
|
static CommandMangler detect();
|
|
|
|
|
|
|
|
void adjust(std::vector<std::string> &Cmd) const;
|
|
|
|
explicit operator clang::tooling::ArgumentsAdjuster();
|
|
|
|
|
|
|
|
private:
|
|
|
|
CommandMangler() = default;
|
|
|
|
};
|
|
|
|
|
|
|
|
} // namespace clangd
|
|
|
|
} // namespace clang
|
2019-12-06 19:27:15 +08:00
|
|
|
|
|
|
|
#endif
|