Browse Source

Merge topic 'fix-file-generate-cmp0070'

462b6d83e8 file(GENERATE): Test source properties
1977f7833b file(GENERATE): Update existing tests
04fbd7566a file(GENERATE): Fix missing check for policy CMP0070
2dc2732f67 file(GENERATE): Refactor outputFileName calculation
a9602bb41e file(GENERATE): Refactor inputFileName calculation

Acked-by: Kitware Robot <[email protected]>
Merge-request: !5090
Brad King 5 năm trước cách đây
mục cha
commit
2a8f363a54

+ 32 - 16
Source/cmGeneratorExpressionEvaluationFile.cxx

@@ -54,17 +54,10 @@ void cmGeneratorExpressionEvaluationFile::Generate(
     }
   }
 
-  std::string outputFileName = this->OutputFileExpr->Evaluate(
-    lg, config, nullptr, nullptr, nullptr, lang);
+  const std::string outputFileName = this->GetOutputFileName(lg, config, lang);
   const std::string& outputContent =
     inputExpression->Evaluate(lg, config, nullptr, nullptr, nullptr, lang);
 
-  if (cmSystemTools::FileIsFullPath(outputFileName)) {
-    outputFileName = cmSystemTools::CollapseFullPath(outputFileName);
-  } else {
-    outputFileName = this->FixRelativePath(outputFileName, PathForOutput, lg);
-  }
-
   auto it = outputFiles.find(outputFileName);
 
   if (it != outputFiles.end()) {
@@ -101,8 +94,7 @@ void cmGeneratorExpressionEvaluationFile::CreateOutputFile(
   gg->GetEnabledLanguages(enabledLanguages);
 
   for (std::string const& le : enabledLanguages) {
-    std::string name = this->OutputFileExpr->Evaluate(lg, config, nullptr,
-                                                      nullptr, nullptr, le);
+    std::string const name = this->GetOutputFileName(lg, config, le);
     cmSourceFile* sf = lg->GetMakefile()->GetOrCreateSource(
       name, false, cmSourceFileLocationKind::Known);
     // Tell TraceDependencies that the file is not expected to exist
@@ -125,12 +117,7 @@ void cmGeneratorExpressionEvaluationFile::Generate(cmLocalGenerator* lg)
   if (this->InputIsContent) {
     inputContent = this->Input;
   } else {
-    std::string inputFileName = this->Input;
-    if (cmSystemTools::FileIsFullPath(inputFileName)) {
-      inputFileName = cmSystemTools::CollapseFullPath(inputFileName);
-    } else {
-      inputFileName = this->FixRelativePath(inputFileName, PathForInput, lg);
-    }
+    const std::string inputFileName = this->GetInputFileName(lg);
     lg->GetMakefile()->AddCMakeDependFile(inputFileName);
     cmSystemTools::GetPermissions(inputFileName.c_str(), perm);
     cmsys::ifstream fin(inputFileName.c_str());
@@ -174,6 +161,35 @@ void cmGeneratorExpressionEvaluationFile::Generate(cmLocalGenerator* lg)
   }
 }
 
+std::string cmGeneratorExpressionEvaluationFile::GetInputFileName(
+  cmLocalGenerator* lg)
+{
+  std::string inputFileName = this->Input;
+
+  if (cmSystemTools::FileIsFullPath(inputFileName)) {
+    inputFileName = cmSystemTools::CollapseFullPath(inputFileName);
+  } else {
+    inputFileName = this->FixRelativePath(inputFileName, PathForInput, lg);
+  }
+
+  return inputFileName;
+}
+
+std::string cmGeneratorExpressionEvaluationFile::GetOutputFileName(
+  cmLocalGenerator* lg, const std::string& config, const std::string& lang)
+{
+  std::string outputFileName = this->OutputFileExpr->Evaluate(
+    lg, config, nullptr, nullptr, nullptr, lang);
+
+  if (cmSystemTools::FileIsFullPath(outputFileName)) {
+    outputFileName = cmSystemTools::CollapseFullPath(outputFileName);
+  } else {
+    outputFileName = this->FixRelativePath(outputFileName, PathForOutput, lg);
+  }
+
+  return outputFileName;
+}
+
 std::string cmGeneratorExpressionEvaluationFile::FixRelativePath(
   std::string const& relativePath, PathRole role, cmLocalGenerator* lg)
 {

+ 4 - 0
Source/cmGeneratorExpressionEvaluationFile.h

@@ -38,6 +38,10 @@ private:
                 cmCompiledGeneratorExpression* inputExpression,
                 std::map<std::string, std::string>& outputFiles, mode_t perm);
 
+  std::string GetInputFileName(cmLocalGenerator* lg);
+  std::string GetOutputFileName(cmLocalGenerator* lg,
+                                const std::string& config,
+                                const std::string& lang);
   enum PathRole
   {
     PathForInput,

+ 15 - 1
Tests/RunCMake/File_Generate/CMP0070-WARN-stderr.txt

@@ -1,4 +1,18 @@
-^CMake Warning \(dev\) in CMakeLists.txt:
+^(CMake Warning \(dev\) in CMakeLists.txt:
+  Policy CMP0070 is not set: Define file\(GENERATE\) behavior for relative
+  paths.  Run "cmake --help-policy CMP0070" for policy details.  Use the
+  cmake_policy command to set the policy and suppress this warning.
+
+  file\(GENERATE\) given relative OUTPUT path:
+
+    relative-output-WARN.txt
+
+  This is not defined behavior unless CMP0070 is set to NEW.  For
+  compatibility with older versions of CMake, the previous undefined behavior
+  will be used.
+This warning is for project developers.  Use -Wno-dev to suppress it.
++)+
+CMake Warning \(dev\) in CMakeLists.txt:
   Policy CMP0070 is not set: Define file\(GENERATE\) behavior for relative
   paths.  Run "cmake --help-policy CMP0070" for policy details.  Use the
   cmake_policy command to set the policy and suppress this warning.

+ 4 - 0
Tests/RunCMake/File_Generate/RunCMakeTest.cmake

@@ -4,6 +4,10 @@ run_cmake(CMP0070-NEW)
 run_cmake(CMP0070-OLD)
 run_cmake(CMP0070-WARN)
 
+run_cmake(SourceProperty)
+run_cmake(SourceProperty-CMP0070-NEW)
+run_cmake(SourceProperty-CMP0070-OLD)
+
 run_cmake(CommandConflict)
 if(RunCMake_GENERATOR_IS_MULTI_CONFIG)
   run_cmake(OutputConflict)

+ 1 - 0
Tests/RunCMake/File_Generate/SourceProperty-CMP0070-NEW-result.txt

@@ -0,0 +1 @@
+1

+ 11 - 0
Tests/RunCMake/File_Generate/SourceProperty-CMP0070-NEW-stderr.txt

@@ -0,0 +1,11 @@
+^CMake Error at SourceProperty-CMP0070-NEW.cmake:[0-9]+ \(add_library\):
+  Cannot find source file:
+
+.*\/relative-output-NEW\.c
+
+  Tried extensions \.c \.C.*
+Call Stack \(most recent call first\):
+  CMakeLists.txt:[0-9]+ \(include\)
+
+
+CMake Generate step failed.  Build files cannot be regenerated correctly.$

+ 8 - 0
Tests/RunCMake/File_Generate/SourceProperty-CMP0070-NEW.cmake

@@ -0,0 +1,8 @@
+enable_language(C)
+add_library(foo)
+
+cmake_policy(SET CMP0070 NEW)
+file(GENERATE OUTPUT relative-output-NEW.c CONTENT "")
+target_sources(foo PRIVATE
+  "${CMAKE_CURRENT_SOURCE_DIR}/relative-output-NEW.c"
+)

+ 1 - 0
Tests/RunCMake/File_Generate/SourceProperty-CMP0070-OLD-result.txt

@@ -0,0 +1 @@
+1

+ 23 - 0
Tests/RunCMake/File_Generate/SourceProperty-CMP0070-OLD-stderr.txt

@@ -0,0 +1,23 @@
+^CMake Deprecation Warning at SourceProperty-CMP0070-OLD.cmake:[0-9]+ \(cmake_policy\):
+  The OLD behavior for policy CMP0070 will be removed from a future version
+  of CMake.
+
+  The cmake-policies\(7\) manual explains that the OLD behaviors of all
+  policies are deprecated and that a policy should be set to OLD only under
+  specific short-term circumstances.  Projects should be ported to the NEW
+  behavior and not rely on setting a policy to OLD.
+Call Stack \(most recent call first\):
+  CMakeLists.txt:[0-9]+ \(include\)
+
+
+CMake Error at SourceProperty-CMP0070-OLD.cmake:[0-9]+ \(add_library\):
+  Cannot find source file:
+
+.*\/relative-output-OLD\.c
+
+  Tried extensions \.c \.C.*
+Call Stack \(most recent call first\):
+  CMakeLists.txt:[0-9]+ \(include\)
+
+
+CMake Generate step failed.  Build files cannot be regenerated correctly.$

+ 8 - 0
Tests/RunCMake/File_Generate/SourceProperty-CMP0070-OLD.cmake

@@ -0,0 +1,8 @@
+enable_language(C)
+add_library(foo)
+
+cmake_policy(SET CMP0070 OLD)
+file(GENERATE OUTPUT relative-output-OLD.c CONTENT "")
+target_sources(foo PRIVATE
+  "${CMAKE_CURRENT_BINARY_DIR}/relative-output-OLD.c"
+)

+ 10 - 0
Tests/RunCMake/File_Generate/SourceProperty-stderr.txt

@@ -0,0 +1,10 @@
+^CMake Deprecation Warning at SourceProperty.cmake:[0-9]+ \(cmake_policy\):
+  The OLD behavior for policy CMP0070 will be removed from a future version
+  of CMake.
+
+  The cmake-policies\(7\) manual explains that the OLD behaviors of all
+  policies are deprecated and that a policy should be set to OLD only under
+  specific short-term circumstances.  Projects should be ported to the NEW
+  behavior and not rely on setting a policy to OLD.
+Call Stack \(most recent call first\):
+  CMakeLists.txt:[0-9]+ \(include\)$

+ 14 - 0
Tests/RunCMake/File_Generate/SourceProperty.cmake

@@ -0,0 +1,14 @@
+enable_language(C)
+add_library(SourceProperty)
+
+cmake_policy(SET CMP0070 OLD)
+file(GENERATE OUTPUT relative-output-OLD.c CONTENT "")
+target_sources(SourceProperty PRIVATE
+  "${CMAKE_CURRENT_SOURCE_DIR}/relative-output-OLD.c"
+)
+
+cmake_policy(SET CMP0070 NEW)
+file(GENERATE OUTPUT relative-output-NEW.c CONTENT "")
+target_sources(SourceProperty PRIVATE
+  "${CMAKE_CURRENT_BINARY_DIR}/relative-output-NEW.c"
+)