diff options
author | Brad King <brad.king@kitware.com> | 2014-02-21 16:47:34 -0500 |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2014-02-21 17:05:26 -0500 |
commit | 6e89c8a5f1d5aa9bffa95be2b1add8d2c4e55026 (patch) | |
tree | cc732c0ab42e7435005ac0c51f71b765f28b828e /Source | |
parent | f11f7b34a8e77c3bd68578f00b57e0884cb0d872 (diff) | |
download | cmake-6e89c8a5f1d5aa9bffa95be2b1add8d2c4e55026.tar.gz |
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.
Diffstat (limited to 'Source')
-rw-r--r-- | Source/cmInstallCommand.cxx | 5 | ||||
-rw-r--r-- | Source/cmInstallFilesCommand.cxx | 3 | ||||
-rw-r--r-- | Source/cmInstallFilesGenerator.cxx | 51 | ||||
-rw-r--r-- | Source/cmInstallFilesGenerator.h | 5 | ||||
-rw-r--r-- | Source/cmInstallProgramsCommand.cxx | 3 |
5 files changed, 60 insertions, 7 deletions
diff --git a/Source/cmInstallCommand.cxx b/Source/cmInstallCommand.cxx index f4fbb8a65c..0878aae59c 100644 --- a/Source/cmInstallCommand.cxx +++ b/Source/cmInstallCommand.cxx @@ -1355,7 +1355,8 @@ bool cmInstallCommand::MakeFilesFullPath(const char* modeName, ++fileIt) { std::string file = (*fileIt); - if(!cmSystemTools::FileIsFullPath(file.c_str())) + std::string::size_type gpos = cmGeneratorExpression::Find(file); + if(gpos != 0 && !cmSystemTools::FileIsFullPath(file.c_str())) { file = this->Makefile->GetCurrentDirectory(); file += "/"; @@ -1363,7 +1364,7 @@ bool cmInstallCommand::MakeFilesFullPath(const char* modeName, } // Make sure the file is not a directory. - if(cmSystemTools::FileIsDirectory(file.c_str())) + if(gpos == file.npos && cmSystemTools::FileIsDirectory(file.c_str())) { cmOStringStream e; e << modeName << " given directory \"" << (*fileIt) << "\" to install."; diff --git a/Source/cmInstallFilesCommand.cxx b/Source/cmInstallFilesCommand.cxx index 32e463b28c..488d4863bc 100644 --- a/Source/cmInstallFilesCommand.cxx +++ b/Source/cmInstallFilesCommand.cxx @@ -148,7 +148,8 @@ void cmInstallFilesCommand::CreateInstallGenerator() const */ std::string cmInstallFilesCommand::FindInstallSource(const char* name) const { - if(cmSystemTools::FileIsFullPath(name)) + if(cmSystemTools::FileIsFullPath(name) || + cmGeneratorExpression::Find(name) == 0) { // This is a full path. return name; diff --git a/Source/cmInstallFilesGenerator.cxx b/Source/cmInstallFilesGenerator.cxx index 506dcbf467..ec15044c74 100644 --- a/Source/cmInstallFilesGenerator.cxx +++ b/Source/cmInstallFilesGenerator.cxx @@ -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); +} diff --git a/Source/cmInstallFilesGenerator.h b/Source/cmInstallFilesGenerator.h index 02b005e5a5..9dea296d23 100644 --- a/Source/cmInstallFilesGenerator.h +++ b/Source/cmInstallFilesGenerator.h @@ -34,6 +34,11 @@ public: protected: virtual void GenerateScriptActions(std::ostream& os, Indent const& indent); + virtual void GenerateScriptForConfig(std::ostream& os, + const char* config, + Indent const& indent); + void AddFilesInstallRule(std::ostream& os, Indent const& indent, + std::vector<std::string> const& files); cmMakefile* Makefile; std::vector<std::string> Files; diff --git a/Source/cmInstallProgramsCommand.cxx b/Source/cmInstallProgramsCommand.cxx index 9f2945f163..54d903ae69 100644 --- a/Source/cmInstallProgramsCommand.cxx +++ b/Source/cmInstallProgramsCommand.cxx @@ -109,7 +109,8 @@ void cmInstallProgramsCommand::FinalPass() std::string cmInstallProgramsCommand ::FindInstallSource(const char* name) const { - if(cmSystemTools::FileIsFullPath(name)) + if(cmSystemTools::FileIsFullPath(name) || + cmGeneratorExpression::Find(name) == 0) { // This is a full path. return name; |