| 
					
				 | 
			
			
				@@ -0,0 +1,96 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# This test checks whether adding a source file to the project triggers an AUTOMOC re-run. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+cmake_minimum_required(VERSION 3.10) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+project(RerunMocOnAddFile) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+include("../AutogenCoreTest.cmake") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# Create an executable to generate a clean target 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+set(main_source "${CMAKE_CURRENT_BINARY_DIR}/generated_main.cpp") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+file(WRITE "${main_source}" "int main() {}") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+add_executable(exe "${main_source}") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# Utility variables 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+set(timeformat "%Y.%j.%H.%M%S") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+set(testProjectTemplateDir "${CMAKE_CURRENT_SOURCE_DIR}/MocOnAddFile") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+set(testProjectSrc "${CMAKE_CURRENT_BINARY_DIR}/MocOnAddFile") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+set(testProjectBinDir "${CMAKE_CURRENT_BINARY_DIR}/MocOnAddFile-build") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# Utility macros 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+macro(sleep) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  message(STATUS "Sleeping for a few seconds.") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  execute_process(COMMAND "${CMAKE_COMMAND}" -E sleep 1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+endmacro() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+macro(acquire_timestamp When) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  file(TIMESTAMP "${mocBasicBin}" time${When} "${timeformat}") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+endmacro() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+macro(rebuild buildName) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  message(STATUS "Starting build ${buildName}.") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  execute_process(COMMAND "${CMAKE_COMMAND}" --build . WORKING_DIRECTORY "${testProjectBinDir}" RESULT_VARIABLE result) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (result) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    message(FATAL_ERROR "Build ${buildName} failed.") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  else() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    message(STATUS "Build ${buildName} finished.") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  endif() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+endmacro() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+macro(require_change) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (timeAfter VERSION_GREATER timeBefore) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    message(STATUS "As expected the file ${mocBasicBin} changed.") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  else() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    message(SEND_ERROR "Unexpectedly the file ${mocBasicBin} did not change!\nTimestamp pre: ${timeBefore}\nTimestamp aft: ${timeAfter}\n") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  endif() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+endmacro() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+macro(require_change_not) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (timeAfter VERSION_GREATER timeBefore) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    message(SEND_ERROR "Unexpectedly the file ${mocBasicBin} changed!\nTimestamp pre: ${timeBefore}\nTimestamp aft: ${timeAfter}\n") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  else() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    message(STATUS "As expected the file ${mocBasicBin} did not change.") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  endif() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+endmacro() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# Create the test project from the template 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+unset(additional_project_sources) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+unset(main_cpp_includes) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+configure_file("${testProjectTemplateDir}/CMakeLists.txt.in" "${testProjectSrc}/CMakeLists.txt") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+configure_file("${testProjectTemplateDir}/main.cpp.in" "${testProjectSrc}/main.cpp") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# Initial build 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+try_compile(MOC_RERUN 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  "${testProjectBinDir}" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  "${testProjectSrc}" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  MocOnAddFile 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  CMAKE_FLAGS "-DQT_TEST_VERSION=${QT_TEST_VERSION}" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              "-DCMAKE_AUTOGEN_VERBOSE=${CMAKE_AUTOGEN_VERBOSE}" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              "-DQT_QMAKE_EXECUTABLE:FILEPATH=${QT_QMAKE_EXECUTABLE}" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  OUTPUT_VARIABLE output 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+if (NOT MOC_RERUN) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  message(FATAL_ERROR "Initial build of mocOnAddFile failed. Output: ${output}") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+endif() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# Sleep to ensure new timestamps 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+sleep() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# Add a QObject class (defined in header) to the project and build 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+set(additional_project_sources myobject.cpp) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+set(main_cpp_includes "#include \"myobject.h\"") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+configure_file("${testProjectTemplateDir}/CMakeLists.txt.in" "${testProjectSrc}/CMakeLists.txt" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @ONLY) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+configure_file("${testProjectTemplateDir}/main.cpp.in" "${testProjectSrc}/main.cpp" @ONLY) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+configure_file("${testProjectTemplateDir}/myobject.h" "${testProjectSrc}/myobject.h" COPYONLY) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+configure_file("${testProjectTemplateDir}/myobject.cpp" "${testProjectSrc}/myobject.cpp" COPYONLY) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+rebuild(2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# Sleep to ensure new timestamps 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+sleep() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# Add a QObject class (defined in source) to the project and build 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+set(additional_project_sources myobject.cpp anotherobject.cpp) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+configure_file("${testProjectTemplateDir}/CMakeLists.txt.in" "${testProjectSrc}/CMakeLists.txt" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @ONLY) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+configure_file("${testProjectTemplateDir}/anotherobject.cpp" "${testProjectSrc}/anotherobject.cpp" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    COPYONLY) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+rebuild(3) 
			 |