From 3bd55dba7c889776bd094c6c29045c567b9000e2 Mon Sep 17 00:00:00 2001 From: Yves Frederix Date: Mon, 29 Aug 2016 22:24:55 +0200 Subject: [PATCH] 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. --- 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 86ab85aee..4912eacdd 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 3928231f0..469b1193d 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 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::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); }