diff options
-rw-r--r-- | Source/cmInstallTargetGenerator.cxx | 84 | ||||
-rw-r--r-- | Source/cmInstallTargetGenerator.h | 8 |
2 files changed, 37 insertions, 55 deletions
diff --git a/Source/cmInstallTargetGenerator.cxx b/Source/cmInstallTargetGenerator.cxx index 202fe4d..68dd586 100644 --- a/Source/cmInstallTargetGenerator.cxx +++ b/Source/cmInstallTargetGenerator.cxx @@ -57,16 +57,8 @@ void cmInstallTargetGenerator::GenerateScript(std::ostream& os) cmSystemTools::Message(msg.str().c_str(), "Warning"); } - // Track indentation. - Indent indent; - - // Begin this block of installation. - std::string component_test = - this->CreateComponentTest(this->Component.c_str()); - os << indent << "IF(" << component_test << ")\n"; - // Compute the build tree directory from which to copy the target. - std::string fromDir; + std::string& fromDir = this->FromDir; if(this->Target->NeedRelinkBeforeInstall()) { fromDir = this->Target->GetMakefile()->GetStartOutputDirectory(); @@ -79,70 +71,62 @@ void cmInstallTargetGenerator::GenerateScript(std::ostream& os) fromDir += "/"; } - // Generate a portion of the script for each configuration. + // Perform the main install script generation. + this->cmInstallGenerator::GenerateScript(os); +} + +//---------------------------------------------------------------------------- +void cmInstallTargetGenerator::GenerateScriptConfigs(std::ostream& os, + Indent const& indent) +{ if(this->ConfigurationTypes->empty()) { - this->GenerateScriptForConfig(os, fromDir.c_str(), - this->ConfigurationName, - indent.Next()); + // In a single-configuration generator, only the install rule's + // configuration test is important. If that passes, the target is + // installed regardless of for what configuration it was built. + this->cmInstallGenerator::GenerateScriptConfigs(os, indent); } else { + // In a multi-configuration generator, a separate rule is produced + // in a block for each configuration that is built. However, the + // list of configurations is restricted to those for which this + // install rule applies. for(std::vector<std::string>::const_iterator i = this->ConfigurationTypes->begin(); i != this->ConfigurationTypes->end(); ++i) { - this->GenerateScriptForConfig(os, fromDir.c_str(), i->c_str(), - indent.Next()); + const char* config = i->c_str(); + if(this->InstallsForConfig(config)) + { + // Generate a per-configuration block. + std::string config_test = this->CreateConfigTest(config); + os << indent << "IF(" << config_test << ")\n"; + this->GenerateScriptForConfig(os, config, indent.Next()); + os << indent << "ENDIF(" << config_test << ")\n"; + } } } +} - // End this block of installation. - os << indent << "ENDIF(" << component_test << ")\n\n"; +//---------------------------------------------------------------------------- +void cmInstallTargetGenerator::GenerateScriptActions(std::ostream& os, + Indent const& indent) +{ + // This is reached for single-configuration generators only. + this->GenerateScriptForConfig(os, this->ConfigurationName, indent); } //---------------------------------------------------------------------------- void cmInstallTargetGenerator::GenerateScriptForConfig(std::ostream& os, - const char* fromDir, const char* config, Indent const& indent) { // Compute the per-configuration directory containing the files. - std::string fromDirConfig = fromDir; + std::string fromDirConfig = this->FromDir; this->Target->GetMakefile()->GetLocalGenerator()->GetGlobalGenerator() ->AppendDirectoryForConfig("", config, "/", fromDirConfig); - if(config && *config) - { - // Skip this configuration for config-specific installation that - // does not match it. - if(!this->InstallsForConfig(config)) - { - return; - } - - // Generate a per-configuration block. - std::string config_test = this->CreateConfigTest(config); - os << indent << "IF(" << config_test << ")\n"; - this->GenerateScriptForConfigDir(os, fromDirConfig.c_str(), config, - indent.Next()); - os << indent << "ENDIF(" << config_test << ")\n"; - } - else - { - this->GenerateScriptForConfigDir(os, fromDirConfig.c_str(), config, - indent); - } -} - -//---------------------------------------------------------------------------- -void -cmInstallTargetGenerator -::GenerateScriptForConfigDir(std::ostream& os, - const char* fromDirConfig, - const char* config, - Indent const& indent) -{ // Compute the full path to the main installed file for this target. NameType nameType = this->ImportLibrary? NameImplib : NameNormal; std::string toInstallPath = this->GetInstallDestination(); diff --git a/Source/cmInstallTargetGenerator.h b/Source/cmInstallTargetGenerator.h index cd4d6e5..0f587e6 100644 --- a/Source/cmInstallTargetGenerator.h +++ b/Source/cmInstallTargetGenerator.h @@ -66,14 +66,11 @@ public: protected: typedef cmInstallGeneratorIndent Indent; virtual void GenerateScript(std::ostream& os); + virtual void GenerateScriptConfigs(std::ostream& os, Indent const& indent); + virtual void GenerateScriptActions(std::ostream& os, Indent const& indent); void GenerateScriptForConfig(std::ostream& os, - const char* fromDir, const char* config, Indent const& indent); - void GenerateScriptForConfigDir(std::ostream& os, - const char* fromDirConfig, - const char* config, - Indent const& indent); void AddInstallNamePatchRule(std::ostream& os, Indent const& indent, const char* config, const std::string& toDestDirPath); @@ -96,6 +93,7 @@ protected: std::string FilePermissions; bool Optional; NamelinkModeType NamelinkMode; + std::string FromDir; }; #endif |