mirror of
https://github.com/MaskRay/ccls.git
synced 2024-11-26 09:31:59 +00:00
Support an optional compilation database dir at initialization
This commit is contained in:
parent
6f6cd4ea7f
commit
3cee3cb775
@ -1462,10 +1462,6 @@ bool QueryDbMainLoop(Config* config,
|
|||||||
LOG_S(FATAL) << "Exiting; no cache directory";
|
LOG_S(FATAL) << "Exiting; no cache directory";
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
// Make sure compile commands directory is valid.
|
|
||||||
if (config->compileCommandsDirectory.empty()) {
|
|
||||||
config->compileCommandsDirectory = project_path;
|
|
||||||
}
|
|
||||||
|
|
||||||
config->cacheDirectory = NormalizePath(config->cacheDirectory);
|
config->cacheDirectory = NormalizePath(config->cacheDirectory);
|
||||||
EnsureEndsInSlash(config->cacheDirectory);
|
EnsureEndsInSlash(config->cacheDirectory);
|
||||||
@ -1571,8 +1567,9 @@ bool QueryDbMainLoop(Config* config,
|
|||||||
Timer time;
|
Timer time;
|
||||||
|
|
||||||
// Open up / load the project.
|
// Open up / load the project.
|
||||||
project->Load(config->extraClangArguments, config->compileCommandsDirectory,
|
project->Load(config->extraClangArguments,
|
||||||
config->resourceDirectory);
|
config->compilationDatabaseDirectory,
|
||||||
|
project_path, config->resourceDirectory);
|
||||||
time.ResetAndPrint("[perf] Loaded compilation entries (" +
|
time.ResetAndPrint("[perf] Loaded compilation entries (" +
|
||||||
std::to_string(project->entries.size()) +
|
std::to_string(project->entries.size()) +
|
||||||
" files)");
|
" files)");
|
||||||
|
@ -8,7 +8,7 @@ struct Config {
|
|||||||
// Root directory of the project. **Not serialized**
|
// Root directory of the project. **Not serialized**
|
||||||
std::string projectRoot;
|
std::string projectRoot;
|
||||||
// Location of compile_commands.json.
|
// Location of compile_commands.json.
|
||||||
std::string compileCommandsDirectory;
|
std::string compilationDatabaseDirectory;
|
||||||
// Cache directory for indexed files.
|
// Cache directory for indexed files.
|
||||||
std::string cacheDirectory;
|
std::string cacheDirectory;
|
||||||
// Value to use for clang -resource-dir if not present in
|
// Value to use for clang -resource-dir if not present in
|
||||||
@ -72,7 +72,7 @@ struct Config {
|
|||||||
bool enableSnippetInsertion = true;
|
bool enableSnippetInsertion = true;
|
||||||
};
|
};
|
||||||
MAKE_REFLECT_STRUCT(Config,
|
MAKE_REFLECT_STRUCT(Config,
|
||||||
compileCommandsDirectory,
|
compilationDatabaseDirectory,
|
||||||
cacheDirectory,
|
cacheDirectory,
|
||||||
resourceDirectory,
|
resourceDirectory,
|
||||||
|
|
||||||
|
@ -229,15 +229,19 @@ std::vector<Project::Entry> LoadFromDirectoryListing(ProjectConfig* config) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::vector<Project::Entry> LoadCompilationEntriesFromDirectory(
|
std::vector<Project::Entry> LoadCompilationEntriesFromDirectory(
|
||||||
ProjectConfig* config) {
|
ProjectConfig* config,
|
||||||
|
const std::string& compilationDatabaseDirectory) {
|
||||||
// Try to load compile_commands.json, but fallback to a project listing.
|
// Try to load compile_commands.json, but fallback to a project listing.
|
||||||
|
const auto& compilationDbDir = compilationDatabaseDirectory.empty()
|
||||||
|
? config->project_dir
|
||||||
|
: compilationDatabaseDirectory;
|
||||||
LOG_S(INFO) << "Trying to load compile_commands.json";
|
LOG_S(INFO) << "Trying to load compile_commands.json";
|
||||||
CXCompilationDatabase_Error cx_db_load_error;
|
CXCompilationDatabase_Error cx_db_load_error;
|
||||||
CXCompilationDatabase cx_db = clang_CompilationDatabase_fromDirectory(
|
CXCompilationDatabase cx_db = clang_CompilationDatabase_fromDirectory(
|
||||||
config->project_dir.c_str(), &cx_db_load_error);
|
compilationDbDir.c_str(), &cx_db_load_error);
|
||||||
if (cx_db_load_error == CXCompilationDatabase_CanNotLoadDatabase) {
|
if (cx_db_load_error == CXCompilationDatabase_CanNotLoadDatabase) {
|
||||||
LOG_S(INFO) << "Unable to load compile_commands.json located at \""
|
LOG_S(INFO) << "Unable to load compile_commands.json located at \""
|
||||||
<< config->project_dir
|
<< compilationDbDir
|
||||||
<< "\"; using directory listing instead.";
|
<< "\"; using directory listing instead.";
|
||||||
return LoadFromDirectoryListing(config);
|
return LoadFromDirectoryListing(config);
|
||||||
}
|
}
|
||||||
@ -339,14 +343,16 @@ int ComputeGuessScore(const std::string& a, const std::string& b) {
|
|||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
void Project::Load(const std::vector<std::string>& extra_flags,
|
void Project::Load(const std::vector<std::string>& extra_flags,
|
||||||
const std::string& directory,
|
const std::string& compilationDatabaseDirectory,
|
||||||
|
const std::string& rootDirectory,
|
||||||
const std::string& resource_directory) {
|
const std::string& resource_directory) {
|
||||||
// Load data.
|
// Load data.
|
||||||
ProjectConfig config;
|
ProjectConfig config;
|
||||||
config.extra_flags = extra_flags;
|
config.extra_flags = extra_flags;
|
||||||
config.project_dir = directory;
|
config.project_dir = rootDirectory;
|
||||||
config.resource_dir = resource_directory;
|
config.resource_dir = resource_directory;
|
||||||
entries = LoadCompilationEntriesFromDirectory(&config);
|
entries = LoadCompilationEntriesFromDirectory(&config,
|
||||||
|
compilationDatabaseDirectory);
|
||||||
|
|
||||||
// Cleanup / postprocess include directories.
|
// Cleanup / postprocess include directories.
|
||||||
quote_include_directories.assign(config.quote_dirs.begin(),
|
quote_include_directories.assign(config.quote_dirs.begin(),
|
||||||
|
@ -31,12 +31,15 @@ struct Project {
|
|||||||
|
|
||||||
// Loads a project for the given |directory|.
|
// Loads a project for the given |directory|.
|
||||||
//
|
//
|
||||||
// If |directory| contains a compile_commands.json file, that will be used to
|
// If |compilationDatabaseDirectory| is not empty, the compile_commands.json
|
||||||
// discover all files and args. Otherwise, a recursive directory listing of
|
// file in it will be used to discover all files and args. If it's empty and
|
||||||
// all *.cpp, *.cc, *.h, and *.hpp files will be used. clang arguments can be
|
// |directory| contains a compile_commands.json file, that one will be used
|
||||||
// specified in a clang_args file located inside of |directory|.
|
// instead. Otherwise, a recursive directory listing of all *.cpp, *.cc, *.h,
|
||||||
|
// and *.hpp files will be used. clang arguments can be specified in a
|
||||||
|
// clang_args file located inside of |directory|.
|
||||||
void Load(const std::vector<std::string>& extra_flags,
|
void Load(const std::vector<std::string>& extra_flags,
|
||||||
const std::string& directory,
|
const std::string& compilationDatabaseDirectory,
|
||||||
|
const std::string& rootDirectory,
|
||||||
const std::string& resource_directory);
|
const std::string& resource_directory);
|
||||||
|
|
||||||
// Lookup the CompilationEntry for |filename|. If no entry was found this
|
// Lookup the CompilationEntry for |filename|. If no entry was found this
|
||||||
|
Loading…
Reference in New Issue
Block a user