diff options
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 f4fbb8a..0878aae 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 32e463b..488d486 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 506dcbf..ec15044 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 02b005e..9dea296 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 9f2945f..54d903a 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; |