summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2017-04-10 14:48:57 -0400
committerBrad King <brad.king@kitware.com>2017-04-11 10:09:57 -0400
commit22829a130482511f8310caf74e190baee7ec763b (patch)
treefe2846f08b0578fccb7f6cde3421c06f6be8efd3
parent0419ecbcad7719614349a07189b45e341a8f2c69 (diff)
downloadcmake-22829a130482511f8310caf74e190baee7ec763b.tar.gz
cmMakefile: Create an explicit "Object Libraries" source group
The generators should not need special logic to place object library object files in this group.
-rw-r--r--Source/cmGeneratorExpressionNode.cxx10
-rw-r--r--Source/cmMakefile.cxx16
-rw-r--r--Source/cmMakefile.h4
3 files changed, 25 insertions, 5 deletions
diff --git a/Source/cmGeneratorExpressionNode.cxx b/Source/cmGeneratorExpressionNode.cxx
index 44434995f0..8b2c7aaa76 100644
--- a/Source/cmGeneratorExpressionNode.cxx
+++ b/Source/cmGeneratorExpressionNode.cxx
@@ -14,7 +14,6 @@
#include "cmMakefile.h"
#include "cmOutputConverter.h"
#include "cmPolicies.h"
-#include "cmSourceFile.h"
#include "cmStateTypes.h"
#include "cmSystemTools.h"
#include "cmTarget.h"
@@ -34,6 +33,8 @@
#include <string.h>
#include <utility>
+class cmSourceFile;
+
std::string cmGeneratorExpressionNode::EvaluateDependentExpression(
std::string const& prop, cmLocalGenerator* lg,
cmGeneratorExpressionContext* context, cmGeneratorTarget const* headTarget,
@@ -1265,6 +1266,8 @@ static const struct TargetObjectsNode : public cmGeneratorExpressionNode
gt->LocalGenerator->ComputeObjectFilenames(mapping, gt);
+ cmMakefile* mf = context->LG->GetMakefile();
+
std::string obj_dir = gt->ObjectDirectory;
std::string result;
const char* sep = "";
@@ -1278,10 +1281,7 @@ static const struct TargetObjectsNode : public cmGeneratorExpressionNode
assert(!map_it->second.empty());
result += sep;
std::string objFile = obj_dir + map_it->second;
- cmSourceFile* sf =
- context->LG->GetMakefile()->GetOrCreateSource(objFile, true);
- sf->SetObjectLibrary(tgtName);
- sf->SetProperty("EXTERNAL_OBJECT", "1");
+ mf->AddTargetObject(tgtName, objFile);
result += objFile;
sep = ";";
}
diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx
index f7d822ac8c..9c68ccfbbf 100644
--- a/Source/cmMakefile.cxx
+++ b/Source/cmMakefile.cxx
@@ -94,6 +94,10 @@ cmMakefile::cmMakefile(cmGlobalGenerator* globalGenerator,
this->AddSourceGroup("CMake Rules", "\\.rule$");
this->AddSourceGroup("Resources", "\\.plist$");
this->AddSourceGroup("Object Files", "\\.(lo|o|obj)$");
+
+ this->ObjectLibrariesSourceGroupIndex = this->SourceGroups.size();
+ this->SourceGroups.push_back(
+ cmSourceGroup("Object Libraries", "^MATCH_NO_SOURCES$"));
#endif
}
@@ -3124,6 +3128,18 @@ cmSourceFile* cmMakefile::GetOrCreateSource(const std::string& sourceName,
return this->CreateSource(sourceName, generated);
}
+void cmMakefile::AddTargetObject(std::string const& tgtName,
+ std::string const& objFile)
+{
+ cmSourceFile* sf = this->GetOrCreateSource(objFile, true);
+ sf->SetObjectLibrary(tgtName);
+ sf->SetProperty("EXTERNAL_OBJECT", "1");
+#if defined(CMAKE_BUILD_WITH_CMAKE)
+ this->SourceGroups[this->ObjectLibrariesSourceGroupIndex].AddGroupFile(
+ sf->GetFullPath());
+#endif
+}
+
void cmMakefile::EnableLanguage(std::vector<std::string> const& lang,
bool optional)
{
diff --git a/Source/cmMakefile.h b/Source/cmMakefile.h
index 4e48c8888b..03a22fd8c5 100644
--- a/Source/cmMakefile.h
+++ b/Source/cmMakefile.h
@@ -9,6 +9,7 @@
#include <map>
#include <set>
#include <stack>
+#include <stddef.h>
#include <string>
#include <vector>
@@ -406,6 +407,8 @@ public:
cmSourceFile* GetOrCreateSource(const std::string& sourceName,
bool generated = false);
+ void AddTargetObject(std::string const& tgtName, std::string const& objFile);
+
/**
* Given a variable name, return its value (as a string).
* If the variable is not found in this makefile instance, the
@@ -817,6 +820,7 @@ protected:
#if defined(CMAKE_BUILD_WITH_CMAKE)
std::vector<cmSourceGroup> SourceGroups;
+ size_t ObjectLibrariesSourceGroupIndex;
#endif
std::vector<cmCommand*> FinalPassCommands;