Explorar o código

file: Normalize GENERATE command input and output file paths

Normalize absolute paths so that no extra components like `../` or
`...//...` appear that later confuse relative path computation.
In particular, we expect paths sent to AddCMakeDependFile and
AddCMakeOutputFile to be normalized.

Do this only for paths that are already absolute because
we can't handle relative paths yet (see #16786).

Fixes: #16892
Brad King %!s(int64=8) %!d(string=hai) anos
pai
achega
c41a7c7d90
Modificáronse 1 ficheiros con 13 adicións e 5 borrados
  1. 13 5
      Source/cmGeneratorExpressionEvaluationFile.cxx

+ 13 - 5
Source/cmGeneratorExpressionEvaluationFile.cxx

@@ -51,11 +51,15 @@ void cmGeneratorExpressionEvaluationFile::Generate(
     }
   }
 
-  const std::string outputFileName = this->OutputFileExpr->Evaluate(
+  std::string outputFileName = this->OutputFileExpr->Evaluate(
     lg, config, false, CM_NULLPTR, CM_NULLPTR, CM_NULLPTR, lang);
   const std::string outputContent = inputExpression->Evaluate(
     lg, config, false, CM_NULLPTR, CM_NULLPTR, CM_NULLPTR, lang);
 
+  if (cmSystemTools::FileIsFullPath(outputFileName)) {
+    outputFileName = cmSystemTools::CollapseFullPath(outputFileName);
+  }
+
   std::map<std::string, std::string>::iterator it =
     outputFiles.find(outputFileName);
 
@@ -111,12 +115,16 @@ void cmGeneratorExpressionEvaluationFile::Generate(cmLocalGenerator* lg)
   if (this->InputIsContent) {
     inputContent = this->Input;
   } else {
-    lg->GetMakefile()->AddCMakeDependFile(this->Input);
-    cmSystemTools::GetPermissions(this->Input.c_str(), perm);
-    cmsys::ifstream fin(this->Input.c_str());
+    std::string inputFileName = this->Input;
+    if (cmSystemTools::FileIsFullPath(inputFileName)) {
+      inputFileName = cmSystemTools::CollapseFullPath(inputFileName);
+    }
+    lg->GetMakefile()->AddCMakeDependFile(inputFileName);
+    cmSystemTools::GetPermissions(inputFileName.c_str(), perm);
+    cmsys::ifstream fin(inputFileName.c_str());
     if (!fin) {
       std::ostringstream e;
-      e << "Evaluation file \"" << this->Input << "\" cannot be read.";
+      e << "Evaluation file \"" << inputFileName << "\" cannot be read.";
       lg->IssueMessage(cmake::FATAL_ERROR, e.str());
       return;
     }