| /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying | |
| file Copyright.txt or https://cmake.org/licensing for details. */ | |
| #include "cmLocalGhsMultiGenerator.h" | |
| #include <utility> | |
| #include <vector> | |
| #include "cmGeneratorTarget.h" | |
| #include "cmGhsMultiTargetGenerator.h" | |
| #include "cmGlobalGenerator.h" | |
| #include "cmSourceFile.h" | |
| #include "cmStringAlgorithms.h" | |
| #include "cmSystemTools.h" | |
| cmLocalGhsMultiGenerator::cmLocalGhsMultiGenerator(cmGlobalGenerator* gg, | |
| cmMakefile* mf) | |
| : cmLocalGenerator(gg, mf) | |
| { | |
| } | |
| cmLocalGhsMultiGenerator::~cmLocalGhsMultiGenerator() = default; | |
| std::string cmLocalGhsMultiGenerator::GetTargetDirectory( | |
| cmGeneratorTarget const* target) const | |
| { | |
| std::string dir = cmStrCat(target->GetName(), ".dir"); | |
| return dir; | |
| } | |
| void cmLocalGhsMultiGenerator::Generate() | |
| { | |
| for (cmGeneratorTarget* gt : | |
| this->GlobalGenerator->GetLocalGeneratorTargetsInOrder(this)) { | |
| if (!gt->IsInBuildSystem()) { | |
| continue; | |
| } | |
| cmGhsMultiTargetGenerator tg(gt); | |
| tg.Generate(); | |
| } | |
| } | |
| void cmLocalGhsMultiGenerator::ComputeObjectFilenames( | |
| std::map<cmSourceFile const*, std::string>& mapping, | |
| cmGeneratorTarget const* gt) | |
| { | |
| std::string dir_max = cmStrCat(this->GetCurrentBinaryDirectory(), '/', | |
| this->GetTargetDirectory(gt), '/'); | |
| // 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 = cmStrCat( | |
| cmSystemTools::LowerCase( | |
| cmSystemTools::GetFilenameWithoutLastExtension(sf->GetFullPath())), | |
| 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 = cmStrCat( | |
| cmSystemTools::GetFilenameWithoutLastExtension(sf->GetFullPath()), | |
| 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; | |
| } | |
| } |