Skip to content

Commit 5660367

Browse files
committed
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.
1 parent cfc7c02 commit 5660367

File tree

2 files changed

+22
-6
lines changed

2 files changed

+22
-6
lines changed

src/config.hh

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,11 @@ struct Config {
8888
// ["-fopenmp", "-m*", "-Wall"].
8989
std::vector<std::string> excludeArgs;
9090

91-
// Additional arguments to pass to clang.
91+
// Arguments to be inserted after the compiler driver name. These serve as default arguments that can be overridden
92+
// by user-provided arguments.
93+
std::vector<std::string> prependArgs;
94+
95+
// Additional arguments to be appended at the end of the argument list.
9296
std::vector<std::string> extraArgs;
9397

9498
// Translate absolute paths in compile_commands.json entries, .ccls options
@@ -329,7 +333,7 @@ REFLECT_STRUCT(Config::ServerCap::DocumentOnTypeFormattingOptions, firstTriggerC
329333
REFLECT_STRUCT(Config::ServerCap::Workspace::WorkspaceFolders, supported, changeNotifications);
330334
REFLECT_STRUCT(Config::ServerCap::Workspace, workspaceFolders);
331335
REFLECT_STRUCT(Config::ServerCap, documentOnTypeFormattingProvider, foldingRangeProvider, workspace);
332-
REFLECT_STRUCT(Config::Clang, excludeArgs, extraArgs, pathMappings, resourceDir);
336+
REFLECT_STRUCT(Config::Clang, excludeArgs, prependArgs, extraArgs, pathMappings, resourceDir);
333337
REFLECT_STRUCT(Config::ClientCapability, diagnosticsRelatedInformation, hierarchicalDocumentSymbolSupport, linkSupport,
334338
snippetSupport);
335339
REFLECT_STRUCT(Config::CodeLens, localVariables);

src/project.cc

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -490,14 +490,22 @@ Project::Entry Project::findEntry(const std::string &path, bool can_redirect, bo
490490
for (const std::string &arg : g_config->clang.extraArgs)
491491
ret.args.push_back(intern(arg));
492492
ret.args.push_back(intern("-working-directory=" + ret.directory));
493+
if (g_config->clang.prependArgs.size()) {
494+
std::vector<const char *> args;
495+
for (StringRef arg : g_config->clang.prependArgs)
496+
args.push_back(intern(arg));
497+
ret.args.insert(ret.args.begin() + 1, args.begin(), args.end());
498+
}
493499
return ret;
494500
}
495501

496502
void Project::index(WorkingFiles *wfiles, const RequestId &id) {
497503
auto &gi = g_config->index;
498504
GroupMatch match(gi.whitelist, gi.blacklist), match_i(gi.initialWhitelist, gi.initialBlacklist);
499-
std::vector<const char *> args, extra_args;
500-
for (const std::string &arg : g_config->clang.extraArgs)
505+
std::vector<const char *> args, prepend_args, extra_args;
506+
for (StringRef arg : g_config->clang.prependArgs)
507+
prepend_args.push_back(intern(arg));
508+
for (StringRef arg : g_config->clang.extraArgs)
501509
extra_args.push_back(intern(arg));
502510
{
503511
std::lock_guard lock(mtx);
@@ -510,6 +518,7 @@ void Project::index(WorkingFiles *wfiles, const RequestId &id) {
510518
args = entry.args;
511519
args.insert(args.end(), extra_args.begin(), extra_args.end());
512520
args.push_back(intern("-working-directory=" + entry.directory));
521+
args.insert(args.begin() + 1, prepend_args.begin(), prepend_args.end());
513522
pipeline::index(entry.filename, args, interactive ? IndexMode::Normal : IndexMode::Background, false, id);
514523
} else {
515524
LOG_V(1) << "[" << i << "/" << folder.entries.size() << "]: " << reason << "; skip " << entry.filename;
@@ -529,8 +538,10 @@ void Project::indexRelated(const std::string &path) {
529538
auto &gi = g_config->index;
530539
GroupMatch match(gi.whitelist, gi.blacklist);
531540
StringRef stem = sys::path::stem(path);
532-
std::vector<const char *> args, extra_args;
533-
for (const std::string &arg : g_config->clang.extraArgs)
541+
std::vector<const char *> args, prepend_args, extra_args;
542+
for (StringRef arg : g_config->clang.prependArgs)
543+
prepend_args.push_back(intern(arg));
544+
for (StringRef arg : g_config->clang.extraArgs)
534545
extra_args.push_back(intern(arg));
535546
std::lock_guard lock(mtx);
536547
for (auto &[root, folder] : root2folder)
@@ -540,6 +551,7 @@ void Project::indexRelated(const std::string &path) {
540551
args = entry.args;
541552
args.insert(args.end(), extra_args.begin(), extra_args.end());
542553
args.push_back(intern("-working-directory=" + entry.directory));
554+
args.insert(args.begin() + 1, prepend_args.begin(), prepend_args.end());
543555
if (sys::path::stem(entry.filename) == stem && entry.filename != path && match.matches(entry.filename, &reason))
544556
pipeline::index(entry.filename, args, IndexMode::Background, true);
545557
}

0 commit comments

Comments
 (0)