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.
This commit is contained in:
Yves Frederix 2016-08-29 22:24:55 +02:00 committed by Brad King
parent 0a2d0b126c
commit 3bd55dba7c
2 changed files with 13 additions and 1 deletions

View File

@ -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];

View File

@ -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);
}