From cae943ccd7382cadb73f2b870ffcb0689c36f5eb Mon Sep 17 00:00:00 2001
From: Yves Frederix <yves.frederix@gmail.com>
Date: Mon, 29 Aug 2016 22:24:55 +0200
Subject: [PATCH] install: correctly deal with paths in generator expressions
 in DIRECTORY.

Fixes bug when the generator expression would evaluate to a full path.
---
 Source/cmInstallCommand.cxx            |  3 ++-
 Source/cmInstallDirectoryGenerator.cxx | 11 +++++++++++
 2 files changed, 13 insertions(+), 1 deletion(-)

diff --git a/Source/cmInstallCommand.cxx b/Source/cmInstallCommand.cxx
index 86ab85a..4912eac 100644
--- a/Source/cmInstallCommand.cxx
+++ b/Source/cmInstallCommand.cxx
@@ -976,7 +976,8 @@ bool cmInstallCommand::HandleDirectoryMode(
     } else if (doing == DoingDirs) {
       // Convert this directory to a full path.
       std::string dir = args[i];
-      if (!cmSystemTools::FileIsFullPath(dir.c_str())) {
+      std::string::size_type gpos = cmGeneratorExpression::Find(dir);
+      if (gpos != 0 && !cmSystemTools::FileIsFullPath(dir.c_str())) {
         dir = this->Makefile->GetCurrentSourceDirectory();
         dir += "/";
         dir += args[i];
diff --git a/Source/cmInstallDirectoryGenerator.cxx b/Source/cmInstallDirectoryGenerator.cxx
index 3928231..b8377fa 100644
--- a/Source/cmInstallDirectoryGenerator.cxx
+++ b/Source/cmInstallDirectoryGenerator.cxx
@@ -13,6 +13,7 @@
 
 #include "cmGeneratorExpression.h"
 #include "cmLocalGenerator.h"
+#include "cmMakefile.h"
 
 cmInstallDirectoryGenerator::cmInstallDirectoryGenerator(
   std::vector<std::string> const& dirs, const char* dest,
@@ -73,6 +74,16 @@ void cmInstallDirectoryGenerator::GenerateScriptForConfig(
     cmSystemTools::ExpandListArgument(
       cge->Evaluate(this->LocalGenerator, config), dirs);
   }
+
+  // Make sure all dirs have absolute paths.
+  const cmMakefile& makefile = *this->LocalGenerator->GetMakefile();
+  for (std::vector<std::string>::iterator i = dirs.begin(); i != dirs.end();
+       ++i) {
+    if (!cmSystemTools::FileIsFullPath(i->c_str())) {
+      *i = std::string(makefile.GetCurrentSourceDirectory()) + "/" + *i;
+    }
+  }
+
   this->AddDirectoryInstallRule(os, config, indent, dirs);
 }
 
-- 
1.9.5.msysgit.0

