[Cmake-commits] CMake branch, next, updated. v2.8.6-2001-gfe18977

Brad King brad.king at kitware.com
Tue Nov 22 16:03:03 EST 2011


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "CMake".

The branch, next has been updated
       via  fe18977b5f4e12e07dd4693a038b5b407ee0a0c2 (commit)
       via  5c03438661c285a7cc5f1e691198ac4e8a68a8f6 (commit)
       via  a2be068c75890a9b6723c0bbb2d32a108cb84eed (commit)
      from  d7cb90e1bb3747876c53f2f006d6b5ce5399c22f (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=fe18977b5f4e12e07dd4693a038b5b407ee0a0c2
commit fe18977b5f4e12e07dd4693a038b5b407ee0a0c2
Merge: d7cb90e 5c03438
Author:     Brad King <brad.king at kitware.com>
AuthorDate: Tue Nov 22 16:02:58 2011 -0500
Commit:     CMake Topic Stage <kwrobot at kitware.com>
CommitDate: Tue Nov 22 16:02:58 2011 -0500

    Merge topic 'CheckImportedFileExistenceInConfigDotCMakeFiles' into next
    
    5c03438 install(EXPORT): Improve target import failure message format
    a2be068 install(EXPORT): Enforce existence of imported target files


http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=5c03438661c285a7cc5f1e691198ac4e8a68a8f6
commit 5c03438661c285a7cc5f1e691198ac4e8a68a8f6
Author:     Brad King <brad.king at kitware.com>
AuthorDate: Thu Nov 17 16:39:24 2011 -0500
Commit:     Brad King <brad.king at kitware.com>
CommitDate: Tue Nov 22 15:55:04 2011 -0500

    install(EXPORT): Improve target import failure message format

diff --git a/Source/cmExportFileGenerator.cxx b/Source/cmExportFileGenerator.cxx
index 7777373..c4f5dfb 100644
--- a/Source/cmExportFileGenerator.cxx
+++ b/Source/cmExportFileGenerator.cxx
@@ -385,19 +385,16 @@ cmExportFileGenerator::GenerateImportedFileCheckLoop(std::ostream& os)
         "FOREACH(target ${_IMPORT_CHECK_TARGETS} )\n"
         "  FOREACH(file ${_IMPORT_CHECK_FILES_FOR_${target}} )\n"
         "    IF(NOT EXISTS \"${file}\" )\n"
-        "      MESSAGE(FATAL_ERROR \"The imported target \\\"${target}\\\" "
-        "references the file \\\"${file}\\\", but this file does not exist. "
-        "There are multiple possible reasons:\n"
-        " * The file \\\"${file}\\\" has been manually "
-        "deleted, renamed or moved to another location.\n"
-        " * A previous install or uninstall procedure did not complete "
-        " successfully.\n"
-        " * The installation package was faulty, and contained\n"
-        "\\\"${CMAKE_CURRENT_LIST_FILE}\\\"\n"
-        "but not\n"
-        "\\\"${file}\\\"\n"
-        "which must always be installed together.\\n\"\n"
-        "             )\n"
+        "      MESSAGE(FATAL_ERROR \"The imported target \\\"${target}\\\""
+        " references the file\n"
+        "   \\\"${file}\\\"\n"
+        "but this file does not exist.  Possible reasons include:\n"
+        "* The file was deleted, renamed, or moved to another location.\n"
+        "* An install or uninstall procedure did not complete successfully.\n"
+        "* The installation package was faulty and contained\n"
+        "   \\\"${CMAKE_CURRENT_LIST_FILE}\\\"\n"
+        "but not all the files it references.\n"
+        "\")\n"
         "    ENDIF()\n"
         "  ENDFOREACH()\n"
         "  UNSET(_IMPORT_CHECK_FILES_FOR_${target})\n"

http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=a2be068c75890a9b6723c0bbb2d32a108cb84eed
commit a2be068c75890a9b6723c0bbb2d32a108cb84eed
Author:     Alex Neundorf <neundorf at kde.org>
AuthorDate: Sat Nov 12 18:12:07 2011 +0100
Commit:     Brad King <brad.king at kitware.com>
CommitDate: Tue Nov 22 15:55:00 2011 -0500

    install(EXPORT): Enforce existence of imported target files
    
    Typical <package>Config.cmake files for find_package() rely only on the
    files generated by install(EXPORT).  They might be wrong, for whatever
    reasons, like people manually deleted files, projects were packaged
    wrong by distributions, whatever.  To protect against this, add checks
    that the file locations we are importing actually exist on disk.
    
    Alex

diff --git a/Source/cmExportFileGenerator.cxx b/Source/cmExportFileGenerator.cxx
index 9e5c91e..7777373 100644
--- a/Source/cmExportFileGenerator.cxx
+++ b/Source/cmExportFileGenerator.cxx
@@ -368,3 +368,69 @@ cmExportFileGenerator
   os << "  )\n"
      << "\n";
 }
+
+
+//----------------------------------------------------------------------------
+void
+cmExportFileGenerator::GenerateImportedFileCheckLoop(std::ostream& os)
+{
+  // Add code which verifies at cmake time that the file which is being
+  // imported actually exists on disk. This should in theory always be theory
+  // case, but still when packages are split into normal and development
+  // packages this might get broken (e.g. the Config.cmake could be part of
+  // the non-development package, something similar happened to me without
+  // on SUSE with a mysql pkg-config file, which claimed everything is fine,
+  // but the development package was not installed.).
+  os << "# Loop over all imported files and verify that they actually exist\n"
+        "FOREACH(target ${_IMPORT_CHECK_TARGETS} )\n"
+        "  FOREACH(file ${_IMPORT_CHECK_FILES_FOR_${target}} )\n"
+        "    IF(NOT EXISTS \"${file}\" )\n"
+        "      MESSAGE(FATAL_ERROR \"The imported target \\\"${target}\\\" "
+        "references the file \\\"${file}\\\", but this file does not exist. "
+        "There are multiple possible reasons:\n"
+        " * The file \\\"${file}\\\" has been manually "
+        "deleted, renamed or moved to another location.\n"
+        " * A previous install or uninstall procedure did not complete "
+        " successfully.\n"
+        " * The installation package was faulty, and contained\n"
+        "\\\"${CMAKE_CURRENT_LIST_FILE}\\\"\n"
+        "but not\n"
+        "\\\"${file}\\\"\n"
+        "which must always be installed together.\\n\"\n"
+        "             )\n"
+        "    ENDIF()\n"
+        "  ENDFOREACH()\n"
+        "  UNSET(_IMPORT_CHECK_FILES_FOR_${target})\n"
+        "ENDFOREACH()\n"
+        "UNSET(_IMPORT_CHECK_TARGETS)\n"
+        "\n";
+}
+
+
+//----------------------------------------------------------------------------
+void
+cmExportFileGenerator
+::GenerateImportedFileChecksCode(std::ostream& os, cmTarget* target,
+                                 ImportPropertyMap const& properties,
+                                const std::set<std::string>& importedLocations)
+{
+  // Construct the imported target name.
+  std::string targetName = this->Namespace;
+  targetName += target->GetName();
+
+  os << "LIST(APPEND _IMPORT_CHECK_TARGETS " << targetName << " )\n"
+        "LIST(APPEND _IMPORT_CHECK_FILES_FOR_" << targetName << " ";
+
+  for(std::set<std::string>::const_iterator li = importedLocations.begin();
+      li != importedLocations.end();
+      ++li)
+    {
+    ImportPropertyMap::const_iterator pi = properties.find(*li);
+    if (pi != properties.end())
+      {
+      os << "\"" << pi->second << "\" ";
+      }
+    }
+
+  os << ")\n\n";
+}
diff --git a/Source/cmExportFileGenerator.h b/Source/cmExportFileGenerator.h
index 05f73a2..f271e55 100644
--- a/Source/cmExportFileGenerator.h
+++ b/Source/cmExportFileGenerator.h
@@ -56,6 +56,11 @@ protected:
   void GenerateImportPropertyCode(std::ostream& os, const char* config,
                                   cmTarget* target,
                                   ImportPropertyMap const& properties);
+  void GenerateImportedFileChecksCode(std::ostream& os, cmTarget* target,
+                                      ImportPropertyMap const& properties,
+                               const std::set<std::string>& importedLocations);
+  void GenerateImportedFileCheckLoop(std::ostream& os);
+
 
   // Collect properties with detailed information about targets beyond
   // their location on disk.
diff --git a/Source/cmExportInstallFileGenerator.cxx b/Source/cmExportInstallFileGenerator.cxx
index 23ff5fb..da14dd7 100644
--- a/Source/cmExportInstallFileGenerator.cxx
+++ b/Source/cmExportInstallFileGenerator.cxx
@@ -167,16 +167,18 @@ cmExportInstallFileGenerator
     // Collect import properties for this target.
     cmTargetExport* te = *tei;
     ImportPropertyMap properties;
+    std::set<std::string> importedLocations;
+    this->SetImportLocationProperty(config, suffix, te->ArchiveGenerator,
+                                    properties, importedLocations);
+    this->SetImportLocationProperty(config, suffix, te->LibraryGenerator,
+                                    properties, importedLocations);
     this->SetImportLocationProperty(config, suffix,
-                                    te->ArchiveGenerator, properties);
-    this->SetImportLocationProperty(config, suffix,
-                                    te->LibraryGenerator, properties);
-    this->SetImportLocationProperty(config, suffix,
-                                    te->RuntimeGenerator, properties);
-    this->SetImportLocationProperty(config, suffix,
-                                    te->FrameworkGenerator, properties);
-    this->SetImportLocationProperty(config, suffix,
-                                    te->BundleGenerator, properties);
+                                    te->RuntimeGenerator, properties,
+                                    importedLocations);
+    this->SetImportLocationProperty(config, suffix, te->FrameworkGenerator,
+                                    properties, importedLocations);
+    this->SetImportLocationProperty(config, suffix, te->BundleGenerator,
+                                    properties, importedLocations);
 
     // If any file location was set for the target add it to the
     // import file.
@@ -194,9 +196,13 @@ cmExportInstallFileGenerator
 
       // Generate code in the export file.
       this->GenerateImportPropertyCode(os, config, te->Target, properties);
+      this->GenerateImportedFileChecksCode(os, te->Target, properties,
+                                           importedLocations);
       }
     }
 
+  this->GenerateImportedFileCheckLoop(os);
+
   // Cleanup the import prefix variable.
   if(!this->ImportPrefix.empty())
     {
@@ -211,7 +217,9 @@ void
 cmExportInstallFileGenerator
 ::SetImportLocationProperty(const char* config, std::string const& suffix,
                             cmInstallTargetGenerator* itgen,
-                            ImportPropertyMap& properties)
+                            ImportPropertyMap& properties,
+                            std::set<std::string>& importedLocations
+                           )
 {
   // Skip rules that do not match this configuration.
   if(!(itgen && itgen->InstallsForConfig(config)))
@@ -249,6 +257,7 @@ cmExportInstallFileGenerator
 
     // Store the property.
     properties[prop] = value;
+    importedLocations.insert(prop);
     }
   else
     {
@@ -291,6 +300,7 @@ cmExportInstallFileGenerator
 
     // Store the property.
     properties[prop] = value;
+    importedLocations.insert(prop);
     }
 }
 
diff --git a/Source/cmExportInstallFileGenerator.h b/Source/cmExportInstallFileGenerator.h
index 8c8fb44..fb678e8 100644
--- a/Source/cmExportInstallFileGenerator.h
+++ b/Source/cmExportInstallFileGenerator.h
@@ -75,7 +75,9 @@ protected:
   void SetImportLocationProperty(const char* config,
                                  std::string const& suffix,
                                  cmInstallTargetGenerator* itgen,
-                                 ImportPropertyMap& properties);
+                                 ImportPropertyMap& properties,
+                                 std::set<std::string>& importedLocations
+                                );
 
   void ComplainAboutImportPrefix(cmInstallTargetGenerator* itgen);
 

-----------------------------------------------------------------------

Summary of changes:


hooks/post-receive
-- 
CMake


More information about the Cmake-commits mailing list