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  c1562a65ec4d31dfd6ce54d0ef8e25a40e4a5ae2 (commit)
       via  8ce52229a80563295b8835c07b35d257e5cf2d77 (commit)
       via  48994338892d0c020e7abb51b08fb4b48be9e61d (commit)
      from  29ed9dde11d43d789951e3ce1d1ae3060126c1b2 (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=c1562a65ec4d31dfd6ce54d0ef8e25a40e4a5ae2
commit c1562a65ec4d31dfd6ce54d0ef8e25a40e4a5ae2
Merge: 29ed9dd 8ce5222
Author:     Stephen Kelly <steve...@gmail.com>
AuthorDate: Mon Mar 25 14:22:19 2013 -0400
Commit:     CMake Topic Stage <kwro...@kitware.com>
CommitDate: Mon Mar 25 14:22:19 2013 -0400

    Merge topic 'error-on-exported-missing-include-dir' into next
    
    8ce5222 Make targets report an error on faulty INTERFACE on IMPORTED 
targets.
    4899433 Ensure clean INTERFACE_INCLUDE_DIRECTORIES on install(EXPORT)


http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=8ce52229a80563295b8835c07b35d257e5cf2d77
commit 8ce52229a80563295b8835c07b35d257e5cf2d77
Author:     Stephen Kelly <steve...@gmail.com>
AuthorDate: Sun Mar 24 21:18:21 2013 +0100
Commit:     Stephen Kelly <steve...@gmail.com>
CommitDate: Mon Mar 25 19:00:20 2013 +0100

    Make targets report an error on faulty INTERFACE on IMPORTED targets.
    
    It is considered an error if the INTERFACE_INCLUDE_DIRECTORIES contains
    a directory which does not exist, which indicates a programmer error
    by the upstream, or a packaging error.

diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx
index 61d4ce2..2efeab0 100644
--- a/Source/cmTarget.cxx
+++ b/Source/cmTarget.cxx
@@ -131,11 +131,13 @@ public:
   SourceEntriesType SourceEntries;
 
   struct IncludeDirectoriesEntry {
-    IncludeDirectoriesEntry(cmsys::auto_ptr<cmCompiledGeneratorExpression> cge)
-      : ge(cge)
+    IncludeDirectoriesEntry(cmsys::auto_ptr<cmCompiledGeneratorExpression> cge,
+      const std::string &targetName = std::string())
+      : ge(cge), TargetName(targetName)
     {}
     const cmsys::auto_ptr<cmCompiledGeneratorExpression> ge;
     std::vector<std::string> CachedIncludes;
+    const std::string TargetName;
   };
   std::vector<IncludeDirectoriesEntry*> IncludeDirectoriesEntries;
   std::vector<cmValueWithOrigin> LinkInterfaceIncludeDirectoriesEntries;
@@ -2818,6 +2820,28 @@ static void processIncludeDirectories(cmTarget *tgt,
     for(std::vector<std::string>::iterator
           li = entryIncludes.begin(); li != entryIncludes.end(); ++li)
       {
+      cmTarget *dependentTarget =
+                              mf->FindTargetToUse((*it)->TargetName.c_str());
+
+      const bool fromImported = dependentTarget
+                             && dependentTarget->IsImported();
+
+      if (fromImported && !cmSystemTools::FileExists(li->c_str()))
+        {
+        cmOStringStream e;
+        e << "Imported target \"" << (*it)->TargetName << "\" includes "
+             "non-existent path \"" << *li << "\" in its "
+             "INTERFACE_INCLUDE_DIRECTORIES. Possible reasons include:\n"
+             "* The path 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 references files it "
+             "does not provide.\n";
+        tgt->GetMakefile()->IssueMessage(cmake::FATAL_ERROR, e.str().c_str());
+        return;
+        }
+
       if (testIsOff && !cmSystemTools::IsOff(li->c_str()))
         {
         cmSystemTools::ConvertToUnixSlashes(*li);
@@ -2913,7 +2937,8 @@ std::vector<std::string> 
cmTarget::GetIncludeDirectories(const char *config)
                               it->Value + ",INTERFACE_INCLUDE_DIRECTORIES>");
 
       this->Internal->CachedLinkInterfaceIncludeDirectoriesEntries.push_back(
-                        new cmTargetInternals::IncludeDirectoriesEntry(cge));
+                        new cmTargetInternals::IncludeDirectoriesEntry(cge,
+                                                              it->Value));
       }
     }
 

http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=48994338892d0c020e7abb51b08fb4b48be9e61d
commit 48994338892d0c020e7abb51b08fb4b48be9e61d
Author:     Stephen Kelly <steve...@gmail.com>
AuthorDate: Sun Mar 24 21:18:17 2013 +0100
Commit:     Stephen Kelly <steve...@gmail.com>
CommitDate: Mon Mar 25 18:58:33 2013 +0100

    Ensure clean INTERFACE_INCLUDE_DIRECTORIES on install(EXPORT)
    
    Check that source and binary directories are not part of the
    INTERFACE_INCLUDE_DIRECTORIES for installed IMPORTED targets.
    
    This is limited to directories which do not contain generator
    expressions to evaluate. Such paths can only be checked at time
    of use of the imported target, which will be done in a follow up
    patch.

diff --git a/Source/cmExportFileGenerator.cxx b/Source/cmExportFileGenerator.cxx
index 7fd0380..b0a0dbf 100644
--- a/Source/cmExportFileGenerator.cxx
+++ b/Source/cmExportFileGenerator.cxx
@@ -24,6 +24,7 @@
 #include "cmComputeLinkInformation.h"
 
 #include <cmsys/auto_ptr.hxx>
+#include <assert.h>
 
 //----------------------------------------------------------------------------
 cmExportFileGenerator::cmExportFileGenerator()
@@ -168,6 +169,115 @@ void 
cmExportFileGenerator::PopulateInterfaceProperty(const char *propName,
 }
 
 //----------------------------------------------------------------------------
+static bool isSubDirectory(const char* a, const char* b)
+{
+  return (cmSystemTools::ComparePath(a, b) ||
+          cmSystemTools::IsSubDirectory(a, b));
+}
+
+//----------------------------------------------------------------------------
+static bool checkInterfaceDirs(const std::string &prepro,
+                      cmTarget *target)
+{
+  const char* installDir = 
target->GetMakefile()->GetSafeDefinition("CMAKE_INSTALL_PREFIX");
+  const char* topSourceDir = target->GetMakefile()->GetHomeDirectory();
+  const char* topBinaryDir = target->GetMakefile()->GetHomeOutputDirectory();
+
+  std::vector<std::string> parts;
+  cmGeneratorExpression::Split(prepro, parts);
+
+  const bool inSourceBuild = strcmp(topSourceDir, topBinaryDir) == 0;
+
+  for(std::vector<std::string>::iterator li = parts.begin();
+      li != parts.end(); ++li)
+    {
+    if (cmGeneratorExpression::Find(*li) != std::string::npos)
+      {
+      continue;
+      }
+    if (strncmp(li->c_str(), "${_IMPORT_PREFIX}", 17) == 0)
+      {
+      continue;
+      }
+    if (!cmSystemTools::FileIsFullPath(li->c_str()))
+      {
+      cmOStringStream e;
+      e << "Target \"" << target->GetName() << "\" "
+           "INTERFACE_INCLUDE_DIRECTORIES property contains relative path \""
+        << *li << "\".";
+      target->GetMakefile()->IssueMessage(cmake::FATAL_ERROR,
+                                          e.str().c_str());
+      return false;
+      }
+    if (isSubDirectory(li->c_str(), installDir))
+      {
+      continue;
+      }
+    if (isSubDirectory(li->c_str(), topBinaryDir))
+      {
+      cmOStringStream e;
+      e << "Target \"" << target->GetName() << "\" "
+           "INTERFACE_INCLUDE_DIRECTORIES property contains path \""
+        << *li << "\" which is prefixed in the build directory.";
+      target->GetMakefile()->IssueMessage(cmake::FATAL_ERROR,
+                                          e.str().c_str());
+      return false;
+      }
+    if (!inSourceBuild)
+      {
+      if (isSubDirectory(li->c_str(), topSourceDir))
+        {
+        cmOStringStream e;
+        e << "Target \"" << target->GetName() << "\" "
+            "INTERFACE_INCLUDE_DIRECTORIES property contains path \""
+          << *li << "\" which is prefixed in the source directory.";
+        target->GetMakefile()->IssueMessage(cmake::FATAL_ERROR,
+                                            e.str().c_str());
+        return false;
+        }
+      }
+    }
+  return true;
+}
+
+//----------------------------------------------------------------------------
+void cmExportFileGenerator::PopulateIncludeDirectoriesInterface(
+                      cmTarget *target,
+                      cmGeneratorExpression::PreprocessContext preprocessRule,
+                      ImportPropertyMap &properties,
+                      std::vector<std::string> &missingTargets)
+{
+  assert(preprocessRule == cmGeneratorExpression::InstallInterface);
+
+  const char *propName = "INTERFACE_INCLUDE_DIRECTORIES";
+  const char *input = target->GetProperty(propName);
+  if (!input)
+    {
+    return;
+    }
+  if (!*input)
+    {
+    // Set to empty
+    properties[propName] = "";
+    return;
+    }
+
+  std::string prepro = cmGeneratorExpression::Preprocess(input,
+                                                          preprocessRule);
+  if (!prepro.empty())
+    {
+    this->ResolveTargetsInGeneratorExpressions(prepro, target,
+                                                missingTargets);
+
+    if (!checkInterfaceDirs(prepro, target))
+      {
+      return;
+      }
+    properties[propName] = prepro;
+    }
+}
+
+//----------------------------------------------------------------------------
 void cmExportFileGenerator::PopulateInterfaceProperty(const char *propName,
                       cmTarget *target,
                       cmGeneratorExpression::PreprocessContext preprocessRule,
diff --git a/Source/cmExportFileGenerator.h b/Source/cmExportFileGenerator.h
index 776be61..9f958a2 100644
--- a/Source/cmExportFileGenerator.h
+++ b/Source/cmExportFileGenerator.h
@@ -107,6 +107,11 @@ protected:
                                  ImportPropertyMap &properties);
   void GenerateInterfaceProperties(cmTarget *target, std::ostream& os,
                                    const ImportPropertyMap &properties);
+  void PopulateIncludeDirectoriesInterface(
+                      cmTarget *target,
+                      cmGeneratorExpression::PreprocessContext preprocessRule,
+                      ImportPropertyMap &properties,
+                      std::vector<std::string> &missingTargets);
 
   void SetImportLinkInterface(const char* config, std::string const& suffix,
                     cmGeneratorExpression::PreprocessContext preprocessRule,
diff --git a/Source/cmExportInstallFileGenerator.cxx 
b/Source/cmExportInstallFileGenerator.cxx
index 8b8b846..746b0c8 100644
--- a/Source/cmExportInstallFileGenerator.cxx
+++ b/Source/cmExportInstallFileGenerator.cxx
@@ -120,8 +120,7 @@ bool 
cmExportInstallFileGenerator::GenerateMainFile(std::ostream& os)
 
     ImportPropertyMap properties;
 
-    this->PopulateInterfaceProperty("INTERFACE_INCLUDE_DIRECTORIES",
-                                  te,
+    this->PopulateIncludeDirectoriesInterface(te,
                                   cmGeneratorExpression::InstallInterface,
                                   properties, missingTargets);
     this->PopulateInterfaceProperty("INTERFACE_COMPILE_DEFINITIONS",
diff --git a/Tests/ExportImport/Export/CMakeLists.txt 
b/Tests/ExportImport/Export/CMakeLists.txt
index cdf67c2..be48483 100644
--- a/Tests/ExportImport/Export/CMakeLists.txt
+++ b/Tests/ExportImport/Export/CMakeLists.txt
@@ -174,9 +174,14 @@ set_property(TARGET testSharedLibRequired
 set_property(TARGET testSharedLibRequired APPEND PROPERTY
   INCLUDE_DIRECTORIES "${CMAKE_CURRENT_BINARY_DIR}"
 )
+install(FILES
+  "${CMAKE_CURRENT_SOURCE_DIR}/testSharedLibRequired.h"
+  "${CMAKE_CURRENT_BINARY_DIR}/testsharedlibrequired_export.h"
+    DESTINATION include/testSharedLibRequired
+)
 set_property(TARGET testSharedLibRequired APPEND PROPERTY
-  INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_BINARY_DIR}"
-                                "${CMAKE_CURRENT_SOURCE_DIR}"
+  INTERFACE_INCLUDE_DIRECTORIES 
"$<INSTALL_INTERFACE:$<INSTALL_PREFIX>/include/testSharedLibRequired>"
+                                
"$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR};${CMAKE_CURRENT_SOURCE_DIR}>"
 )
 set_property(TARGET testSharedLibRequired
   APPEND PROPERTY
@@ -205,6 +210,15 @@ set_property(TARGET testSharedLibDepends APPEND PROPERTY
   INTERFACE_INCLUDE_DIRECTORIES
     $<TARGET_PROPERTY:testSharedLibRequired,INTERFACE_INCLUDE_DIRECTORIES>
 )
+install(FILES
+  "${CMAKE_CURRENT_SOURCE_DIR}/testSharedLibDepends.h"
+  "${CMAKE_CURRENT_BINARY_DIR}/testsharedlibdepends_export.h"
+    DESTINATION include/testSharedLibDepends
+)
+set_property(TARGET testSharedLibDepends APPEND PROPERTY
+  INTERFACE_INCLUDE_DIRECTORIES 
"$<INSTALL_INTERFACE:$<INSTALL_PREFIX>/include/testSharedLibDepends>"
+                                
"$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR};${CMAKE_CURRENT_SOURCE_DIR}>"
+)
 set_property(TARGET testSharedLibDepends APPEND PROPERTY
   LINK_INTERFACE_LIBRARIES
     
$<$<STREQUAL:$<TARGET_PROPERTY:TYPE>,EXECUTABLE>:$<TARGET_NAME:testSharedLibRequired>>

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

Summary of changes:
 Source/cmExportFileGenerator.cxx         |  110 ++++++++++++++++++++++++++++++
 Source/cmExportFileGenerator.h           |    5 ++
 Source/cmExportInstallFileGenerator.cxx  |    3 +-
 Source/cmTarget.cxx                      |   31 ++++++++-
 Tests/ExportImport/Export/CMakeLists.txt |   18 ++++-
 5 files changed, 160 insertions(+), 7 deletions(-)


hooks/post-receive
-- 
CMake
_______________________________________________
Cmake-commits mailing list
Cmake-commits@cmake.org
http://public.kitware.com/cgi-bin/mailman/listinfo/cmake-commits

Reply via email to