Browse Source

install: Fix evaluation of leading generator expressions in DIRECTORY

Since commit v3.5.0-rc1~58^2 (install: Allow generator expressions in
DIRECTORY, 2016-01-12) we accidentally treat leading generator
expressions as relative paths even though they may evaluate to absolute
paths.  Defer the conversion to an absolute path until after evaluation.
Yves Frederix 9 years ago
parent
commit
3bd55dba7c
2 changed files with 13 additions and 1 deletions
  1. 2 1
      Source/cmInstallCommand.cxx
  2. 11 0
      Source/cmInstallDirectoryGenerator.cxx

+ 2 - 1
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];

+ 11 - 0
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.
+  cmMakefile const& mf = *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(mf.GetCurrentSourceDirectory()) + "/" + *i;
+    }
+  }
+
   this->AddDirectoryInstallRule(os, config, indent, dirs);
 }