|
|
@@ -7,9 +7,13 @@
|
|
|
#include <chrono>
|
|
|
#include <ctime>
|
|
|
#include <iomanip>
|
|
|
+#include <iterator>
|
|
|
#include <sstream>
|
|
|
#include <utility>
|
|
|
|
|
|
+#include <cm/optional>
|
|
|
+#include <cmext/string_view>
|
|
|
+
|
|
|
#include "cmsys/Directory.hxx"
|
|
|
#include "cmsys/FStream.hxx"
|
|
|
|
|
|
@@ -29,7 +33,12 @@ cmFileAPI::cmFileAPI(cmake* cm)
|
|
|
: CMakeInstance(cm)
|
|
|
{
|
|
|
this->APIv1 =
|
|
|
- this->CMakeInstance->GetHomeOutputDirectory() + "/.cmake/api/v1";
|
|
|
+ cmStrCat(this->CMakeInstance->GetHomeOutputDirectory(), "/.cmake/api/v1");
|
|
|
+
|
|
|
+ if (cm::optional<std::string> cmakeConfigDir =
|
|
|
+ cmSystemTools::GetCMakeConfigDirectory()) {
|
|
|
+ this->UserAPIv1 = cmStrCat(std::move(*cmakeConfigDir), "/api/v1"_s);
|
|
|
+ }
|
|
|
|
|
|
Json::CharReaderBuilder rbuilder;
|
|
|
rbuilder["collectComments"] = false;
|
|
|
@@ -47,14 +56,24 @@ cmFileAPI::cmFileAPI(cmake* cm)
|
|
|
|
|
|
void cmFileAPI::ReadQueries()
|
|
|
{
|
|
|
- std::string const query_dir = this->APIv1 + "/query";
|
|
|
+ std::string const query_dir = cmStrCat(this->APIv1, "/query");
|
|
|
+ std::string const user_query_dir = cmStrCat(this->UserAPIv1, "/query");
|
|
|
this->QueryExists = cmSystemTools::FileIsDirectory(query_dir);
|
|
|
+ if (!this->UserAPIv1.empty()) {
|
|
|
+ this->QueryExists =
|
|
|
+ this->QueryExists || cmSystemTools::FileIsDirectory(user_query_dir);
|
|
|
+ }
|
|
|
if (!this->QueryExists) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
// Load queries at the top level.
|
|
|
std::vector<std::string> queries = cmFileAPI::LoadDir(query_dir);
|
|
|
+ if (!this->UserAPIv1.empty()) {
|
|
|
+ std::vector<std::string> user_queries = cmFileAPI::LoadDir(user_query_dir);
|
|
|
+ std::move(user_queries.begin(), user_queries.end(),
|
|
|
+ std::back_inserter(queries));
|
|
|
+ }
|
|
|
|
|
|
// Read the queries and save for later.
|
|
|
for (std::string& query : queries) {
|