Browse Source

cmMakefile: Fix ConfigureString not passing filename and line

It enables to use CMAKE_CURRENT_LIST_LINE in string(CONFIGURE)
Added tests for it for ${} and @@ notattion for old CMP0053
and ${} for new
Artur Ryt 7 years ago
parent
commit
dda4755b46

+ 9 - 2
Source/cmMakefile.cxx

@@ -3648,8 +3648,15 @@ void cmMakefile::ConfigureString(const std::string& input, std::string& output,
   }
 
   // Perform variable replacements.
-  this->ExpandVariablesInString(output, escapeQuotes, true, atOnly, nullptr,
-                                -1, true, true);
+  const char* filename = nullptr;
+  long lineNumber = -1;
+  if (!this->Backtrace.Empty()) {
+    const auto& currentTrace = this->Backtrace.Top();
+    filename = currentTrace.FilePath.c_str();
+    lineNumber = currentTrace.Line;
+  }
+  this->ExpandVariablesInString(output, escapeQuotes, true, atOnly, filename,
+                                lineNumber, true, true);
 }
 
 int cmMakefile::ConfigureFile(const char* infile, const char* outfile,

+ 1 - 1
Tests/CMakeTests/StringTest.cmake.in

@@ -81,7 +81,7 @@ check_cmake_test(String
 # Execute each test listed in StringTestScript.cmake:
 #
 set(scriptname "@CMAKE_CURRENT_SOURCE_DIR@/StringTestScript.cmake")
-set(number_of_tests_expected 70)
+set(number_of_tests_expected 73)
 
 include("@CMAKE_CURRENT_SOURCE_DIR@/ExecuteScriptTests.cmake")
 execute_all_script_tests(${scriptname} number_of_tests_executed)

+ 22 - 0
Tests/CMakeTests/StringTestScript.cmake

@@ -1,5 +1,18 @@
 message(STATUS "testname='${testname}'")
 
+function(test_configure_line_number EXPRESSION POLICY)
+  cmake_policy(PUSH)
+  cmake_policy(SET CMP0053 ${POLICY})
+  string(CONFIGURE
+  "${EXPRESSION}" v) # line should indicate string() call
+  math(EXPR vplus3 "${v} + 3")
+  if(NOT ${CMAKE_CURRENT_LIST_LINE} EQUAL ${vplus3})
+    message(SEND_ERROR "Couldn't configure CMAKE_CURRENT_LIST_LINE, evaluated into '${v}'")
+  endif()
+  message(STATUS "v='${v}'")
+  cmake_policy(POP)
+endfunction()
+
 if(testname STREQUAL empty) # fail
   string()
 
@@ -32,6 +45,15 @@ elseif(testname STREQUAL configure_escape_quotes) # pass
   string(CONFIGURE "this is @testname@" v ESCAPE_QUOTES)
   message(STATUS "v='${v}'")
 
+elseif(testname STREQUAL configure_line_number_CMP0053_old) # pass
+  test_configure_line_number("\${CMAKE_CURRENT_LIST_LINE}" OLD)
+
+elseif(testname STREQUAL configure_line_number_CMP0053_new) # pass
+  test_configure_line_number("\${CMAKE_CURRENT_LIST_LINE}" NEW)
+
+elseif(testname STREQUAL configure_line_number_CMP0053_old_use_at) # pass
+  test_configure_line_number("\@CMAKE_CURRENT_LIST_LINE\@" OLD)
+
 elseif(testname STREQUAL configure_bogus) # fail
   string(CONFIGURE "this is @testname@" v ESCAPE_QUOTES BOGUS)