/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying file Copyright.txt or https://cmake.org/licensing for details. */ #include "cmInstallDirectoryGenerator.h" #include #include "cmGeneratorExpression.h" #include "cmInstallType.h" #include "cmList.h" #include "cmListFileCache.h" #include "cmLocalGenerator.h" #include "cmMakefile.h" #include "cmStringAlgorithms.h" #include "cmSystemTools.h" cmInstallDirectoryGenerator::cmInstallDirectoryGenerator( std::vector const& dirs, std::string const& dest, std::string file_permissions, std::string dir_permissions, std::vector const& configurations, std::string const& component, MessageLevel message, bool exclude_from_all, std::string literal_args, bool optional, cmListFileBacktrace backtrace) : cmInstallGenerator(dest, configurations, component, message, exclude_from_all, false, std::move(backtrace)) , Directories(dirs) , FilePermissions(std::move(file_permissions)) , DirPermissions(std::move(dir_permissions)) , LiteralArguments(std::move(literal_args)) , Optional(optional) { // We need per-config actions if destination have generator expressions. if (cmGeneratorExpression::Find(this->Destination) != std::string::npos) { this->ActionsPerConfig = true; } // We need per-config actions if any directories have generator expressions. if (!this->ActionsPerConfig) { for (std::string const& dir : dirs) { if (cmGeneratorExpression::Find(dir) != std::string::npos) { this->ActionsPerConfig = true; break; } } } } cmInstallDirectoryGenerator::~cmInstallDirectoryGenerator() = default; bool cmInstallDirectoryGenerator::Compute(cmLocalGenerator* lg) { this->LocalGenerator = lg; return true; } std::vector cmInstallDirectoryGenerator::GetDirectories( std::string const& config) const { cmList directories; if (this->ActionsPerConfig) { for (std::string const& f : this->Directories) { directories.append( cmGeneratorExpression::Evaluate(f, this->LocalGenerator, config)); } } else { directories = this->Directories; } return std::move(directories.data()); } void cmInstallDirectoryGenerator::GenerateScriptActions(std::ostream& os, Indent indent) { if (this->ActionsPerConfig) { this->cmInstallGenerator::GenerateScriptActions(os, indent); } else { this->AddDirectoryInstallRule(os, "", indent, this->Directories); } } void cmInstallDirectoryGenerator::GenerateScriptForConfig( std::ostream& os, const std::string& config, Indent indent) { std::vector dirs = this->GetDirectories(config); // Make sure all dirs have absolute paths. cmMakefile const& mf = *this->LocalGenerator->GetMakefile(); for (std::string& d : dirs) { if (!cmSystemTools::FileIsFullPath(d)) { d = cmStrCat(mf.GetCurrentSourceDirectory(), "/", d); } } this->AddDirectoryInstallRule(os, config, indent, dirs); } void cmInstallDirectoryGenerator::AddDirectoryInstallRule( std::ostream& os, const std::string& config, Indent indent, std::vector const& dirs) { // Write code to install the directories. const char* no_rename = nullptr; this->AddInstallRule(os, this->GetDestination(config), cmInstallType_DIRECTORY, dirs, this->Optional, this->FilePermissions.c_str(), this->DirPermissions.c_str(), no_rename, this->LiteralArguments.c_str(), indent); } std::string cmInstallDirectoryGenerator::GetDestination( std::string const& config) const { return cmGeneratorExpression::Evaluate(this->Destination, this->LocalGenerator, config); }