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.
This commit is contained in:
Brad King 2009-09-16 15:09:42 -04:00
parent 700cdf393a
commit 6e8aeba415
2 changed files with 21 additions and 0 deletions

View File

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

View File

@ -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 "