| /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying | |
| file LICENSE.rst or https://cmake.org/licensing for details. */ | |
| #include "cmExportInstallAndroidMKGenerator.h" | |
| #include <cstddef> | |
| #include <functional> | |
| #include <memory> | |
| #include <ostream> | |
| #include <vector> | |
| #include "cmExportSet.h" | |
| #include "cmGeneratorExpression.h" | |
| #include "cmGeneratorTarget.h" | |
| #include "cmInstallExportGenerator.h" | |
| #include "cmInstallTargetGenerator.h" | |
| #include "cmStringAlgorithms.h" | |
| #include "cmSystemTools.h" | |
| #include "cmTarget.h" | |
| #include "cmTargetExport.h" | |
| #include "cmTargetTypes.h" | |
| cmExportInstallAndroidMKGenerator::cmExportInstallAndroidMKGenerator( | |
| cmInstallExportGenerator* iegen) | |
| : cmExportInstallFileGenerator(iegen) | |
| { | |
| } | |
| void cmExportInstallAndroidMKGenerator::ReportDuplicateTarget( | |
| std::string const& targetName) const | |
| { | |
| this->ReportError(cmStrCat("install(EXPORT_ANDROID_MK \"", | |
| this->GetExportSet()->GetName(), | |
| "\" ...) includes target \"", targetName, | |
| "\" more than once in the export set.")); | |
| } | |
| bool cmExportInstallAndroidMKGenerator::GenerateMainFile(std::ostream& os) | |
| { | |
| std::vector<cmTargetExport const*> allTargets; | |
| { | |
| auto visitor = [&](cmTargetExport const* te) { allTargets.push_back(te); }; | |
| if (!this->CollectExports(visitor)) { | |
| return false; | |
| } | |
| } | |
| // Create all the imported targets. | |
| for (cmTargetExport const* te : allTargets) { | |
| cmGeneratorTarget const* gt = te->Target; | |
| this->GenerateImportTargetCode(os, gt, this->GetExportTargetType(te)); | |
| ImportPropertyMap properties; | |
| if (!this->PopulateInterfaceProperties(te, properties)) { | |
| return false; | |
| } | |
| this->PopulateInterfaceLinkLibrariesProperty( | |
| gt, cmGeneratorExpression::InstallInterface, properties); | |
| this->GenerateInterfaceProperties(gt, os, properties); | |
| } | |
| return true; | |
| } | |
| void cmExportInstallAndroidMKGenerator::GenerateImportHeaderCode( | |
| std::ostream& os, std::string const&) | |
| { | |
| std::string installDir = this->IEGen->GetDestination(); | |
| os << "LOCAL_PATH := $(call my-dir)\n"; | |
| size_t numDotDot = cmSystemTools::CountChar(installDir.c_str(), '/'); | |
| numDotDot += installDir.empty() ? 0 : 1; | |
| std::string path; | |
| for (size_t n = 0; n < numDotDot; n++) { | |
| path += "/.."; | |
| } | |
| os << "_IMPORT_PREFIX := $(LOCAL_PATH)" << path << "\n\n"; | |
| for (std::unique_ptr<cmTargetExport> const& te : | |
| this->IEGen->GetExportSet()->GetTargetExports()) { | |
| // Collect import properties for this target. | |
| if (te->Target->GetType() == cm::TargetType::INTERFACE_LIBRARY) { | |
| continue; | |
| } | |
| std::string dest; | |
| if (te->LibraryGenerator) { | |
| dest = te->LibraryGenerator->GetDestination(""); | |
| } | |
| if (te->ArchiveGenerator) { | |
| dest = te->ArchiveGenerator->GetDestination(""); | |
| } | |
| te->Target->Target->SetProperty("__dest", dest); | |
| } | |
| } | |
| void cmExportInstallAndroidMKGenerator::GenerateImportTargetCode( | |
| std::ostream& os, cmGeneratorTarget const* target, | |
| cm::TargetType /*targetType*/) | |
| { | |
| std::string targetName = cmStrCat(this->Namespace, target->GetExportName()); | |
| os << "include $(CLEAR_VARS)\n"; | |
| os << "LOCAL_MODULE := "; | |
| os << targetName << "\n"; | |
| os << "LOCAL_SRC_FILES := $(_IMPORT_PREFIX)/"; | |
| os << target->Target->GetSafeProperty("__dest") << "/"; | |
| std::string config; | |
| if (!this->Configurations.empty()) { | |
| config = this->Configurations[0]; | |
| } | |
| os << target->GetFullName(config) << "\n"; | |
| } |