summaryrefslogtreecommitdiffstats
path: root/Source
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2023-05-22 16:35:17 (GMT)
committerKitware Robot <kwrobot@kitware.com>2023-05-22 16:35:28 (GMT)
commitdc4a53f49edbd8695c2d7638c90e53d7385f08a4 (patch)
tree4d2718d541e972ef9241ac70cbee864f5a0aff97 /Source
parentdabba15172012f4497c96eadbf69684fc2f597ee (diff)
parentb3a6a11e95f805ab7411d395bd426561cfb4d4d0 (diff)
downloadCMake-dc4a53f49edbd8695c2d7638c90e53d7385f08a4.zip
CMake-dc4a53f49edbd8695c2d7638c90e53d7385f08a4.tar.gz
CMake-dc4a53f49edbd8695c2d7638c90e53d7385f08a4.tar.bz2
Merge topic 'FileAPI-framework'
b3a6a11e95 fileapi: Extend codemodel targets/compileGroups with Apple frameworks Acked-by: Kitware Robot <kwrobot@kitware.com> Tested-by: buildbot <buildbot@kitware.com> Merge-request: !8489
Diffstat (limited to 'Source')
-rw-r--r--Source/cmFileAPI.cxx2
-rw-r--r--Source/cmFileAPICodemodel.cxx48
2 files changed, 44 insertions, 6 deletions
diff --git a/Source/cmFileAPI.cxx b/Source/cmFileAPI.cxx
index d1d3d25..8b98916 100644
--- a/Source/cmFileAPI.cxx
+++ b/Source/cmFileAPI.cxx
@@ -728,7 +728,7 @@ std::string cmFileAPI::NoSupportedVersion(
// The "codemodel" object kind.
// Update Help/manual/cmake-file-api.7.rst when updating this constant.
-static unsigned int const CodeModelV2Minor = 5;
+static unsigned int const CodeModelV2Minor = 6;
void cmFileAPI::BuildClientRequestCodeModel(
ClientRequest& r, std::vector<RequestVersion> const& versions)
diff --git a/Source/cmFileAPICodemodel.cxx b/Source/cmFileAPICodemodel.cxx
index 4a8716f..280ebb0 100644
--- a/Source/cmFileAPICodemodel.cxx
+++ b/Source/cmFileAPICodemodel.cxx
@@ -328,6 +328,7 @@ struct CompileData
std::vector<JBT<std::string>> Defines;
std::vector<JBT<std::string>> PrecompileHeaders;
std::vector<IncludeEntry> Includes;
+ std::vector<IncludeEntry> Frameworks;
friend bool operator==(CompileData const& l, CompileData const& r)
{
@@ -335,7 +336,7 @@ struct CompileData
l.Flags == r.Flags && l.Defines == r.Defines &&
l.PrecompileHeaders == r.PrecompileHeaders &&
l.LanguageStandard == r.LanguageStandard &&
- l.Includes == r.Includes);
+ l.Includes == r.Includes && l.Frameworks == r.Frameworks);
}
};
}
@@ -356,6 +357,12 @@ struct hash<CompileData>
hash<Json::ArrayIndex>()(i.Path.Backtrace.Index) ^
(i.IsSystem ? std::numeric_limits<size_t>::max() : 0));
}
+ for (auto const& i : in.Frameworks) {
+ result = result ^
+ (hash<std::string>()(i.Path.Value) ^
+ hash<Json::ArrayIndex>()(i.Path.Backtrace.Index) ^
+ (i.IsSystem ? std::numeric_limits<size_t>::max() : 0));
+ }
for (auto const& i : in.Flags) {
result = result ^ hash<std::string>()(i.Value) ^
hash<Json::ArrayIndex>()(i.Backtrace.Index);
@@ -468,6 +475,7 @@ class Target
Json::Value DumpPaths();
Json::Value DumpCompileData(CompileData const& cd);
Json::Value DumpInclude(CompileData::IncludeEntry const& inc);
+ Json::Value DumpFramework(CompileData::IncludeEntry const& fw);
Json::Value DumpPrecompileHeader(JBT<std::string> const& header);
Json::Value DumpLanguageStandard(JBTs<std::string> const& standard);
Json::Value DumpDefine(JBT<std::string> const& def);
@@ -1294,9 +1302,15 @@ void Target::ProcessLanguage(std::string const& lang)
std::vector<BT<std::string>> includePathList =
lg->GetIncludeDirectories(this->GT, lang, this->Config);
for (BT<std::string> const& i : includePathList) {
- cd.Includes.emplace_back(
- this->ToJBT(i),
- this->GT->IsSystemIncludeDirectory(i.Value, this->Config, lang));
+ if (this->GT->IsApple() && cmSystemTools::IsPathToFramework(i.Value)) {
+ cd.Frameworks.emplace_back(
+ this->ToJBT(i),
+ this->GT->IsSystemIncludeDirectory(i.Value, this->Config, lang));
+ } else {
+ cd.Includes.emplace_back(
+ this->ToJBT(i),
+ this->GT->IsSystemIncludeDirectory(i.Value, this->Config, lang));
+ }
}
std::vector<BT<std::string>> precompileHeaders =
this->GT->GetPrecompileHeaders(this->Config, lang);
@@ -1408,7 +1422,11 @@ CompileData Target::BuildCompileData(cmSourceFile* sf)
bool const isSystemInclude =
this->GT->IsSystemIncludeDirectory(i, this->Config, fd.Language);
BT<std::string> include(i, tmpInclude.Backtrace);
- fd.Includes.emplace_back(this->ToJBT(include), isSystemInclude);
+ if (this->GT->IsApple() && cmSystemTools::IsPathToFramework(i)) {
+ fd.Frameworks.emplace_back(this->ToJBT(include), isSystemInclude);
+ } else {
+ fd.Includes.emplace_back(this->ToJBT(include), isSystemInclude);
+ }
}
}
}
@@ -1481,6 +1499,13 @@ CompileData Target::MergeCompileData(CompileData const& fd)
cd.Includes.insert(cd.Includes.end(), td.Includes.begin(),
td.Includes.end());
+ // Use source-specific frameworks followed by target-wide frameworks.
+ cd.Frameworks.reserve(fd.Frameworks.size() + td.Frameworks.size());
+ cd.Frameworks.insert(cd.Frameworks.end(), fd.Frameworks.begin(),
+ fd.Frameworks.end());
+ cd.Frameworks.insert(cd.Frameworks.end(), td.Frameworks.begin(),
+ td.Frameworks.end());
+
// Use target-wide defines followed by source-specific defines.
cd.Defines.reserve(td.Defines.size() + fd.Defines.size());
cd.Defines.insert(cd.Defines.end(), td.Defines.begin(), td.Defines.end());
@@ -1696,6 +1721,13 @@ Json::Value Target::DumpCompileData(CompileData const& cd)
}
result["includes"] = includes;
}
+ if (!cd.Frameworks.empty()) {
+ Json::Value frameworks = Json::arrayValue;
+ for (auto const& i : cd.Frameworks) {
+ frameworks.append(this->DumpFramework(i));
+ }
+ result["frameworks"] = frameworks;
+ }
if (!cd.Defines.empty()) {
Json::Value defines = Json::arrayValue;
for (JBT<std::string> const& d : cd.Defines) {
@@ -1729,6 +1761,12 @@ Json::Value Target::DumpInclude(CompileData::IncludeEntry const& inc)
return include;
}
+Json::Value Target::DumpFramework(CompileData::IncludeEntry const& fw)
+{
+ // for now, idem as include
+ return this->DumpInclude(fw);
+}
+
Json::Value Target::DumpPrecompileHeader(JBT<std::string> const& header)
{
Json::Value precompileHeader = Json::objectValue;