summaryrefslogtreecommitdiffstats
path: root/Source/cmLocalGhsMultiGenerator.cxx
diff options
context:
space:
mode:
authorFred Baksik <frodak17@gmail.com>2019-01-05 16:01:22 (GMT)
committerFred Baksik <frodak17@gmail.com>2019-01-16 15:41:42 (GMT)
commit73092b2213495e06ef2ecfbf5fcca850874d6c88 (patch)
treeac8a1d2adfad15daa9dd760d55dc87a4b4890a8d /Source/cmLocalGhsMultiGenerator.cxx
parent14f3ba205989a422f1668073a325b057cece0b32 (diff)
downloadCMake-73092b2213495e06ef2ecfbf5fcca850874d6c88.zip
CMake-73092b2213495e06ef2ecfbf5fcca850874d6c88.tar.gz
CMake-73092b2213495e06ef2ecfbf5fcca850874d6c88.tar.bz2
GHS: Add support for object libraries
Diffstat (limited to 'Source/cmLocalGhsMultiGenerator.cxx')
-rw-r--r--Source/cmLocalGhsMultiGenerator.cxx42
1 files changed, 42 insertions, 0 deletions
diff --git a/Source/cmLocalGhsMultiGenerator.cxx b/Source/cmLocalGhsMultiGenerator.cxx
index b539a1c..125e8b5 100644
--- a/Source/cmLocalGhsMultiGenerator.cxx
+++ b/Source/cmLocalGhsMultiGenerator.cxx
@@ -7,6 +7,7 @@
#include "cmGhsMultiTargetGenerator.h"
#include "cmGlobalGhsMultiGenerator.h"
#include "cmMakefile.h"
+#include "cmSourceFile.h"
cmLocalGhsMultiGenerator::cmLocalGhsMultiGenerator(cmGlobalGenerator* gg,
cmMakefile* mf)
@@ -56,3 +57,44 @@ void cmLocalGhsMultiGenerator::Generate()
}
}
}
+
+void cmLocalGhsMultiGenerator::ComputeObjectFilenames(
+ std::map<cmSourceFile const*, std::string>& mapping,
+ cmGeneratorTarget const* gt)
+{
+ std::string dir_max;
+ dir_max += this->GetCurrentBinaryDirectory();
+ dir_max += "/";
+ dir_max += this->GetTargetDirectory(gt);
+ dir_max += "/";
+
+ // Count the number of object files with each name. Note that
+ // filesystem may not be case sensitive.
+ std::map<std::string, int> counts;
+
+ for (auto const& si : mapping) {
+ cmSourceFile const* sf = si.first;
+ std::string objectNameLower = cmSystemTools::LowerCase(
+ cmSystemTools::GetFilenameWithoutLastExtension(sf->GetFullPath()));
+ objectNameLower += this->GlobalGenerator->GetLanguageOutputExtension(*sf);
+ counts[objectNameLower] += 1;
+ }
+
+ // For all source files producing duplicate names we need unique
+ // object name computation.
+ for (auto& si : mapping) {
+ cmSourceFile const* sf = si.first;
+ std::string objectName =
+ cmSystemTools::GetFilenameWithoutLastExtension(sf->GetFullPath());
+ objectName += this->GlobalGenerator->GetLanguageOutputExtension(*sf);
+
+ if (counts[cmSystemTools::LowerCase(objectName)] > 1) {
+ const_cast<cmGeneratorTarget*>(gt)->AddExplicitObjectName(sf);
+ bool keptSourceExtension;
+ objectName = this->GetObjectFileNameWithoutTarget(*sf, dir_max,
+ &keptSourceExtension);
+ cmsys::SystemTools::ReplaceString(objectName, "/", "_");
+ }
+ si.second = objectName;
+ }
+}