| /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying |
| file LICENSE.rst or https://cmake.org/licensing for details. */ |
| #include "cmLocalGhsMultiGenerator.h" |
| |
| #include <utility> |
| #include <vector> |
| |
| #include <cm/optional> |
| |
| #include "cmGeneratorTarget.h" |
| #include "cmGhsMultiTargetGenerator.h" |
| #include "cmGlobalGenerator.h" |
| #include "cmObjectLocation.h" |
| #include "cmSourceFile.h" |
| #include "cmStringAlgorithms.h" |
| #include "cmSystemTools.h" |
| |
| namespace cmStateEnums { |
| enum class IntermediateDirKind; |
| } |
| |
| cmLocalGhsMultiGenerator::cmLocalGhsMultiGenerator(cmGlobalGenerator* gg, |
| cmMakefile* mf) |
| : cmLocalGenerator(gg, mf) |
| { |
| } |
| |
| cmLocalGhsMultiGenerator::~cmLocalGhsMultiGenerator() = default; |
| |
| std::string cmLocalGhsMultiGenerator::GetTargetDirectory( |
| cmGeneratorTarget const* target, |
| cmStateEnums::IntermediateDirKind /*kind*/) 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*, cmObjectLocations>& mapping, |
| std::string const& config, cmGeneratorTarget const* gt) |
| { |
| std::string dir_max = cmStrCat(gt->GetSupportDirectory(), '/'); |
| |
| // 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 objectName; |
| auto customObjectName = this->GetCustomObjectFileName(*sf); |
| if (customObjectName.empty()) { |
| objectName = |
| cmSystemTools::GetFilenameWithoutLastExtension(sf->GetFullPath()); |
| } else { |
| objectName = std::move(customObjectName); |
| } |
| objectName += this->GlobalGenerator->GetLanguageOutputExtension(*sf); |
| std::string objectNameLower = cmSystemTools::LowerCase(objectName); |
| 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; |
| bool forceShortObjectName = true; |
| std::string shortObjectName = this->GetObjectFileNameWithoutTarget( |
| *sf, dir_max, nullptr, nullptr, &forceShortObjectName); |
| std::string longObjectName; |
| auto customObjectName = this->GetCustomObjectFileName(*sf); |
| if (customObjectName.empty()) { |
| longObjectName = |
| cmSystemTools::GetFilenameWithoutLastExtension(sf->GetFullPath()); |
| } else { |
| longObjectName = std::move(customObjectName); |
| const_cast<cmGeneratorTarget*>(gt)->AddExplicitObjectName(sf); |
| } |
| longObjectName += this->GlobalGenerator->GetLanguageOutputExtension(*sf); |
| |
| if (counts[cmSystemTools::LowerCase(longObjectName)] > 1) { |
| const_cast<cmGeneratorTarget*>(gt)->AddExplicitObjectName(sf); |
| forceShortObjectName = false; |
| longObjectName = this->GetObjectFileNameWithoutTarget( |
| *sf, dir_max, nullptr, nullptr, &forceShortObjectName); |
| cmsys::SystemTools::ReplaceString(longObjectName, "/", "_"); |
| } |
| si.second.ShortLoc.emplace(shortObjectName); |
| si.second.LongLoc.Update(longObjectName); |
| this->FillCustomInstallObjectLocations(*sf, config, nullptr, |
| si.second.InstallLongLoc); |
| } |
| } |