From c652812af741c2468ad5b58e789244700aa51be5 Mon Sep 17 00:00:00 2001 From: Alex Neundorf Date: Tue, 20 Mar 2012 22:50:44 +0100 Subject: make cmLocalGenerator::EscapeForCMake() static This way it can be used also if there is no cmLocalGenerator instance around Alex --- Source/cmLocalGenerator.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/cmLocalGenerator.h b/Source/cmLocalGenerator.h index 124747b..3e93819 100644 --- a/Source/cmLocalGenerator.h +++ b/Source/cmLocalGenerator.h @@ -251,7 +251,7 @@ public: std::string EscapeForShellOldStyle(const char* str); /** Escape the given string as an argument in a CMake script. */ - std::string EscapeForCMake(const char* str); + static std::string EscapeForCMake(const char* str); enum FortranFormat { -- cgit v0.12 From 2066511ca9a0b86d45e07357ebec8dd07f1c93b9 Mon Sep 17 00:00:00 2001 From: Alex Neundorf Date: Tue, 20 Mar 2012 22:52:05 +0100 Subject: 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 --- Modules/AutomocInfo.cmake.in | 14 +++++++------- Source/cmQtAutomoc.cxx | 26 +++++++++++++++++--------- 2 files changed, 24 insertions(+), 16 deletions(-) diff --git a/Modules/AutomocInfo.cmake.in b/Modules/AutomocInfo.cmake.in index 29dab97..13f2161 100644 --- a/Modules/AutomocInfo.cmake.in +++ b/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@") diff --git a/Source/cmQtAutomoc.cxx b/Source/cmQtAutomoc.cxx index 0d0d80c..8b899bc 100644 --- a/Source/cmQtAutomoc.cxx +++ b/Source/cmQtAutomoc.cxx @@ -202,13 +202,20 @@ void cmQtAutomoc::SetupAutomocTarget(cmTarget* target) cmMakefile::ScopePushPop varScope(makefile); static_cast(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(); } -- cgit v0.12 From 9b32475587c1b7a911e5c635611c1fe5296b8740 Mon Sep 17 00:00:00 2001 From: Alex Neundorf Date: Mon, 26 Mar 2012 22:11:46 +0200 Subject: automoc: add define to test which caused bug #13018 This does not really test that the bug is fixed, but at least it makes it easy to check manually whether the bug is there or not. I have to see whether I can build a test which does test that a target is not rebuilt everytime. Alex --- Tests/QtAutomoc/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/QtAutomoc/CMakeLists.txt b/Tests/QtAutomoc/CMakeLists.txt index d255a5a..5e3686d 100644 --- a/Tests/QtAutomoc/CMakeLists.txt +++ b/Tests/QtAutomoc/CMakeLists.txt @@ -8,7 +8,7 @@ include(UseQt4) include_directories(${CMAKE_CURRENT_BINARY_DIR}) -add_definitions(-DFOO) +add_definitions(-DFOO -DSomeDefine="Barx") # enable relaxed mode so automoc can handle all the special cases: set(CMAKE_AUTOMOC_RELAXED_MODE TRUE) -- cgit v0.12