You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
147 lines
5.7 KiB
147 lines
5.7 KiB
3 years ago
|
/* 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;
|
||
|
}
|
||
|
}
|