/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying file Copyright.txt or https://cmake.org/licensing for details. */ #include "cmInstallImportedRuntimeArtifactsGenerator.h" #include #include #include #include #include "cmsys/RegularExpression.hxx" #include "cmGeneratorExpression.h" #include "cmGeneratorTarget.h" #include "cmGlobalGenerator.h" #include "cmInstallType.h" #include "cmListFileCache.h" #include "cmLocalGenerator.h" #include "cmStateTypes.h" #include "cmStringAlgorithms.h" namespace { const cmsys::RegularExpression FrameworkRegularExpression( "^(.*/)?([^/]*)\\.framework/(.*)$"); const cmsys::RegularExpression BundleRegularExpression( "^(.*/)?([^/]*)\\.app/(.*)$"); const cmsys::RegularExpression CFBundleRegularExpression( "^(.*/)?([^/]*)\\.bundle/(.*)$"); } cmInstallImportedRuntimeArtifactsGenerator:: cmInstallImportedRuntimeArtifactsGenerator( std::string targetName, std::string const& dest, std::string file_permissions, std::vector const& configurations, std::string const& component, MessageLevel message, bool exclude_from_all, bool optional, cmListFileBacktrace backtrace) : cmInstallGenerator(dest, configurations, component, message, exclude_from_all, false, std::move(backtrace)) , TargetName(std::move(targetName)) , FilePermissions(std::move(file_permissions)) , Optional(optional) { this->ActionsPerConfig = true; } bool cmInstallImportedRuntimeArtifactsGenerator::Compute(cmLocalGenerator* lg) { // Lookup this target in the current directory. this->Target = lg->FindGeneratorTargetToUse(this->TargetName); if (!this->Target || !this->Target->IsImported()) { // If no local target has been found, find it in the global scope. this->Target = lg->GetGlobalGenerator()->FindGeneratorTarget(this->TargetName); } return true; } std::string cmInstallImportedRuntimeArtifactsGenerator::GetDestination( std::string const& config) const { return cmGeneratorExpression::Evaluate( this->Destination, this->Target->GetLocalGenerator(), config); } void cmInstallImportedRuntimeArtifactsGenerator::GenerateScriptForConfig( std::ostream& os, const std::string& config, Indent indent) { auto location = this->Target->GetFullPath(config); switch (this->Target->GetType()) { case cmStateEnums::EXECUTABLE: if (this->Target->IsBundleOnApple()) { cmsys::RegularExpressionMatch match; if (BundleRegularExpression.find(location.c_str(), match)) { auto bundleDir = match.match(1); auto bundleName = match.match(2); auto bundlePath = cmStrCat(bundleDir, bundleName, ".app"); this->AddInstallRule(os, this->GetDestination(config), cmInstallType_DIRECTORY, { bundlePath }, this->Optional, nullptr, this->FilePermissions.c_str(), nullptr, " USE_SOURCE_PERMISSIONS", indent); } } else { this->AddInstallRule(os, this->GetDestination(config), cmInstallType_EXECUTABLE, { location }, this->Optional, this->FilePermissions.c_str(), nullptr, nullptr, nullptr, indent); } break; case cmStateEnums::SHARED_LIBRARY: if (this->Target->IsFrameworkOnApple()) { cmsys::RegularExpressionMatch match; if (FrameworkRegularExpression.find(location.c_str(), match)) { auto frameworkDir = match.match(1); auto frameworkName = match.match(2); auto frameworkPath = cmStrCat(frameworkDir, frameworkName, ".framework"); this->AddInstallRule(os, this->GetDestination(config), cmInstallType_DIRECTORY, { frameworkPath }, this->Optional, nullptr, this->FilePermissions.c_str(), nullptr, " USE_SOURCE_PERMISSIONS", indent); } } else { std::vector files{ location }; auto soName = this->Target->GetSOName(config); auto soNameFile = cmStrCat(this->Target->GetDirectory(config), '/', soName); if (!soName.empty() && soNameFile != location) { files.push_back(soNameFile); } this->AddInstallRule(os, this->GetDestination(config), cmInstallType_SHARED_LIBRARY, files, this->Optional, this->FilePermissions.c_str(), nullptr, nullptr, nullptr, indent); } break; case cmStateEnums::MODULE_LIBRARY: if (this->Target->IsCFBundleOnApple()) { cmsys::RegularExpressionMatch match; if (CFBundleRegularExpression.find(location.c_str(), match)) { auto bundleDir = match.match(1); auto bundleName = match.match(2); auto bundlePath = cmStrCat(bundleDir, bundleName, ".bundle"); this->AddInstallRule(os, this->GetDestination(config), cmInstallType_DIRECTORY, { bundlePath }, this->Optional, nullptr, this->FilePermissions.c_str(), nullptr, " USE_SOURCE_PERMISSIONS", indent); } } else { this->AddInstallRule(os, this->GetDestination(config), cmInstallType_MODULE_LIBRARY, { location }, this->Optional, this->FilePermissions.c_str(), nullptr, nullptr, nullptr, indent); } break; default: assert(false && "This should never happen"); break; } }