summaryrefslogtreecommitdiffstats
path: root/Source
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2009-09-16 19:09:42 (GMT)
committerBrad King <brad.king@kitware.com>2009-09-16 19:09:42 (GMT)
commit6e8aeba41502f128cf27457f333dc85f1fe66638 (patch)
treee2befb28d2d902d502f2b642d402353944cc5aeb /Source
parent700cdf393af6aec04917a190122d7d46a1ba720e (diff)
downloadCMake-6e8aeba41502f128cf27457f333dc85f1fe66638.zip
CMake-6e8aeba41502f128cf27457f333dc85f1fe66638.tar.gz
CMake-6e8aeba41502f128cf27457f333dc85f1fe66638.tar.bz2
Teach configure_file to handle directory names
This commit teaches configure_file how to handle directories for input and output. It is an error if the input is a directory. If the output is a directory we put the configured copy of the input file in it with the same name. See issue #9537.
Diffstat (limited to 'Source')
-rw-r--r--Source/cmConfigureFileCommand.cxx18
-rw-r--r--Source/cmConfigureFileCommand.h3
2 files changed, 21 insertions, 0 deletions
diff --git a/Source/cmConfigureFileCommand.cxx b/Source/cmConfigureFileCommand.cxx
index 051fe28..d6f2b68 100644
--- a/Source/cmConfigureFileCommand.cxx
+++ b/Source/cmConfigureFileCommand.cxx
@@ -36,6 +36,17 @@ bool cmConfigureFileCommand
}
this->InputFile += inFile;
+ // If the input location is a directory, error out.
+ if(cmSystemTools::FileIsDirectory(this->InputFile.c_str()))
+ {
+ cmOStringStream e;
+ e << "input location\n"
+ << " " << this->InputFile << "\n"
+ << "is a directory but a file was expected.";
+ this->SetError(e.str().c_str());
+ return false;
+ }
+
const char* outFile = args[1].c_str();
if(!cmSystemTools::FileIsFullPath(outFile))
{
@@ -44,6 +55,13 @@ bool cmConfigureFileCommand
}
this->OutputFile += outFile;
+ // If the output location is already a directory put the file in it.
+ if(cmSystemTools::FileIsDirectory(this->OutputFile.c_str()))
+ {
+ this->OutputFile += "/";
+ this->OutputFile += cmSystemTools::GetFilenameName(inFile);
+ }
+
if ( !this->Makefile->CanIWriteThisFile(this->OutputFile.c_str()) )
{
std::string e = "attempted to configure a file: " + this->OutputFile
diff --git a/Source/cmConfigureFileCommand.h b/Source/cmConfigureFileCommand.h
index 58ce10a..da93ec9 100644
--- a/Source/cmConfigureFileCommand.h
+++ b/Source/cmConfigureFileCommand.h
@@ -66,8 +66,11 @@ public:
"values referenced in the file content. "
"If <input> is a relative path it is evaluated with respect to "
"the current source directory. "
+ "The <input> must be a file, not a directory. "
"If <output> is a relative path it is evaluated with respect to "
"the current binary directory. "
+ "If <output> names an existing directory the input file is placed "
+ "in that directory with its original name. "
"\n"
"This command replaces any variables in the input file referenced as "
"${VAR} or @VAR@ with their values as determined by CMake. If a "