diff options
author | Alex Neundorf <neundorf@kde.org> | 2012-09-28 19:47:37 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2012-09-30 14:26:10 (GMT) |
commit | 0cfd055acda3543d66690b5e92d8ee7c20e0654f (patch) | |
tree | f034d09d81d1c9a0c7f4203cb87d1d3db667046e | |
parent | 190f2c8253910a9e6870948df58a87950e7b4185 (diff) | |
download | CMake-0cfd055acda3543d66690b5e92d8ee7c20e0654f.zip CMake-0cfd055acda3543d66690b5e92d8ee7c20e0654f.tar.gz CMake-0cfd055acda3543d66690b5e92d8ee7c20e0654f.tar.bz2 |
exports: move the handling of missing targets into subclasses
Before, cmExportFileGenerator::ComplainAboutMissingTarget() was a virtual
function which had to be implemented in the subclasses. It is not
anymore. Instead, there is now a virtual function
HandleMissingTargets(), which is implemented in the two subclasses.
This makes e.g. dealing correctly with APPEND mode easier.
Alex
-rw-r--r-- | Source/cmExportBuildFileGenerator.cxx | 42 | ||||
-rw-r--r-- | Source/cmExportBuildFileGenerator.h | 11 | ||||
-rw-r--r-- | Source/cmExportFileGenerator.cxx | 66 | ||||
-rw-r--r-- | Source/cmExportFileGenerator.h | 16 | ||||
-rw-r--r-- | Source/cmExportInstallFileGenerator.cxx | 71 | ||||
-rw-r--r-- | Source/cmExportInstallFileGenerator.h | 16 |
6 files changed, 124 insertions, 98 deletions
diff --git a/Source/cmExportBuildFileGenerator.cxx b/Source/cmExportBuildFileGenerator.cxx index 22ae0e4..fb3f39f 100644 --- a/Source/cmExportBuildFileGenerator.cxx +++ b/Source/cmExportBuildFileGenerator.cxx @@ -135,10 +135,28 @@ cmExportBuildFileGenerator //---------------------------------------------------------------------------- void +cmExportBuildFileGenerator::HandleMissingTarget( + std::string& link_libs, std::vector<std::string>&, + cmMakefile*, cmTarget* depender, cmTarget* dependee) +{ + // The target is not in the export. + if(!this->AppendMode) + { + // We are not appending, so all exported targets should be + // known here. This is probably user-error. + this->ComplainAboutMissingTarget(depender, dependee); + } + // Assume the target will be exported by another command. + // Append it with the export namespace. + link_libs += this->Namespace; + link_libs += dependee->GetName(); +} + +//---------------------------------------------------------------------------- +void cmExportBuildFileGenerator ::ComplainAboutMissingTarget(cmTarget* depender, - cmTarget* dependee, - int occurrences) + cmTarget* dependee) { if(!this->ExportCommand || !this->ExportCommand->ErrorMessage.empty()) { @@ -146,20 +164,10 @@ cmExportBuildFileGenerator } cmOStringStream e; - if (occurrences == 0) - { - e << "called with target \"" << depender->GetName() - << "\" which requires target \"" << dependee->GetName() - << "\" that is not in the export list.\n" - << "If the required target is not easy to reference in this call, " - << "consider using the APPEND option with multiple separate calls."; - } - else - { - e << "called with target \"" << depender->GetName() - << "\" which requires target \"" << dependee->GetName() - << "\" that is exported " << occurrences << " times in other " - << "export ""lists.\n"; - } + e << "called with target \"" << depender->GetName() + << "\" which requires target \"" << dependee->GetName() + << "\" that is not in the export list.\n" + << "If the required target is not easy to reference in this call, " + << "consider using the APPEND option with multiple separate calls."; this->ExportCommand->ErrorMessage = e.str(); } diff --git a/Source/cmExportBuildFileGenerator.h b/Source/cmExportBuildFileGenerator.h index 69f8407..726537b 100644 --- a/Source/cmExportBuildFileGenerator.h +++ b/Source/cmExportBuildFileGenerator.h @@ -45,9 +45,14 @@ protected: virtual void GenerateImportTargetsConfig(std::ostream& os, const char* config, std::string const& suffix); - virtual void ComplainAboutMissingTarget(cmTarget* depender, - cmTarget* dependee, - int occurrences); + virtual void HandleMissingTarget(std::string& link_libs, + std::vector<std::string>& missingTargets, + cmMakefile* mf, + cmTarget* depender, + cmTarget* dependee); + + void ComplainAboutMissingTarget(cmTarget* depender, + cmTarget* dependee); /** Fill in properties indicating built file locations. */ void SetImportLocationProperty(const char* config, diff --git a/Source/cmExportFileGenerator.cxx b/Source/cmExportFileGenerator.cxx index dc4fa31..5d95668 100644 --- a/Source/cmExportFileGenerator.cxx +++ b/Source/cmExportFileGenerator.cxx @@ -233,30 +233,7 @@ cmExportFileGenerator } else { - std::vector<std::string> namespaces = this->FindNamespaces(mf, *li); - int targetOccurrences = (int)namespaces.size(); - - if (targetOccurrences == 1) - { - std::string missingTarget = namespaces[0]; - missingTarget += *li; - link_libs += missingTarget; - missingTargets.push_back(missingTarget); - } - else - { - // The target is not in the export. - if(!this->AppendMode) - { - // We are not appending, so all exported targets should be - // known here. This is probably user-error. - this->ComplainAboutMissingTarget(target, tgt, targetOccurrences); - } - // Assume the target will be exported by another command. - // Append it with the export namespace. - link_libs += this->Namespace; - link_libs += *li; - } + this->HandleMissingTarget(link_libs, missingTargets, mf, target, tgt); } } else @@ -274,47 +251,6 @@ cmExportFileGenerator //---------------------------------------------------------------------------- -std::vector<std::string> cmExportFileGenerator::FindNamespaces(cmMakefile* mf, - const std::string& name) -{ - std::vector<std::string> namespaces; - cmGlobalGenerator* gg = mf->GetLocalGenerator()->GetGlobalGenerator(); - const cmExportSetMap& exportSets = gg->GetExportSets(); - - for(cmExportSetMap::const_iterator expIt = exportSets.begin(); - expIt != exportSets.end(); - ++expIt) - { - const cmExportSet* exportSet = expIt->second; - std::vector<cmTargetExport*> const* targets = - exportSet->GetTargetExports(); - - bool containsTarget = false; - for(unsigned int i=0; i<targets->size(); i++) - { - if (name == (*targets)[i]->Target->GetName()) - { - containsTarget = true; - break; - } - } - - if (containsTarget) - { - std::vector<cmInstallExportGenerator const*> const* installs = - exportSet->GetInstallations(); - for(unsigned int i=0; i<installs->size(); i++) - { - namespaces.push_back((*installs)[i]->GetNamespace()); - } - } - } - - return namespaces; -} - - -//---------------------------------------------------------------------------- void cmExportFileGenerator::GenerateImportHeaderCode(std::ostream& os, const char* config) { diff --git a/Source/cmExportFileGenerator.h b/Source/cmExportFileGenerator.h index 5a99b54..70bc65d 100644 --- a/Source/cmExportFileGenerator.h +++ b/Source/cmExportFileGenerator.h @@ -84,15 +84,13 @@ protected: const char* config, std::string const& suffix) = 0; - /** Each subclass knows how to complain about a target that is - missing from an export set. */ - virtual void ComplainAboutMissingTarget(cmTarget* depender, - cmTarget* dependee, - int occurrences) = 0; - - std::vector<std::string> FindNamespaces(cmMakefile* mf, - const std::string& name); - + /** Each subclass knows how to deal with a target that is missing from an + * export set. */ + virtual void HandleMissingTarget(std::string& link_libs, + std::vector<std::string>& missingTargets, + cmMakefile* mf, + cmTarget* depender, + cmTarget* dependee) = 0; // The namespace in which the exports are placed in the generated file. std::string Namespace; diff --git a/Source/cmExportInstallFileGenerator.cxx b/Source/cmExportInstallFileGenerator.cxx index cd05e60..7841731 100644 --- a/Source/cmExportInstallFileGenerator.cxx +++ b/Source/cmExportInstallFileGenerator.cxx @@ -11,11 +11,14 @@ ============================================================================*/ #include "cmExportInstallFileGenerator.h" +#include "cmExportSet.h" +#include "cmExportSetMap.h" #include "cmGeneratedFileStream.h" +#include "cmGlobalGenerator.h" +#include "cmLocalGenerator.h" #include "cmInstallExportGenerator.h" #include "cmInstallTargetGenerator.h" #include "cmTargetExport.h" -#include "cmExportSet.h" //---------------------------------------------------------------------------- cmExportInstallFileGenerator @@ -311,6 +314,72 @@ cmExportInstallFileGenerator //---------------------------------------------------------------------------- void +cmExportInstallFileGenerator::HandleMissingTarget( + std::string& link_libs, std::vector<std::string>& missingTargets, + cmMakefile* mf, cmTarget* depender, cmTarget* dependee) +{ + std::string name = dependee->GetName(); + std::vector<std::string> namespaces = this->FindNamespaces(mf, name); + int targetOccurrences = (int)namespaces.size(); + if (targetOccurrences == 1) + { + std::string missingTarget = namespaces[0]; + missingTarget += name; + link_libs += missingTarget; + missingTargets.push_back(missingTarget); + } + else + { + // We are not appending, so all exported targets should be + // known here. This is probably user-error. + this->ComplainAboutMissingTarget(depender, dependee, targetOccurrences); + } +} + +//---------------------------------------------------------------------------- +std::vector<std::string> +cmExportInstallFileGenerator +::FindNamespaces(cmMakefile* mf, const std::string& name) +{ + std::vector<std::string> namespaces; + cmGlobalGenerator* gg = mf->GetLocalGenerator()->GetGlobalGenerator(); + const cmExportSetMap& exportSets = gg->GetExportSets(); + + for(cmExportSetMap::const_iterator expIt = exportSets.begin(); + expIt != exportSets.end(); + ++expIt) + { + const cmExportSet* exportSet = expIt->second; + std::vector<cmTargetExport*> const* targets = + exportSet->GetTargetExports(); + + bool containsTarget = false; + for(unsigned int i=0; i<targets->size(); i++) + { + if (name == (*targets)[i]->Target->GetName()) + { + containsTarget = true; + break; + } + } + + if (containsTarget) + { + std::vector<cmInstallExportGenerator const*> const* installs = + exportSet->GetInstallations(); + for(unsigned int i=0; i<installs->size(); i++) + { + namespaces.push_back((*installs)[i]->GetNamespace()); + } + } + } + + return namespaces; +} + + +//---------------------------------------------------------------------------- +void cmExportInstallFileGenerator ::ComplainAboutImportPrefix(cmInstallTargetGenerator* itgen) { diff --git a/Source/cmExportInstallFileGenerator.h b/Source/cmExportInstallFileGenerator.h index f6f397e..e719ecc 100644 --- a/Source/cmExportInstallFileGenerator.h +++ b/Source/cmExportInstallFileGenerator.h @@ -57,9 +57,19 @@ protected: virtual void GenerateImportTargetsConfig(std::ostream& os, const char* config, std::string const& suffix); - virtual void ComplainAboutMissingTarget(cmTarget* depender, - cmTarget* dependee, - int occurrences); + virtual void HandleMissingTarget(std::string& link_libs, + std::vector<std::string>& missingTargets, + cmMakefile* mf, + cmTarget* depender, + cmTarget* dependee); + + void ComplainAboutMissingTarget(cmTarget* depender, + cmTarget* dependee, + int occurrences); + + std::vector<std::string> FindNamespaces(cmMakefile* mf, + const std::string& name); + /** Generate a per-configuration file for the targets. */ bool GenerateImportFileConfig(const char* config); |