Pārlūkot izejas kodu

automoc: fix #13018, proper cmake escaping to avoid false rebuilds

The variables stored in the AutomocInfo.cmake file were not properly
escaped, so when reading them back they could turn into lists, if they
contained double quotes initially.
This patch fixes this by using cmLocalGenerator::EscapeForCMake() to
escape the variables properly.

Alex
Alex Neundorf 13 gadi atpakaļ
vecāks
revīzija
2066511ca9
2 mainītis faili ar 24 papildinājumiem un 16 dzēšanām
  1. 7 7
      Modules/AutomocInfo.cmake.in
  2. 17 9
      Source/cmQtAutomoc.cxx

+ 7 - 7
Modules/AutomocInfo.cmake.in

@@ -1,9 +1,9 @@
-set(AM_SOURCES "@_moc_files@" )
-set(AM_HEADERS "@_moc_headers@" )
-set(AM_MOC_COMPILE_DEFINITIONS "@_moc_compile_defs@")
-set(AM_MOC_DEFINITIONS "@_moc_defs@")
-set(AM_MOC_INCLUDES "@_moc_incs@")
-set(AM_MOC_OPTIONS "@_moc_options@")
+set(AM_SOURCES @_moc_files@ )
+set(AM_HEADERS @_moc_headers@ )
+set(AM_MOC_COMPILE_DEFINITIONS @_moc_compile_defs@)
+set(AM_MOC_DEFINITIONS @_moc_defs@)
+set(AM_MOC_INCLUDES @_moc_incs@)
+set(AM_MOC_OPTIONS @_moc_options@)
 set(AM_CMAKE_INCLUDE_DIRECTORIES_PROJECT_BEFORE "@CMAKE_INCLUDE_DIRECTORIES_PROJECT_BEFORE@")
 set(AM_CMAKE_BINARY_DIR "@CMAKE_BINARY_DIR@/")
 set(AM_CMAKE_SOURCE_DIR "@CMAKE_SOURCE_DIR@/")
@@ -12,5 +12,5 @@ set(AM_CMAKE_CURRENT_SOURCE_DIR "@CMAKE_CURRENT_SOURCE_DIR@/")
 set(AM_CMAKE_CURRENT_BINARY_DIR "@CMAKE_CURRENT_BINARY_DIR@/")
 set(AM_QT_VERSION_MAJOR "@QT_VERSION_MAJOR@" )
 set(AM_Qt5Core_VERSION_MAJOR "@Qt5Core_VERSION_MAJOR@" )
-set(AM_TARGET_NAME "@_moc_target_name@")
+set(AM_TARGET_NAME @_moc_target_name@)
 set(AM_RELAXED_MODE "@_moc_relaxed_mode@")

+ 17 - 9
Source/cmQtAutomoc.cxx

@@ -202,13 +202,20 @@ void cmQtAutomoc::SetupAutomocTarget(cmTarget* target)
   cmMakefile::ScopePushPop varScope(makefile);
   static_cast<void>(varScope);
 
-  makefile->AddDefinition("_moc_target_name", automocTargetName.c_str());
-  makefile->AddDefinition("_moc_incs", _moc_incs.c_str());
-  makefile->AddDefinition("_moc_defs", _moc_defs.c_str());
-  makefile->AddDefinition("_moc_compile_defs", _moc_compile_defs.c_str());
-  makefile->AddDefinition("_moc_options", _moc_options.c_str());
-  makefile->AddDefinition("_moc_files", _moc_files.c_str());
-  makefile->AddDefinition("_moc_headers", _moc_headers.c_str());
+  makefile->AddDefinition("_moc_target_name",
+          cmLocalGenerator::EscapeForCMake(automocTargetName.c_str()).c_str());
+  makefile->AddDefinition("_moc_incs",
+          cmLocalGenerator::EscapeForCMake(_moc_incs.c_str()).c_str());
+  makefile->AddDefinition("_moc_defs",
+          cmLocalGenerator::EscapeForCMake(_moc_defs.c_str()).c_str());
+  makefile->AddDefinition("_moc_compile_defs",
+          cmLocalGenerator::EscapeForCMake(_moc_compile_defs.c_str()).c_str());
+  makefile->AddDefinition("_moc_options",
+          cmLocalGenerator::EscapeForCMake(_moc_options.c_str()).c_str());
+  makefile->AddDefinition("_moc_files",
+          cmLocalGenerator::EscapeForCMake(_moc_files.c_str()).c_str());
+  makefile->AddDefinition("_moc_headers",
+          cmLocalGenerator::EscapeForCMake(_moc_headers.c_str()).c_str());
   makefile->AddDefinition("_moc_relaxed_mode", relaxedMode ? "TRUE" : "FALSE");
 
   const char* cmakeRoot = makefile->GetSafeDefinition("CMAKE_ROOT");
@@ -340,8 +347,9 @@ void cmQtAutomoc::WriteOldMocDefinitionsFile(const char* targetDirectory)
   std::fstream outfile;
   outfile.open(filename.c_str(),
                std::ios::out | std::ios::trunc);
-  outfile << "set(AM_OLD_MOC_DEFINITIONS \""
-              << this->Join(this->MocDefinitions, ' ') << "\")\n";
+  outfile << "set(AM_OLD_MOC_DEFINITIONS "
+              << cmLocalGenerator::EscapeForCMake(
+                       this->Join(this->MocDefinitions, ' ').c_str()) << ")\n";
 
   outfile.close();
 }