/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying file Copyright.txt or https://cmake.org/licensing for details. */ #include "cmExportInstallAndroidMKGenerator.h" #include #include #include #include #include "cmExportSet.h" #include "cmGeneratorExpression.h" #include "cmGeneratorTarget.h" #include "cmInstallExportGenerator.h" #include "cmInstallTargetGenerator.h" #include "cmPolicies.h" #include "cmStateTypes.h" #include "cmStringAlgorithms.h" #include "cmSystemTools.h" #include "cmTarget.h" #include "cmTargetExport.h" cmExportInstallAndroidMKGenerator::cmExportInstallAndroidMKGenerator( cmInstallExportGenerator* iegen) : cmExportInstallFileGenerator(iegen) { } void cmExportInstallAndroidMKGenerator::ReportDuplicateTarget( std::string const& targetName) const { std::ostringstream e; e << "install(EXPORT_ANDROID_MK \"" << this->GetExportSet()->GetName() << "\" ...) " << "includes target \"" << targetName << "\" more than once in the export set."; this->ReportError(e.str()); } bool cmExportInstallAndroidMKGenerator::GenerateMainFile(std::ostream& os) { std::vector 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; } bool const newCMP0022Behavior = gt->GetPolicyStatusCMP0022() != cmPolicies::WARN && gt->GetPolicyStatusCMP0022() != cmPolicies::OLD; if (newCMP0022Behavior) { 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 const& te : this->IEGen->GetExportSet()->GetTargetExports()) { // Collect import properties for this target. if (te->Target->GetType() == cmStateEnums::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, cmStateEnums::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"; }