blob: 01980ac1a23b788022c8331c1fde9030a27120d4 [file] [log] [blame]
/* 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;
}
}