mirror of
https://github.com/MaskRay/ccls.git
synced 2025-08-17 20:22:23 +00:00
Add clang.prependArgs option
To specify arguments that are inserted immediately after the compiler driver name. For example, initialization options `{"clang":{"prependArgs":["--gcc-install-dir=/usr/lib/gcc/x86_64-linux-gnu/13"]}}` transforms `clang -c a.cc` into `clang --gcc-install-dir=/usr/lib/gcc/x86_64-linux-gnu/13 -c a.cc`. This allows users to provide default arguments that can be overridden as needed.
This commit is contained in:
parent
cfc7c0208f
commit
5660367c77
@ -88,7 +88,11 @@ struct Config {
|
|||||||
// ["-fopenmp", "-m*", "-Wall"].
|
// ["-fopenmp", "-m*", "-Wall"].
|
||||||
std::vector<std::string> excludeArgs;
|
std::vector<std::string> excludeArgs;
|
||||||
|
|
||||||
// Additional arguments to pass to clang.
|
// Arguments to be inserted after the compiler driver name. These serve as default arguments that can be overridden
|
||||||
|
// by user-provided arguments.
|
||||||
|
std::vector<std::string> prependArgs;
|
||||||
|
|
||||||
|
// Additional arguments to be appended at the end of the argument list.
|
||||||
std::vector<std::string> extraArgs;
|
std::vector<std::string> extraArgs;
|
||||||
|
|
||||||
// Translate absolute paths in compile_commands.json entries, .ccls options
|
// Translate absolute paths in compile_commands.json entries, .ccls options
|
||||||
@ -329,7 +333,7 @@ REFLECT_STRUCT(Config::ServerCap::DocumentOnTypeFormattingOptions, firstTriggerC
|
|||||||
REFLECT_STRUCT(Config::ServerCap::Workspace::WorkspaceFolders, supported, changeNotifications);
|
REFLECT_STRUCT(Config::ServerCap::Workspace::WorkspaceFolders, supported, changeNotifications);
|
||||||
REFLECT_STRUCT(Config::ServerCap::Workspace, workspaceFolders);
|
REFLECT_STRUCT(Config::ServerCap::Workspace, workspaceFolders);
|
||||||
REFLECT_STRUCT(Config::ServerCap, documentOnTypeFormattingProvider, foldingRangeProvider, workspace);
|
REFLECT_STRUCT(Config::ServerCap, documentOnTypeFormattingProvider, foldingRangeProvider, workspace);
|
||||||
REFLECT_STRUCT(Config::Clang, excludeArgs, extraArgs, pathMappings, resourceDir);
|
REFLECT_STRUCT(Config::Clang, excludeArgs, prependArgs, extraArgs, pathMappings, resourceDir);
|
||||||
REFLECT_STRUCT(Config::ClientCapability, diagnosticsRelatedInformation, hierarchicalDocumentSymbolSupport, linkSupport,
|
REFLECT_STRUCT(Config::ClientCapability, diagnosticsRelatedInformation, hierarchicalDocumentSymbolSupport, linkSupport,
|
||||||
snippetSupport);
|
snippetSupport);
|
||||||
REFLECT_STRUCT(Config::CodeLens, localVariables);
|
REFLECT_STRUCT(Config::CodeLens, localVariables);
|
||||||
|
@ -490,14 +490,22 @@ Project::Entry Project::findEntry(const std::string &path, bool can_redirect, bo
|
|||||||
for (const std::string &arg : g_config->clang.extraArgs)
|
for (const std::string &arg : g_config->clang.extraArgs)
|
||||||
ret.args.push_back(intern(arg));
|
ret.args.push_back(intern(arg));
|
||||||
ret.args.push_back(intern("-working-directory=" + ret.directory));
|
ret.args.push_back(intern("-working-directory=" + ret.directory));
|
||||||
|
if (g_config->clang.prependArgs.size()) {
|
||||||
|
std::vector<const char *> args;
|
||||||
|
for (StringRef arg : g_config->clang.prependArgs)
|
||||||
|
args.push_back(intern(arg));
|
||||||
|
ret.args.insert(ret.args.begin() + 1, args.begin(), args.end());
|
||||||
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Project::index(WorkingFiles *wfiles, const RequestId &id) {
|
void Project::index(WorkingFiles *wfiles, const RequestId &id) {
|
||||||
auto &gi = g_config->index;
|
auto &gi = g_config->index;
|
||||||
GroupMatch match(gi.whitelist, gi.blacklist), match_i(gi.initialWhitelist, gi.initialBlacklist);
|
GroupMatch match(gi.whitelist, gi.blacklist), match_i(gi.initialWhitelist, gi.initialBlacklist);
|
||||||
std::vector<const char *> args, extra_args;
|
std::vector<const char *> args, prepend_args, extra_args;
|
||||||
for (const std::string &arg : g_config->clang.extraArgs)
|
for (StringRef arg : g_config->clang.prependArgs)
|
||||||
|
prepend_args.push_back(intern(arg));
|
||||||
|
for (StringRef arg : g_config->clang.extraArgs)
|
||||||
extra_args.push_back(intern(arg));
|
extra_args.push_back(intern(arg));
|
||||||
{
|
{
|
||||||
std::lock_guard lock(mtx);
|
std::lock_guard lock(mtx);
|
||||||
@ -510,6 +518,7 @@ void Project::index(WorkingFiles *wfiles, const RequestId &id) {
|
|||||||
args = entry.args;
|
args = entry.args;
|
||||||
args.insert(args.end(), extra_args.begin(), extra_args.end());
|
args.insert(args.end(), extra_args.begin(), extra_args.end());
|
||||||
args.push_back(intern("-working-directory=" + entry.directory));
|
args.push_back(intern("-working-directory=" + entry.directory));
|
||||||
|
args.insert(args.begin() + 1, prepend_args.begin(), prepend_args.end());
|
||||||
pipeline::index(entry.filename, args, interactive ? IndexMode::Normal : IndexMode::Background, false, id);
|
pipeline::index(entry.filename, args, interactive ? IndexMode::Normal : IndexMode::Background, false, id);
|
||||||
} else {
|
} else {
|
||||||
LOG_V(1) << "[" << i << "/" << folder.entries.size() << "]: " << reason << "; skip " << entry.filename;
|
LOG_V(1) << "[" << i << "/" << folder.entries.size() << "]: " << reason << "; skip " << entry.filename;
|
||||||
@ -529,8 +538,10 @@ void Project::indexRelated(const std::string &path) {
|
|||||||
auto &gi = g_config->index;
|
auto &gi = g_config->index;
|
||||||
GroupMatch match(gi.whitelist, gi.blacklist);
|
GroupMatch match(gi.whitelist, gi.blacklist);
|
||||||
StringRef stem = sys::path::stem(path);
|
StringRef stem = sys::path::stem(path);
|
||||||
std::vector<const char *> args, extra_args;
|
std::vector<const char *> args, prepend_args, extra_args;
|
||||||
for (const std::string &arg : g_config->clang.extraArgs)
|
for (StringRef arg : g_config->clang.prependArgs)
|
||||||
|
prepend_args.push_back(intern(arg));
|
||||||
|
for (StringRef arg : g_config->clang.extraArgs)
|
||||||
extra_args.push_back(intern(arg));
|
extra_args.push_back(intern(arg));
|
||||||
std::lock_guard lock(mtx);
|
std::lock_guard lock(mtx);
|
||||||
for (auto &[root, folder] : root2folder)
|
for (auto &[root, folder] : root2folder)
|
||||||
@ -540,6 +551,7 @@ void Project::indexRelated(const std::string &path) {
|
|||||||
args = entry.args;
|
args = entry.args;
|
||||||
args.insert(args.end(), extra_args.begin(), extra_args.end());
|
args.insert(args.end(), extra_args.begin(), extra_args.end());
|
||||||
args.push_back(intern("-working-directory=" + entry.directory));
|
args.push_back(intern("-working-directory=" + entry.directory));
|
||||||
|
args.insert(args.begin() + 1, prepend_args.begin(), prepend_args.end());
|
||||||
if (sys::path::stem(entry.filename) == stem && entry.filename != path && match.matches(entry.filename, &reason))
|
if (sys::path::stem(entry.filename) == stem && entry.filename != path && match.matches(entry.filename, &reason))
|
||||||
pipeline::index(entry.filename, args, IndexMode::Background, true);
|
pipeline::index(entry.filename, args, IndexMode::Background, true);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user