From 9eedc850eb1419d678bda8137610dba1c289bb6a Mon Sep 17 00:00:00 2001
From: Stephen Kelly <steveire@gmail.com>
Date: Tue, 26 Nov 2013 10:34:44 +0100
Subject: Export: Process relative includes after genex evaluation.

In code such as

 install(TARGETS ...
   INCLUDES DESTINATION $<FOO>include
 )

the generator expressions are evaluated at generate-time. Delay
determining whether each entry is a relative path until after
the generator expressions are evaluated. Such relative paths
are based relative to the CMAKE_INSTALL_PREFIX.
---
 Source/cmExportFileGenerator.cxx                   | 23 ++++++++++++++++++++++
 Source/cmInstallCommandArguments.cxx               |  5 -----
 Tests/ExportImport/Export/CMakeLists.txt           | 16 ++++++++++++++-
 Tests/ExportImport/Import/A/deps_iface.c           |  2 ++
 .../include_directories/export-NOWARN.cmake        | 12 +++++++++++
 5 files changed, 52 insertions(+), 6 deletions(-)

diff --git a/Source/cmExportFileGenerator.cxx b/Source/cmExportFileGenerator.cxx
index 2ce4458..8f83c02 100644
--- a/Source/cmExportFileGenerator.cxx
+++ b/Source/cmExportFileGenerator.cxx
@@ -286,6 +286,27 @@ static bool checkInterfaceDirs(const std::string &prepro,
 }
 
 //----------------------------------------------------------------------------
+static void prefixItems(std::string &exportDirs)
+{
+  std::vector<std::string> entries;
+  cmGeneratorExpression::Split(exportDirs, entries);
+  exportDirs = "";
+  const char *sep = "";
+  for(std::vector<std::string>::const_iterator ei = entries.begin();
+      ei != entries.end(); ++ei)
+    {
+    exportDirs += sep;
+    sep = ";";
+    if (!cmSystemTools::FileIsFullPath(ei->c_str())
+        && ei->find("${_IMPORT_PREFIX}") == std::string::npos)
+      {
+      exportDirs += "${_IMPORT_PREFIX}/";
+      }
+    exportDirs += *ei;
+    }
+}
+
+//----------------------------------------------------------------------------
 void cmExportFileGenerator::PopulateIncludeDirectoriesInterface(
                       cmTargetExport *tei,
                       cmGeneratorExpression::PreprocessContext preprocessRule,
@@ -330,6 +351,8 @@ void cmExportFileGenerator::PopulateIncludeDirectoriesInterface(
     return;
     }
 
+  prefixItems(exportDirs);
+
   std::string includes = (input?input:"");
   const char* sep = input ? ";" : "";
   includes += sep + exportDirs;
diff --git a/Source/cmInstallCommandArguments.cxx b/Source/cmInstallCommandArguments.cxx
index 91ea861..236ca1f 100644
--- a/Source/cmInstallCommandArguments.cxx
+++ b/Source/cmInstallCommandArguments.cxx
@@ -228,11 +228,6 @@ void cmInstallCommandIncludesArgument::Parse(
   for ( ; it != args->end(); ++it)
     {
     std::string dir = *it;
-    if (!cmSystemTools::FileIsFullPath(it->c_str())
-        && cmGeneratorExpression::Find(*it) == std::string::npos)
-      {
-      dir = "$<INSTALL_PREFIX>/" + dir;
-      }
     cmSystemTools::ConvertToUnixSlashes(dir);
     this->IncludeDirs.push_back(dir);
     }
diff --git a/Tests/ExportImport/Export/CMakeLists.txt b/Tests/ExportImport/Export/CMakeLists.txt
index cbae967..6f48fcc 100644
--- a/Tests/ExportImport/Export/CMakeLists.txt
+++ b/Tests/ExportImport/Export/CMakeLists.txt
@@ -311,7 +311,9 @@ install(TARGETS testLibRequired
         INCLUDES DESTINATION
           installIncludesTest
           $<INSTALL_PREFIX>/installIncludesTest2
-          )
+          installIncludesTest3/$<TARGET_PROPERTY:NAME>
+          $<TARGET_PROPERTY:NAME>/installIncludesTest4
+)
 install(TARGETS
           testLibIncludeRequired1
           testLibIncludeRequired2
@@ -334,6 +336,10 @@ file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest/installIncludesTest.
 
 file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest2")
 file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest2/installIncludesTest2.h" "// No content\n")
+file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest3/testLibRequired")
+file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest3/testLibRequired/installIncludesTest3.h" "// No content\n")
+file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/testLibRequired/installIncludesTest4")
+file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/testLibRequired/installIncludesTest4/installIncludesTest4.h" "// No content\n")
 install(FILES
   "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest/installIncludesTest.h"
   DESTINATION installIncludesTest
@@ -342,6 +348,14 @@ install(FILES
   "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest2/installIncludesTest2.h"
   DESTINATION installIncludesTest2
 )
+install(FILES
+  "${CMAKE_CURRENT_BINARY_DIR}/installIncludesTest3/testLibRequired/installIncludesTest3.h"
+  DESTINATION installIncludesTest3/testLibRequired
+)
+install(FILES
+  "${CMAKE_CURRENT_BINARY_DIR}/testLibRequired/installIncludesTest4/installIncludesTest4.h"
+  DESTINATION testLibRequired/installIncludesTest4
+)
 
 install(TARGETS testLibDepends testSharedLibDepends EXPORT DependsExp DESTINATION lib )
 install(EXPORT DependsExp FILE testLibDependsTargets.cmake DESTINATION lib/cmake/testLibDepends)
diff --git a/Tests/ExportImport/Import/A/deps_iface.c b/Tests/ExportImport/Import/A/deps_iface.c
index 48a4c44..bd9f75a 100644
--- a/Tests/ExportImport/Import/A/deps_iface.c
+++ b/Tests/ExportImport/Import/A/deps_iface.c
@@ -6,6 +6,8 @@
 
 #include "installIncludesTest.h"
 #include "installIncludesTest2.h"
+#include "installIncludesTest3.h"
+#include "installIncludesTest4.h"
 
 #ifndef testLibRequired_IFACE_DEFINE
 #error Expected testLibRequired_IFACE_DEFINE
diff --git a/Tests/RunCMake/include_directories/export-NOWARN.cmake b/Tests/RunCMake/include_directories/export-NOWARN.cmake
index 924511d..307ce5a 100644
--- a/Tests/RunCMake/include_directories/export-NOWARN.cmake
+++ b/Tests/RunCMake/include_directories/export-NOWARN.cmake
@@ -48,3 +48,15 @@ install(TARGETS foo EXPORT FooTargets6
   INCLUDES DESTINATION $<INSTALL_INTERFACE:include$<0:>>
 )
 install(EXPORT FooTargets6 DESTINATION lib/cmake)
+
+install(TARGETS foo EXPORT FooTargets7
+  DESTINATION lib
+  INCLUDES DESTINATION include$<0:>
+)
+install(EXPORT FooTargets7 DESTINATION lib/cmake)
+
+install(TARGETS foo EXPORT FooTargets8
+  DESTINATION lib
+  INCLUDES DESTINATION $<0:>include
+)
+install(EXPORT FooTargets8 DESTINATION lib/cmake)
-- 
cgit v0.12