Просмотр исходного кода

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.
Brad King 16 лет назад
Родитель
Сommit
6e8aeba415
2 измененных файлов с 21 добавлено и 0 удалено
  1. 18 0
      Source/cmConfigureFileCommand.cxx
  2. 3 0
      Source/cmConfigureFileCommand.h

+ 18 - 0
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

+ 3 - 0
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 "