install: Support generator expressions in FILES and PROGRAMS mode

Teach the install(FILES) and install(PROGRAMS) commands to evaluate
generator expressions in the list of files.

Extend the ExportImport test to cover installation cases involving
generator expressions.
This commit is contained in:
Brad King
2014-02-21 16:47:34 -05:00
parent f11f7b34a8
commit 6e89c8a5f1
12 changed files with 105 additions and 7 deletions
+48 -3
View File
@@ -11,6 +11,9 @@
============================================================================*/
#include "cmInstallFilesGenerator.h"
#include "cmGeneratorExpression.h"
#include "cmSystemTools.h"
//----------------------------------------------------------------------------
cmInstallFilesGenerator
::cmInstallFilesGenerator(cmMakefile* mf,
@@ -27,6 +30,15 @@ cmInstallFilesGenerator
FilePermissions(file_permissions),
Rename(rename), Optional(optional)
{
// We need per-config actions if any files have generator expressions.
for(std::vector<std::string>::const_iterator i = files.begin();
!this->ActionsPerConfig && i != files.end(); ++i)
{
if(cmGeneratorExpression::Find(*i) != std::string::npos)
{
this->ActionsPerConfig = true;
}
}
}
//----------------------------------------------------------------------------
@@ -36,8 +48,9 @@ cmInstallFilesGenerator
}
//----------------------------------------------------------------------------
void cmInstallFilesGenerator::GenerateScriptActions(std::ostream& os,
Indent const& indent)
void cmInstallFilesGenerator::AddFilesInstallRule(
std::ostream& os, Indent const& indent,
std::vector<std::string> const& files)
{
// Write code to install the files.
const char* no_dir_permissions = 0;
@@ -45,8 +58,40 @@ void cmInstallFilesGenerator::GenerateScriptActions(std::ostream& os,
(this->Programs
? cmInstallType_PROGRAMS
: cmInstallType_FILES),
this->Files,
files,
this->Optional,
this->FilePermissions.c_str(), no_dir_permissions,
this->Rename.c_str(), 0, indent);
}
//----------------------------------------------------------------------------
void cmInstallFilesGenerator::GenerateScriptActions(std::ostream& os,
Indent const& indent)
{
if(this->ActionsPerConfig)
{
this->cmInstallGenerator::GenerateScriptActions(os, indent);
}
else
{
this->AddFilesInstallRule(os, indent, this->Files);
}
}
//----------------------------------------------------------------------------
void cmInstallFilesGenerator::GenerateScriptForConfig(std::ostream& os,
const char* config,
Indent const& indent)
{
std::vector<std::string> files;
cmListFileBacktrace lfbt;
cmGeneratorExpression ge(lfbt);
for(std::vector<std::string>::const_iterator i = this->Files.begin();
i != this->Files.end(); ++i)
{
cmsys::auto_ptr<cmCompiledGeneratorExpression> cge = ge.Parse(*i);
cmSystemTools::ExpandListArgument(cge->Evaluate(this->Makefile, config),
files);
}
this->AddFilesInstallRule(os, indent, files);
}