Browse Source

Autogen: Move repeated tests to new QtAutogenRerun test

By moving QtAutogen tests that run repeatedly to a new QtAutogenRerun
test, the `ctest -R Qt[45]Autogen -j4` call runs approximately 25%
faster.
Sebastian Holtermann 8 years ago
parent
commit
0e434fcf04
39 changed files with 322 additions and 206 deletions
  1. 36 3
      Tests/CMakeLists.txt
  2. 0 203
      Tests/QtAutogen/CMakeLists.txt
  3. 239 0
      Tests/QtAutogenRerun/CMakeLists.txt
  4. 4 0
      Tests/QtAutogenRerun/defines_test/CMakeLists.txt
  5. 38 0
      Tests/QtAutogenRerun/defines_test/defines_test.cpp
  6. 5 0
      Tests/QtAutogenRerun/dummy.cpp
  7. 0 0
      Tests/QtAutogenRerun/mocPlugin/CMakeLists.txt
  8. 0 0
      Tests/QtAutogenRerun/mocPlugin/StyleA.cpp
  9. 0 0
      Tests/QtAutogenRerun/mocPlugin/StyleA.hpp
  10. 0 0
      Tests/QtAutogenRerun/mocPlugin/StyleA.json
  11. 0 0
      Tests/QtAutogenRerun/mocPlugin/StyleA_Custom.json
  12. 0 0
      Tests/QtAutogenRerun/mocPlugin/StyleB.cpp
  13. 0 0
      Tests/QtAutogenRerun/mocPlugin/StyleB.hpp
  14. 0 0
      Tests/QtAutogenRerun/mocPlugin/StyleC.cpp
  15. 0 0
      Tests/QtAutogenRerun/mocPlugin/StyleC.hpp
  16. 0 0
      Tests/QtAutogenRerun/mocPlugin/StyleCommon.hpp
  17. 0 0
      Tests/QtAutogenRerun/mocPlugin/StyleD.cpp
  18. 0 0
      Tests/QtAutogenRerun/mocPlugin/StyleD.hpp
  19. 0 0
      Tests/QtAutogenRerun/mocPlugin/StyleE.cpp
  20. 0 0
      Tests/QtAutogenRerun/mocPlugin/StyleE.hpp
  21. 0 0
      Tests/QtAutogenRerun/mocPlugin/jsonIn/StyleB.json
  22. 0 0
      Tests/QtAutogenRerun/mocPlugin/jsonIn/StyleB_Custom.json
  23. 0 0
      Tests/QtAutogenRerun/mocPlugin/jsonIn/StyleC.json
  24. 0 0
      Tests/QtAutogenRerun/mocPlugin/jsonIn/StyleD.json
  25. 0 0
      Tests/QtAutogenRerun/mocPlugin/main.cpp
  26. 0 0
      Tests/QtAutogenRerun/mocRerun/CMakeLists.txt
  27. 0 0
      Tests/QtAutogenRerun/mocRerun/input.txt
  28. 0 0
      Tests/QtAutogenRerun/mocRerun/main.cpp.in
  29. 0 0
      Tests/QtAutogenRerun/mocRerun/res1.qrc
  30. 0 0
      Tests/QtAutogenRerun/mocRerun/test1a.h.in
  31. 0 0
      Tests/QtAutogenRerun/mocRerun/test1b.h.in
  32. 0 0
      Tests/QtAutogenRerun/rccDepends/CMakeLists.txt
  33. 0 0
      Tests/QtAutogenRerun/rccDepends/main.cpp
  34. 0 0
      Tests/QtAutogenRerun/rccDepends/res/input1.txt.in
  35. 0 0
      Tests/QtAutogenRerun/rccDepends/res/input2.txt.in
  36. 0 0
      Tests/QtAutogenRerun/rccDepends/res1a.qrc.in
  37. 0 0
      Tests/QtAutogenRerun/rccDepends/res1b.qrc.in
  38. 0 0
      Tests/QtAutogenRerun/rccDepends/res2a.qrc.in
  39. 0 0
      Tests/QtAutogenRerun/rccDepends/res2b.qrc.in

+ 36 - 3
Tests/CMakeLists.txt

@@ -1285,12 +1285,28 @@ ${CMake_BINARY_DIR}/bin/cmake -DDIR=dev -P ${CMake_SOURCE_DIR}/Utilities/Release
       --build-exe-dir "${CMake_BINARY_DIR}/Tests/Qt5Autogen"
       --force-new-ctest-process
       --build-options ${build_options}
-        -DQT_QMAKE_EXECUTABLE:FILEPATH=${QT_QMAKE_EXECUTABLE} -DQT_TEST_VERSION=5
+        -DQT_QMAKE_EXECUTABLE:FILEPATH=${QT_QMAKE_EXECUTABLE}
+        -DQT_TEST_VERSION=5
         ${QtAutogen_BUILD_OPTIONS}
       --test-command ${run_autogen_test}
       )
     list(APPEND TEST_BUILD_DIRS "${CMake_BINARY_DIR}/Tests/Qt5Autogen")
 
+    add_test(NAME Qt5AutogenRerun COMMAND ${CMAKE_CTEST_COMMAND}
+      --build-and-test
+      "${CMake_SOURCE_DIR}/Tests/QtAutogenRerun"
+      "${CMake_BINARY_DIR}/Tests/Qt5AutogenRerun"
+      ${build_generator_args}
+      --build-project QtAutogenRerun
+      --build-exe-dir "${CMake_BINARY_DIR}/Tests/Qt5AutogenRerun"
+      --force-new-ctest-process
+      --build-options ${build_options}
+        -DQT_QMAKE_EXECUTABLE:FILEPATH=${QT_QMAKE_EXECUTABLE}
+        -DQT_TEST_VERSION=5
+        ${QtAutogen_BUILD_OPTIONS}
+      )
+    list(APPEND TEST_BUILD_DIRS "${CMake_BINARY_DIR}/Tests/Qt5AutogenRerun")
+
     add_test(Qt5AutoUicInterface ${CMAKE_CTEST_COMMAND}
       --build-and-test
       "${CMake_SOURCE_DIR}/Tests/QtAutoUicInterface"
@@ -1315,12 +1331,28 @@ ${CMake_BINARY_DIR}/bin/cmake -DDIR=dev -P ${CMake_SOURCE_DIR}/Utilities/Release
       --build-exe-dir "${CMake_BINARY_DIR}/Tests/Qt4Autogen"
       --force-new-ctest-process
       --build-options ${build_options}
-        -DQT_QMAKE_EXECUTABLE:FILEPATH=${QT_QMAKE_EXECUTABLE} -DQT_TEST_VERSION=4
+        -DQT_QMAKE_EXECUTABLE:FILEPATH=${QT_QMAKE_EXECUTABLE}
+        -DQT_TEST_VERSION=4
         ${QtAutogen_BUILD_OPTIONS}
       --test-command ${run_autogen_test}
       )
     list(APPEND TEST_BUILD_DIRS "${CMake_BINARY_DIR}/Tests/Qt4Autogen")
 
+    add_test(NAME Qt4AutogenRerun COMMAND ${CMAKE_CTEST_COMMAND}
+      --build-and-test
+      "${CMake_SOURCE_DIR}/Tests/QtAutogenRerun"
+      "${CMake_BINARY_DIR}/Tests/Qt4AutogenRerun"
+      ${build_generator_args}
+      --build-project QtAutogenRerun
+      --build-exe-dir "${CMake_BINARY_DIR}/Tests/Qt4AutogenRerun"
+      --force-new-ctest-process
+      --build-options ${build_options}
+        -DQT_QMAKE_EXECUTABLE:FILEPATH=${QT_QMAKE_EXECUTABLE}
+        -DQT_TEST_VERSION=4
+        ${QtAutogen_BUILD_OPTIONS}
+      )
+    list(APPEND TEST_BUILD_DIRS "${CMake_BINARY_DIR}/Tests/Qt4AutogenRerun")
+
     add_test(Qt4AutoUicInterface ${CMAKE_CTEST_COMMAND}
       --build-and-test
       "${CMake_SOURCE_DIR}/Tests/QtAutoUicInterface"
@@ -1330,7 +1362,8 @@ ${CMake_BINARY_DIR}/bin/cmake -DDIR=dev -P ${CMake_SOURCE_DIR}/Utilities/Release
       --build-exe-dir "${CMake_BINARY_DIR}/Tests/Qt4AutoUicInterface"
       --force-new-ctest-process
       --build-options ${build_options}
-        -DQT_QMAKE_EXECUTABLE:FILEPATH=${QT_QMAKE_EXECUTABLE} -DQT_TEST_VERSION=4
+        -DQT_QMAKE_EXECUTABLE:FILEPATH=${QT_QMAKE_EXECUTABLE}
+        -DQT_TEST_VERSION=4
       --test-command ${run_autouic_test}
       )
     list(APPEND TEST_BUILD_DIRS "${CMake_BINARY_DIR}/Tests/Qt4AutoUicInterface")

+ 0 - 203
Tests/QtAutogen/CMakeLists.txt

@@ -2,13 +2,6 @@ cmake_minimum_required(VERSION 3.9)
 cmake_policy(SET CMP0071 NEW)
 project(QtAutogen)
 
-# Tell find_package(Qt5) where to find Qt.
-if(QT_QMAKE_EXECUTABLE)
-  get_filename_component(Qt_BIN_DIR "${QT_QMAKE_EXECUTABLE}" PATH)
-  get_filename_component(Qt_PREFIX_DIR "${Qt_BIN_DIR}" PATH)
-  set(CMAKE_PREFIX_PATH ${Qt_PREFIX_DIR})
-endif()
-
 if (QT_TEST_VERSION STREQUAL 4)
   find_package(Qt4 REQUIRED)
 
@@ -108,132 +101,6 @@ set_target_properties(no_link_language PROPERTIES AUTOMOC TRUE)
 target_compile_features(no_link_language PRIVATE ${QT_COMPILE_FEATURES})
 target_compile_features(empty PRIVATE ${QT_COMPILE_FEATURES})
 
-# -- Test
-# When a file listed in a .qrc file changes the target must be rebuilt
-set(timeformat "%Y%j%H%M%S")
-set(RCC_DEPENDS_SRC "${CMAKE_CURRENT_SOURCE_DIR}/rccDepends")
-set(RCC_DEPENDS_BIN "${CMAKE_CURRENT_BINARY_DIR}/rccDepends")
-configure_file(${RCC_DEPENDS_SRC}/res1a.qrc.in ${RCC_DEPENDS_BIN}/res1.qrc COPYONLY)
-configure_file(${RCC_DEPENDS_SRC}/res2a.qrc.in ${RCC_DEPENDS_BIN}/res2.qrc.in COPYONLY)
-try_compile(RCC_DEPENDS
-  "${RCC_DEPENDS_BIN}"
-  "${RCC_DEPENDS_SRC}"
-  rccDepends
-  CMAKE_FLAGS "-DQT_QMAKE_EXECUTABLE:FILEPATH=${QT_QMAKE_EXECUTABLE}"
-              "-DQT_TEST_VERSION=${QT_TEST_VERSION}"
-              "-DCMAKE_PREFIX_PATH=${Qt_PREFIX_DIR}"
-  OUTPUT_VARIABLE output
-)
-if (NOT RCC_DEPENDS)
-  message(SEND_ERROR "Initial build of rccDepends failed. Output: ${output}")
-endif()
-# Get name and timestamp of the output binary
-file(STRINGS "${RCC_DEPENDS_BIN}/target.txt" targetList ENCODING UTF-8)
-list(GET targetList 0 rccDependsBin)
-file(TIMESTAMP "${rccDependsBin}" timeBegin "${timeformat}")
-# Sleep, touch regular qrc input file, rebuild and compare timestamp
-execute_process(COMMAND "${CMAKE_COMMAND}" -E sleep 1) # Ensure that the timestamp will change.
-execute_process(COMMAND "${CMAKE_COMMAND}" -E touch "${RCC_DEPENDS_BIN}/res1/input.txt")
-execute_process(COMMAND "${CMAKE_COMMAND}" --build . WORKING_DIRECTORY "${RCC_DEPENDS_BIN}" RESULT_VARIABLE result)
-if (result)
-  message(SEND_ERROR "Second build of rccDepends failed.")
-endif()
-file(TIMESTAMP "${rccDependsBin}" timeStep1 "${timeformat}")
-if (NOT timeStep1 GREATER timeBegin)
-  message(SEND_ERROR "File (${rccDependsBin}) should have changed in the first step!")
-endif()
-# Sleep, update regular qrc file, rebuild and compare timestamp
-execute_process(COMMAND "${CMAKE_COMMAND}" -E sleep 1) # Ensure that the timestamp will change.
-configure_file(${RCC_DEPENDS_SRC}/res1b.qrc.in ${RCC_DEPENDS_BIN}/res1.qrc COPYONLY)
-execute_process(COMMAND "${CMAKE_COMMAND}" --build . WORKING_DIRECTORY "${RCC_DEPENDS_BIN}" RESULT_VARIABLE result)
-if (result)
-  message(SEND_ERROR "Third build of rccDepends failed.")
-endif()
-file(TIMESTAMP "${rccDependsBin}" timeStep2 "${timeformat}")
-if (NOT timeStep2 GREATER timeStep1)
-  message(SEND_ERROR "File (${rccDependsBin}) should have changed in the second step!")
-endif()
-# Sleep, touch regular qrc newly added input file, rebuild and compare timestamp
-execute_process(COMMAND "${CMAKE_COMMAND}" -E sleep 1) # Ensure that the timestamp will change.
-execute_process(COMMAND "${CMAKE_COMMAND}" -E touch "${RCC_DEPENDS_BIN}/res1/inputAdded.txt")
-execute_process(COMMAND "${CMAKE_COMMAND}" --build . WORKING_DIRECTORY "${RCC_DEPENDS_BIN}" RESULT_VARIABLE result)
-if (result)
-  message(SEND_ERROR "Fourth build of rccDepends failed.")
-endif()
-file(TIMESTAMP "${rccDependsBin}" timeStep3 "${timeformat}")
-if (NOT timeStep3 GREATER timeStep2)
-  message(SEND_ERROR "File (${rccDependsBin}) should have changed in the third step!")
-endif()
-# Sleep, touch generated qrc input file, rebuild and compare timestamp
-execute_process(COMMAND "${CMAKE_COMMAND}" -E sleep 1) # Ensure that the timestamp will change.
-execute_process(COMMAND "${CMAKE_COMMAND}" -E touch "${RCC_DEPENDS_BIN}/res2/input.txt")
-execute_process(COMMAND "${CMAKE_COMMAND}" --build . WORKING_DIRECTORY "${RCC_DEPENDS_BIN}" RESULT_VARIABLE result)
-if (result)
-  message(SEND_ERROR "Fifth build of rccDepends failed.")
-endif()
-file(TIMESTAMP "${rccDependsBin}" timeStep4 "${timeformat}")
-if (NOT timeStep4 GREATER timeStep3)
-  message(SEND_ERROR "File (${rccDependsBin}) should have changed in the fourth step!")
-endif()
-# Sleep, update generated qrc file, rebuild and compare timestamp
-execute_process(COMMAND "${CMAKE_COMMAND}" -E sleep 1) # Ensure that the timestamp will change.
-configure_file(${RCC_DEPENDS_SRC}/res2b.qrc.in ${RCC_DEPENDS_BIN}/res2.qrc.in COPYONLY)
-execute_process(COMMAND "${CMAKE_COMMAND}" --build . WORKING_DIRECTORY "${RCC_DEPENDS_BIN}" RESULT_VARIABLE result)
-if (result)
-  message(SEND_ERROR "Sixth build of rccDepends failed.")
-endif()
-file(TIMESTAMP "${rccDependsBin}" timeStep5 "${timeformat}")
-if (NOT timeStep5 GREATER timeStep4)
-  message(SEND_ERROR "File (${rccDependsBin}) should have changed in the fitfh step!")
-endif()
-# Sleep, touch generated qrc newly added input file, rebuild and compare timestamp
-execute_process(COMMAND "${CMAKE_COMMAND}" -E sleep 1) # Ensure that the timestamp will change.
-execute_process(COMMAND "${CMAKE_COMMAND}" -E touch "${RCC_DEPENDS_BIN}/res2/inputAdded.txt")
-execute_process(COMMAND "${CMAKE_COMMAND}" --build . WORKING_DIRECTORY "${RCC_DEPENDS_BIN}" RESULT_VARIABLE result)
-if (result)
-  message(SEND_ERROR "Seventh build of rccDepends failed.")
-endif()
-file(TIMESTAMP "${rccDependsBin}" timeStep6 "${timeformat}")
-if (NOT timeStep6 GREATER timeStep5)
-  message(SEND_ERROR "File (${rccDependsBin}) should have changed in the sixth step!")
-endif()
-
-
-# -- Test
-# Ensure a repeated build succeeds when a header containing a QObject changes
-set(timeformat "%Y%j%H%M%S")
-configure_file(mocRerun/test1a.h.in mocRerun/test1.h COPYONLY)
-try_compile(MOC_RERUN
-  "${CMAKE_CURRENT_BINARY_DIR}/mocRerun"
-  "${CMAKE_CURRENT_SOURCE_DIR}/mocRerun"
-  mocRerun
-  CMAKE_FLAGS "-DQT_QMAKE_EXECUTABLE:FILEPATH=${QT_QMAKE_EXECUTABLE}"
-              "-DQT_TEST_VERSION=${QT_TEST_VERSION}"
-              "-DCMAKE_PREFIX_PATH=${Qt_PREFIX_DIR}"
-  OUTPUT_VARIABLE output
-)
-if (NOT MOC_RERUN)
-  message(SEND_ERROR "Initial build of mocRerun failed. Output: ${output}")
-endif()
-# Get name and timestamp of the output binary
-file(STRINGS "${CMAKE_CURRENT_BINARY_DIR}/mocRerun/target1.txt" target1List ENCODING UTF-8)
-list(GET target1List 0 binFile)
-file(TIMESTAMP "${binFile}" timeBegin "${timeformat}")
-# Change file content and rebuild
-execute_process(COMMAND "${CMAKE_COMMAND}" -E sleep 1)
-configure_file(mocRerun/test1b.h.in mocRerun/test1.h COPYONLY)
-execute_process(COMMAND "${CMAKE_COMMAND}" --build .
-  WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/mocRerun"
-  RESULT_VARIABLE mocRerun_result
-  )
-if (mocRerun_result)
-  message(SEND_ERROR "Second build of mocRerun failed.")
-endif()
-# Compare timestamps
-file(TIMESTAMP "${binFile}" timeStep1 "${timeformat}")
-if (NOT timeStep1 GREATER timeBegin)
-  message(SEND_ERROR "File (${binFile}) should have changed in the first step!")
-endif()
 
 # -- Test
 # Test for SKIP_AUTOMOC and SKIP_AUTOGEN on an AUTOMOC enabled target
@@ -321,76 +188,6 @@ if(ALLOW_WRAP_CPP)
   add_subdirectory(mocCMP0071)
 endif()
 
-# -- Test
-# Tests Q_PLUGIN_METADATA json file change detection
-if (NOT QT_TEST_VERSION STREQUAL 4)
-  try_compile(MOC_PLUGIN
-    "${CMAKE_CURRENT_BINARY_DIR}/mocPlugin"
-    "${CMAKE_CURRENT_SOURCE_DIR}/mocPlugin"
-    mocPlugin
-    CMAKE_FLAGS "-DQT_TEST_VERSION=${QT_TEST_VERSION}"
-                "-DCMAKE_PREFIX_PATH=${Qt_PREFIX_DIR}"
-    OUTPUT_VARIABLE output
-  )
-  if (NOT MOC_PLUGIN)
-    message(SEND_ERROR "Initial build of mocPlugin failed. Output: ${output}")
-  endif()
-
-  set(timeformat "%Y%j%H%M%S")
-  set(mocPlugSrcDir "${CMAKE_CURRENT_SOURCE_DIR}/mocPlugin")
-  set(mocPlugBinDir "${CMAKE_CURRENT_BINARY_DIR}/mocPlugin")
-  find_library(plAFile "PlugA" PATHS "${mocPlugBinDir}/Debug" "${mocPlugBinDir}" NO_DEFAULT_PATH)
-  find_library(plBFile "PlugB" PATHS "${mocPlugBinDir}/Debug" "${mocPlugBinDir}" NO_DEFAULT_PATH)
-  find_library(plCFile "PlugC" PATHS "${mocPlugBinDir}/Debug" "${mocPlugBinDir}" NO_DEFAULT_PATH)
-  find_library(plDFile "PlugD" PATHS "${mocPlugBinDir}/Debug" "${mocPlugBinDir}" NO_DEFAULT_PATH)
-
-  file(TIMESTAMP "${plAFile}" plABefore "${timeformat}")
-  file(TIMESTAMP "${plBFile}" plBBefore "${timeformat}")
-  file(TIMESTAMP "${plCFile}" plCBefore "${timeformat}")
-  file(TIMESTAMP "${plDFile}" plDBefore "${timeformat}")
-
-  # Ensure that the timestamp will change and change the json files
-  execute_process(COMMAND "${CMAKE_COMMAND}" -E sleep 1)
-  configure_file("${mocPlugSrcDir}/jsonIn/StyleD.json" "${mocPlugBinDir}/jsonFiles/StyleC.json")
-  configure_file("${mocPlugSrcDir}/jsonIn/StyleC.json" "${mocPlugBinDir}/jsonFiles/sub/StyleD.json")
-  execute_process(COMMAND "${CMAKE_COMMAND}" --build . WORKING_DIRECTORY "${mocPlugBinDir}")
-
-  file(TIMESTAMP "${plAFile}" plAAfter "${timeformat}")
-  file(TIMESTAMP "${plBFile}" plBAfter "${timeformat}")
-  file(TIMESTAMP "${plCFile}" plCAfter "${timeformat}")
-  file(TIMESTAMP "${plDFile}" plDAfter "${timeformat}")
-
-  if (plAAfter GREATER plABefore)
-    message(SEND_ERROR "file (${plAFile}) should not have changed!")
-  endif()
-  if (plBAfter GREATER plBBefore)
-    message(SEND_ERROR "file (${plBFile}) should not have changed!")
-  endif()
-  if (NOT plCAfter GREATER plCBefore)
-    message(SEND_ERROR "file (${plCFile}) should have changed!")
-  endif()
-  if (NOT plDAfter GREATER plDBefore)
-    message(SEND_ERROR "file (${plDFile}) should have changed!")
-  endif()
-
-  # Test custom macro
-  file(TIMESTAMP "${plCFile}" plCBefore "${timeformat}")
-  file(TIMESTAMP "${plDFile}" plDBefore "${timeformat}")
-  execute_process(COMMAND "${CMAKE_COMMAND}" -E sleep 1)
-  configure_file("${mocPlugSrcDir}/jsonIn/StyleD.json" "${mocPlugBinDir}/jsonFiles/StyleC_Custom.json")
-  configure_file("${mocPlugSrcDir}/jsonIn/StyleC.json" "${mocPlugBinDir}/jsonFiles/sub/StyleD_Custom.json")
-  execute_process(COMMAND "${CMAKE_COMMAND}" --build . WORKING_DIRECTORY "${mocPlugBinDir}")
-  file(TIMESTAMP "${plCFile}" plCAfter "${timeformat}")
-  file(TIMESTAMP "${plDFile}" plDAfter "${timeformat}")
-  if (NOT plCAfter GREATER plCBefore)
-    message(SEND_ERROR "file (${plCFile}) should have changed!")
-  endif()
-  if (NOT plDAfter GREATER plDBefore)
-    message(SEND_ERROR "file (${plDFile}) should have changed!")
-  endif()
-
-endif()
-
 # -- Test
 # Tests various .ui include directories
 add_subdirectory(uicInclude)

+ 239 - 0
Tests/QtAutogenRerun/CMakeLists.txt

@@ -0,0 +1,239 @@
+cmake_minimum_required(VERSION 3.9)
+cmake_policy(SET CMP0071 NEW)
+project(QtAutogenRerun)
+
+# Tell find_package(Qt5) where to find Qt.
+if(QT_QMAKE_EXECUTABLE)
+  get_filename_component(Qt_BIN_DIR "${QT_QMAKE_EXECUTABLE}" PATH)
+  get_filename_component(Qt_PREFIX_DIR "${Qt_BIN_DIR}" PATH)
+  set(CMAKE_PREFIX_PATH ${Qt_PREFIX_DIR})
+endif()
+
+if (QT_TEST_VERSION STREQUAL 4)
+  find_package(Qt4 REQUIRED)
+
+  # Include this directory before using the UseQt4 file.
+  add_subdirectory(defines_test)
+
+  include(UseQt4)
+
+  set(QT_QTCORE_TARGET Qt4::QtCore)
+
+else()
+  if (NOT QT_TEST_VERSION STREQUAL 5)
+    message(SEND_ERROR "Invalid Qt version specified.")
+  endif()
+  find_package(Qt5Widgets REQUIRED)
+
+  set(QT_QTCORE_TARGET Qt5::Core)
+
+  include_directories(${Qt5Widgets_INCLUDE_DIRS})
+  set(QT_LIBRARIES Qt5::Widgets)
+
+  if(Qt5_POSITION_INDEPENDENT_CODE AND CMAKE_CXX_COMPILE_OPTIONS_PIC)
+    add_definitions(${CMAKE_CXX_COMPILE_OPTIONS_PIC})
+  endif()
+
+endif()
+
+# -- Test
+# Dummy test to generate clean target
+add_executable(dummy dummy.cpp)
+
+# -- Test
+# When a file listed in a .qrc file changes the target must be rebuilt
+set(timeformat "%Y%j%H%M%S")
+set(RCC_DEPENDS_SRC "${CMAKE_CURRENT_SOURCE_DIR}/rccDepends")
+set(RCC_DEPENDS_BIN "${CMAKE_CURRENT_BINARY_DIR}/rccDepends")
+configure_file(${RCC_DEPENDS_SRC}/res1a.qrc.in ${RCC_DEPENDS_BIN}/res1.qrc COPYONLY)
+configure_file(${RCC_DEPENDS_SRC}/res2a.qrc.in ${RCC_DEPENDS_BIN}/res2.qrc.in COPYONLY)
+try_compile(RCC_DEPENDS
+  "${RCC_DEPENDS_BIN}"
+  "${RCC_DEPENDS_SRC}"
+  rccDepends
+  CMAKE_FLAGS "-DQT_QMAKE_EXECUTABLE:FILEPATH=${QT_QMAKE_EXECUTABLE}"
+              "-DQT_TEST_VERSION=${QT_TEST_VERSION}"
+              "-DCMAKE_PREFIX_PATH=${Qt_PREFIX_DIR}"
+  OUTPUT_VARIABLE output
+)
+if (NOT RCC_DEPENDS)
+  message(SEND_ERROR "Initial build of rccDepends failed. Output: ${output}")
+endif()
+# Get name and timestamp of the output binary
+file(STRINGS "${RCC_DEPENDS_BIN}/target.txt" targetList ENCODING UTF-8)
+list(GET targetList 0 rccDependsBin)
+file(TIMESTAMP "${rccDependsBin}" timeBegin "${timeformat}")
+# Sleep, touch regular qrc input file, rebuild and compare timestamp
+execute_process(COMMAND "${CMAKE_COMMAND}" -E sleep 1) # Ensure that the timestamp will change.
+execute_process(COMMAND "${CMAKE_COMMAND}" -E touch "${RCC_DEPENDS_BIN}/res1/input.txt")
+execute_process(COMMAND "${CMAKE_COMMAND}" --build . WORKING_DIRECTORY "${RCC_DEPENDS_BIN}" RESULT_VARIABLE result)
+if (result)
+  message(SEND_ERROR "Second build of rccDepends failed.")
+endif()
+file(TIMESTAMP "${rccDependsBin}" timeStep1 "${timeformat}")
+if (NOT timeStep1 GREATER timeBegin)
+  message(SEND_ERROR "File (${rccDependsBin}) should have changed in the first step!")
+endif()
+# Sleep, update regular qrc file, rebuild and compare timestamp
+execute_process(COMMAND "${CMAKE_COMMAND}" -E sleep 1) # Ensure that the timestamp will change.
+configure_file(${RCC_DEPENDS_SRC}/res1b.qrc.in ${RCC_DEPENDS_BIN}/res1.qrc COPYONLY)
+execute_process(COMMAND "${CMAKE_COMMAND}" --build . WORKING_DIRECTORY "${RCC_DEPENDS_BIN}" RESULT_VARIABLE result)
+if (result)
+  message(SEND_ERROR "Third build of rccDepends failed.")
+endif()
+file(TIMESTAMP "${rccDependsBin}" timeStep2 "${timeformat}")
+if (NOT timeStep2 GREATER timeStep1)
+  message(SEND_ERROR "File (${rccDependsBin}) should have changed in the second step!")
+endif()
+# Sleep, touch regular qrc newly added input file, rebuild and compare timestamp
+execute_process(COMMAND "${CMAKE_COMMAND}" -E sleep 1) # Ensure that the timestamp will change.
+execute_process(COMMAND "${CMAKE_COMMAND}" -E touch "${RCC_DEPENDS_BIN}/res1/inputAdded.txt")
+execute_process(COMMAND "${CMAKE_COMMAND}" --build . WORKING_DIRECTORY "${RCC_DEPENDS_BIN}" RESULT_VARIABLE result)
+if (result)
+  message(SEND_ERROR "Fourth build of rccDepends failed.")
+endif()
+file(TIMESTAMP "${rccDependsBin}" timeStep3 "${timeformat}")
+if (NOT timeStep3 GREATER timeStep2)
+  message(SEND_ERROR "File (${rccDependsBin}) should have changed in the third step!")
+endif()
+# Sleep, touch generated qrc input file, rebuild and compare timestamp
+execute_process(COMMAND "${CMAKE_COMMAND}" -E sleep 1) # Ensure that the timestamp will change.
+execute_process(COMMAND "${CMAKE_COMMAND}" -E touch "${RCC_DEPENDS_BIN}/res2/input.txt")
+execute_process(COMMAND "${CMAKE_COMMAND}" --build . WORKING_DIRECTORY "${RCC_DEPENDS_BIN}" RESULT_VARIABLE result)
+if (result)
+  message(SEND_ERROR "Fifth build of rccDepends failed.")
+endif()
+file(TIMESTAMP "${rccDependsBin}" timeStep4 "${timeformat}")
+if (NOT timeStep4 GREATER timeStep3)
+  message(SEND_ERROR "File (${rccDependsBin}) should have changed in the fourth step!")
+endif()
+# Sleep, update generated qrc file, rebuild and compare timestamp
+execute_process(COMMAND "${CMAKE_COMMAND}" -E sleep 1) # Ensure that the timestamp will change.
+configure_file(${RCC_DEPENDS_SRC}/res2b.qrc.in ${RCC_DEPENDS_BIN}/res2.qrc.in COPYONLY)
+execute_process(COMMAND "${CMAKE_COMMAND}" --build . WORKING_DIRECTORY "${RCC_DEPENDS_BIN}" RESULT_VARIABLE result)
+if (result)
+  message(SEND_ERROR "Sixth build of rccDepends failed.")
+endif()
+file(TIMESTAMP "${rccDependsBin}" timeStep5 "${timeformat}")
+if (NOT timeStep5 GREATER timeStep4)
+  message(SEND_ERROR "File (${rccDependsBin}) should have changed in the fitfh step!")
+endif()
+# Sleep, touch generated qrc newly added input file, rebuild and compare timestamp
+execute_process(COMMAND "${CMAKE_COMMAND}" -E sleep 1) # Ensure that the timestamp will change.
+execute_process(COMMAND "${CMAKE_COMMAND}" -E touch "${RCC_DEPENDS_BIN}/res2/inputAdded.txt")
+execute_process(COMMAND "${CMAKE_COMMAND}" --build . WORKING_DIRECTORY "${RCC_DEPENDS_BIN}" RESULT_VARIABLE result)
+if (result)
+  message(SEND_ERROR "Seventh build of rccDepends failed.")
+endif()
+file(TIMESTAMP "${rccDependsBin}" timeStep6 "${timeformat}")
+if (NOT timeStep6 GREATER timeStep5)
+  message(SEND_ERROR "File (${rccDependsBin}) should have changed in the sixth step!")
+endif()
+
+
+# -- Test
+# Ensure a repeated build succeeds when a header containing a QObject changes
+set(timeformat "%Y%j%H%M%S")
+configure_file(mocRerun/test1a.h.in mocRerun/test1.h COPYONLY)
+try_compile(MOC_RERUN
+  "${CMAKE_CURRENT_BINARY_DIR}/mocRerun"
+  "${CMAKE_CURRENT_SOURCE_DIR}/mocRerun"
+  mocRerun
+  CMAKE_FLAGS "-DQT_QMAKE_EXECUTABLE:FILEPATH=${QT_QMAKE_EXECUTABLE}"
+              "-DQT_TEST_VERSION=${QT_TEST_VERSION}"
+              "-DCMAKE_PREFIX_PATH=${Qt_PREFIX_DIR}"
+  OUTPUT_VARIABLE output
+)
+if (NOT MOC_RERUN)
+  message(SEND_ERROR "Initial build of mocRerun failed. Output: ${output}")
+endif()
+# Get name and timestamp of the output binary
+file(STRINGS "${CMAKE_CURRENT_BINARY_DIR}/mocRerun/target1.txt" target1List ENCODING UTF-8)
+list(GET target1List 0 binFile)
+file(TIMESTAMP "${binFile}" timeBegin "${timeformat}")
+# Change file content and rebuild
+execute_process(COMMAND "${CMAKE_COMMAND}" -E sleep 1)
+configure_file(mocRerun/test1b.h.in mocRerun/test1.h COPYONLY)
+execute_process(COMMAND "${CMAKE_COMMAND}" --build .
+  WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/mocRerun"
+  RESULT_VARIABLE mocRerun_result
+  )
+if (mocRerun_result)
+  message(SEND_ERROR "Second build of mocRerun failed.")
+endif()
+# Compare timestamps
+file(TIMESTAMP "${binFile}" timeStep1 "${timeformat}")
+if (NOT timeStep1 GREATER timeBegin)
+  message(SEND_ERROR "File (${binFile}) should have changed in the first step!")
+endif()
+
+
+# -- Test
+# Tests Q_PLUGIN_METADATA json file change detection
+if (NOT QT_TEST_VERSION STREQUAL 4)
+  try_compile(MOC_PLUGIN
+    "${CMAKE_CURRENT_BINARY_DIR}/mocPlugin"
+    "${CMAKE_CURRENT_SOURCE_DIR}/mocPlugin"
+    mocPlugin
+    CMAKE_FLAGS "-DQT_TEST_VERSION=${QT_TEST_VERSION}"
+                "-DCMAKE_PREFIX_PATH=${Qt_PREFIX_DIR}"
+    OUTPUT_VARIABLE output
+  )
+  if (NOT MOC_PLUGIN)
+    message(SEND_ERROR "Initial build of mocPlugin failed. Output: ${output}")
+  endif()
+
+  set(timeformat "%Y%j%H%M%S")
+  set(mocPlugSrcDir "${CMAKE_CURRENT_SOURCE_DIR}/mocPlugin")
+  set(mocPlugBinDir "${CMAKE_CURRENT_BINARY_DIR}/mocPlugin")
+  find_library(plAFile "PlugA" PATHS "${mocPlugBinDir}/Debug" "${mocPlugBinDir}" NO_DEFAULT_PATH)
+  find_library(plBFile "PlugB" PATHS "${mocPlugBinDir}/Debug" "${mocPlugBinDir}" NO_DEFAULT_PATH)
+  find_library(plCFile "PlugC" PATHS "${mocPlugBinDir}/Debug" "${mocPlugBinDir}" NO_DEFAULT_PATH)
+  find_library(plDFile "PlugD" PATHS "${mocPlugBinDir}/Debug" "${mocPlugBinDir}" NO_DEFAULT_PATH)
+
+  file(TIMESTAMP "${plAFile}" plABefore "${timeformat}")
+  file(TIMESTAMP "${plBFile}" plBBefore "${timeformat}")
+  file(TIMESTAMP "${plCFile}" plCBefore "${timeformat}")
+  file(TIMESTAMP "${plDFile}" plDBefore "${timeformat}")
+
+  # Ensure that the timestamp will change and change the json files
+  execute_process(COMMAND "${CMAKE_COMMAND}" -E sleep 1)
+  configure_file("${mocPlugSrcDir}/jsonIn/StyleD.json" "${mocPlugBinDir}/jsonFiles/StyleC.json")
+  configure_file("${mocPlugSrcDir}/jsonIn/StyleC.json" "${mocPlugBinDir}/jsonFiles/sub/StyleD.json")
+  execute_process(COMMAND "${CMAKE_COMMAND}" --build . WORKING_DIRECTORY "${mocPlugBinDir}")
+
+  file(TIMESTAMP "${plAFile}" plAAfter "${timeformat}")
+  file(TIMESTAMP "${plBFile}" plBAfter "${timeformat}")
+  file(TIMESTAMP "${plCFile}" plCAfter "${timeformat}")
+  file(TIMESTAMP "${plDFile}" plDAfter "${timeformat}")
+
+  if (plAAfter GREATER plABefore)
+    message(SEND_ERROR "file (${plAFile}) should not have changed!")
+  endif()
+  if (plBAfter GREATER plBBefore)
+    message(SEND_ERROR "file (${plBFile}) should not have changed!")
+  endif()
+  if (NOT plCAfter GREATER plCBefore)
+    message(SEND_ERROR "file (${plCFile}) should have changed!")
+  endif()
+  if (NOT plDAfter GREATER plDBefore)
+    message(SEND_ERROR "file (${plDFile}) should have changed!")
+  endif()
+
+  # Test custom macro
+  file(TIMESTAMP "${plCFile}" plCBefore "${timeformat}")
+  file(TIMESTAMP "${plDFile}" plDBefore "${timeformat}")
+  execute_process(COMMAND "${CMAKE_COMMAND}" -E sleep 1)
+  configure_file("${mocPlugSrcDir}/jsonIn/StyleD.json" "${mocPlugBinDir}/jsonFiles/StyleC_Custom.json")
+  configure_file("${mocPlugSrcDir}/jsonIn/StyleC.json" "${mocPlugBinDir}/jsonFiles/sub/StyleD_Custom.json")
+  execute_process(COMMAND "${CMAKE_COMMAND}" --build . WORKING_DIRECTORY "${mocPlugBinDir}")
+  file(TIMESTAMP "${plCFile}" plCAfter "${timeformat}")
+  file(TIMESTAMP "${plDFile}" plDAfter "${timeformat}")
+  if (NOT plCAfter GREATER plCBefore)
+    message(SEND_ERROR "file (${plCFile}) should have changed!")
+  endif()
+  if (NOT plDAfter GREATER plDBefore)
+    message(SEND_ERROR "file (${plDFile}) should have changed!")
+  endif()
+
+endif()

+ 4 - 0
Tests/QtAutogenRerun/defines_test/CMakeLists.txt

@@ -0,0 +1,4 @@
+
+add_executable(defines_test defines_test.cpp)
+set_target_properties(defines_test PROPERTIES AUTOMOC TRUE)
+target_link_libraries(defines_test Qt4::QtGui)

+ 38 - 0
Tests/QtAutogenRerun/defines_test/defines_test.cpp

@@ -0,0 +1,38 @@
+
+#include <QObject>
+
+#ifdef QT_GUI_LIB
+#include <QTextDocument>
+
+class SomeDocument : public QTextDocument
+{
+  Q_OBJECT
+
+Q_SIGNALS:
+  void someSig();
+};
+#endif
+
+#ifdef QT_CORE_LIB
+class SomeObject : public QObject
+{
+  Q_OBJECT
+
+Q_SIGNALS:
+  void someSig();
+};
+#endif
+
+int main(int argc, char** argv)
+{
+#ifdef QT_CORE_LIB
+  QMetaObject sosmo = SomeObject::staticMetaObject;
+#endif
+#ifdef QT_GUI_LIB
+  QMetaObject sdsmo = SomeDocument::staticMetaObject;
+#endif
+
+  return 0;
+}
+
+#include "defines_test.moc"

+ 5 - 0
Tests/QtAutogenRerun/dummy.cpp

@@ -0,0 +1,5 @@
+
+int main(int argv, char** args)
+{
+  return 0;
+}

+ 0 - 0
Tests/QtAutogen/mocPlugin/CMakeLists.txt → Tests/QtAutogenRerun/mocPlugin/CMakeLists.txt


+ 0 - 0
Tests/QtAutogen/mocPlugin/StyleA.cpp → Tests/QtAutogenRerun/mocPlugin/StyleA.cpp


+ 0 - 0
Tests/QtAutogen/mocPlugin/StyleA.hpp → Tests/QtAutogenRerun/mocPlugin/StyleA.hpp


+ 0 - 0
Tests/QtAutogen/mocPlugin/StyleA.json → Tests/QtAutogenRerun/mocPlugin/StyleA.json


+ 0 - 0
Tests/QtAutogen/mocPlugin/StyleA_Custom.json → Tests/QtAutogenRerun/mocPlugin/StyleA_Custom.json


+ 0 - 0
Tests/QtAutogen/mocPlugin/StyleB.cpp → Tests/QtAutogenRerun/mocPlugin/StyleB.cpp


+ 0 - 0
Tests/QtAutogen/mocPlugin/StyleB.hpp → Tests/QtAutogenRerun/mocPlugin/StyleB.hpp


+ 0 - 0
Tests/QtAutogen/mocPlugin/StyleC.cpp → Tests/QtAutogenRerun/mocPlugin/StyleC.cpp


+ 0 - 0
Tests/QtAutogen/mocPlugin/StyleC.hpp → Tests/QtAutogenRerun/mocPlugin/StyleC.hpp


+ 0 - 0
Tests/QtAutogen/mocPlugin/StyleCommon.hpp → Tests/QtAutogenRerun/mocPlugin/StyleCommon.hpp


+ 0 - 0
Tests/QtAutogen/mocPlugin/StyleD.cpp → Tests/QtAutogenRerun/mocPlugin/StyleD.cpp


+ 0 - 0
Tests/QtAutogen/mocPlugin/StyleD.hpp → Tests/QtAutogenRerun/mocPlugin/StyleD.hpp


+ 0 - 0
Tests/QtAutogen/mocPlugin/StyleE.cpp → Tests/QtAutogenRerun/mocPlugin/StyleE.cpp


+ 0 - 0
Tests/QtAutogen/mocPlugin/StyleE.hpp → Tests/QtAutogenRerun/mocPlugin/StyleE.hpp


+ 0 - 0
Tests/QtAutogen/mocPlugin/jsonIn/StyleB.json → Tests/QtAutogenRerun/mocPlugin/jsonIn/StyleB.json


+ 0 - 0
Tests/QtAutogen/mocPlugin/jsonIn/StyleB_Custom.json → Tests/QtAutogenRerun/mocPlugin/jsonIn/StyleB_Custom.json


+ 0 - 0
Tests/QtAutogen/mocPlugin/jsonIn/StyleC.json → Tests/QtAutogenRerun/mocPlugin/jsonIn/StyleC.json


+ 0 - 0
Tests/QtAutogen/mocPlugin/jsonIn/StyleD.json → Tests/QtAutogenRerun/mocPlugin/jsonIn/StyleD.json


+ 0 - 0
Tests/QtAutogen/mocPlugin/main.cpp → Tests/QtAutogenRerun/mocPlugin/main.cpp


+ 0 - 0
Tests/QtAutogen/mocRerun/CMakeLists.txt → Tests/QtAutogenRerun/mocRerun/CMakeLists.txt


+ 0 - 0
Tests/QtAutogen/mocRerun/input.txt → Tests/QtAutogenRerun/mocRerun/input.txt


+ 0 - 0
Tests/QtAutogen/mocRerun/main.cpp.in → Tests/QtAutogenRerun/mocRerun/main.cpp.in


+ 0 - 0
Tests/QtAutogen/mocRerun/res1.qrc → Tests/QtAutogenRerun/mocRerun/res1.qrc


+ 0 - 0
Tests/QtAutogen/mocRerun/test1a.h.in → Tests/QtAutogenRerun/mocRerun/test1a.h.in


+ 0 - 0
Tests/QtAutogen/mocRerun/test1b.h.in → Tests/QtAutogenRerun/mocRerun/test1b.h.in


+ 0 - 0
Tests/QtAutogen/rccDepends/CMakeLists.txt → Tests/QtAutogenRerun/rccDepends/CMakeLists.txt


+ 0 - 0
Tests/QtAutogen/rccDepends/main.cpp → Tests/QtAutogenRerun/rccDepends/main.cpp


+ 0 - 0
Tests/QtAutogen/rccDepends/res/input1.txt.in → Tests/QtAutogenRerun/rccDepends/res/input1.txt.in


+ 0 - 0
Tests/QtAutogen/rccDepends/res/input2.txt.in → Tests/QtAutogenRerun/rccDepends/res/input2.txt.in


+ 0 - 0
Tests/QtAutogen/rccDepends/res1a.qrc.in → Tests/QtAutogenRerun/rccDepends/res1a.qrc.in


+ 0 - 0
Tests/QtAutogen/rccDepends/res1b.qrc.in → Tests/QtAutogenRerun/rccDepends/res1b.qrc.in


+ 0 - 0
Tests/QtAutogen/rccDepends/res2a.qrc.in → Tests/QtAutogenRerun/rccDepends/res2a.qrc.in


+ 0 - 0
Tests/QtAutogen/rccDepends/res2b.qrc.in → Tests/QtAutogenRerun/rccDepends/res2b.qrc.in