diff options
Diffstat (limited to 'Source/cmInstallImportedRuntimeArtifactsGenerator.cxx')
-rw-r--r-- | Source/cmInstallImportedRuntimeArtifactsGenerator.cxx | 146 |
1 files changed, 146 insertions, 0 deletions
diff --git a/Source/cmInstallImportedRuntimeArtifactsGenerator.cxx b/Source/cmInstallImportedRuntimeArtifactsGenerator.cxx new file mode 100644 index 000000000..01980ac1a --- /dev/null +++ b/Source/cmInstallImportedRuntimeArtifactsGenerator.cxx @@ -0,0 +1,146 @@ +/* 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 <cassert> +#include <string> +#include <utility> +#include <vector> + +#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<std::string> 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<std::string> 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; + } +} |