RunCMakeTest.cmake 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. include(RunCMake)
  2. run_cmake(NoQt)
  3. if (DEFINED with_qt_version)
  4. set(RunCMake_TEST_OPTIONS
  5. -Dwith_qt_version=${with_qt_version}
  6. "-DQt${with_qt_version}_DIR:PATH=${Qt${with_qt_version}_DIR}"
  7. "-DCMAKE_PREFIX_PATH:STRING=${CMAKE_PREFIX_PATH}"
  8. )
  9. run_cmake(QtInFunction)
  10. run_cmake(QtInFunctionNested)
  11. run_cmake(QtInFunctionProperty)
  12. run_cmake(CMP0111-imported-target-full)
  13. run_cmake(CMP0111-imported-target-libname)
  14. run_cmake(CMP0111-imported-target-implib-only)
  15. block()
  16. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/MocPredefs-build)
  17. run_cmake(MocPredefs)
  18. set(RunCMake_TEST_NO_CLEAN 1)
  19. run_cmake_command(MocPredefs-build ${CMAKE_COMMAND} --build . --config Debug)
  20. endblock()
  21. # Detect information from the toolchain:
  22. # - CMAKE_INCLUDE_FLAG_CXX
  23. # - CMAKE_INCLUDE_SYSTEM_FLAG_CXX
  24. run_cmake(Inspect)
  25. include("${RunCMake_BINARY_DIR}/Inspect-build/info.cmake")
  26. if(CMAKE_INCLUDE_SYSTEM_FLAG_CXX)
  27. if(RunCMake_GENERATOR MATCHES "Visual Studio")
  28. string(REGEX REPLACE "^-" "/" test_expect_stdout "${CMAKE_INCLUDE_SYSTEM_FLAG_CXX}")
  29. else()
  30. set(test_expect_stdout "-*${CMAKE_INCLUDE_SYSTEM_FLAG_CXX}")
  31. endif()
  32. string(APPEND test_expect_stdout " *(\"[^\"]*|([^ ]|\\ )*)[\\/]dummy_autogen[\\/]include")
  33. if(RunCMake_GENERATOR_IS_MULTI_CONFIG)
  34. string(APPEND test_expect_stdout "_Debug")
  35. endif()
  36. block()
  37. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/CMP0151-new-build)
  38. run_cmake_with_options(CMP0151-new ${RunCMake_TEST_OPTIONS} -DCMAKE_POLICY_DEFAULT_CMP0151=NEW)
  39. set(RunCMake_TEST_NO_CLEAN 1)
  40. set(RunCMake_TEST_EXPECT_stdout "${test_expect_stdout}")
  41. message(STATUS "RunCMake_TEST_EXPECT_stdout: ${RunCMake_TEST_EXPECT_stdout}")
  42. run_cmake_command(CMP0151-new-build ${CMAKE_COMMAND} --build . --config Debug --verbose)
  43. endblock()
  44. block()
  45. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/AutogenUseSystemIncludeOn-build)
  46. run_cmake_with_options(AutogenUseSystemIncludeOn ${RunCMake_TEST_OPTIONS} -DCMAKE_POLICY_DEFAULT_CMP0151=NEW)
  47. set(RunCMake_TEST_NO_CLEAN 1)
  48. set(RunCMake_TEST_EXPECT_stdout "${test_expect_stdout}")
  49. message(STATUS "RunCMake_TEST_EXPECT_stdout: ${RunCMake_TEST_EXPECT_stdout}")
  50. run_cmake_command(AutogenUseSystemIncludeOn ${CMAKE_COMMAND} --build . --config Debug --verbose)
  51. endblock()
  52. endif()
  53. if(CMAKE_INCLUDE_FLAG_CXX)
  54. if(RunCMake_GENERATOR MATCHES "Visual Studio")
  55. string(REGEX REPLACE "^-" "/" test_expect_stdout "${CMAKE_INCLUDE_FLAG_CXX}")
  56. else()
  57. set(test_expect_stdout "-*${CMAKE_INCLUDE_FLAG_CXX}")
  58. endif()
  59. string(APPEND test_expect_stdout " *(\"[^\"]*|([^ ]|\\ )*)[\\/]dummy_autogen[\\/]include")
  60. if(RunCMake_GENERATOR_IS_MULTI_CONFIG)
  61. string(APPEND test_expect_stdout "_Debug")
  62. endif()
  63. block()
  64. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/CMP0151-old-build)
  65. run_cmake_with_options(CMP0151-old ${RunCMake_TEST_OPTIONS} -DCMAKE_POLICY_DEFAULT_CMP0151=OLD)
  66. set(RunCMake_TEST_NO_CLEAN 1)
  67. set(RunCMake_TEST_EXPECT_stdout "${test_expect_stdout}")
  68. message(STATUS "RunCMake_TEST_EXPECT_stdout: ${RunCMake_TEST_EXPECT_stdout}")
  69. run_cmake_command(CMP0151-old-build ${CMAKE_COMMAND} --build . --config Debug --verbose)
  70. endblock()
  71. block()
  72. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/AutogenUseSystemIncludeOff-build)
  73. run_cmake_with_options(AutogenUseSystemIncludeOff ${RunCMake_TEST_OPTIONS} -DCMAKE_POLICY_DEFAULT_CMP0151=NEW)
  74. set(RunCMake_TEST_NO_CLEAN 1)
  75. set(RunCMake_TEST_EXPECT_stdout "${test_expect_stdout}")
  76. message(STATUS "RunCMake_TEST_EXPECT_stdout: ${RunCMake_TEST_EXPECT_stdout}")
  77. run_cmake_command(AutogenUseSystemIncludeOff ${CMAKE_COMMAND} --build . --config Debug --verbose)
  78. endblock()
  79. if(RunCMake_GENERATOR MATCHES "Make|Ninja")
  80. block()
  81. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/AutogenSkipLinting-build)
  82. list(APPEND RunCMake_TEST_OPTIONS
  83. "-DPSEUDO_CPPCHECK=${PSEUDO_CPPCHECK}"
  84. "-DPSEUDO_CPPLINT=${PSEUDO_CPPLINT}"
  85. "-DPSEUDO_IWYU=${PSEUDO_IWYU}"
  86. "-DPSEUDO_TIDY=${PSEUDO_TIDY}")
  87. run_cmake(AutogenSkipLinting)
  88. set(RunCMake_TEST_NO_CLEAN 1)
  89. run_cmake_command(AutogenSkipLinting-build ${CMAKE_COMMAND} --build . --config Debug --verbose)
  90. endblock()
  91. endif()
  92. endif()
  93. if(RunCMake_GENERATOR_IS_MULTI_CONFIG AND NOT RunCMake_GENERATOR MATCHES "Xcode")
  94. block()
  95. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/MocGeneratedFile-build)
  96. run_cmake(MocGeneratedFile)
  97. set(RunCMake_TEST_NO_CLEAN 1)
  98. run_cmake_command(MocGeneratedFile-build ${CMAKE_COMMAND} --build . --config Debug --verbose)
  99. endblock()
  100. if(RunCMake_GENERATOR MATCHES "Ninja Multi-Config")
  101. block()
  102. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/MocGeneratedFile-cross-config-build)
  103. list(APPEND RunCMake_TEST_OPTIONS -DCMAKE_CROSS_CONFIGS=all)
  104. run_cmake(MocGeneratedFile)
  105. set(RunCMake_TEST_NO_CLEAN 1)
  106. run_cmake_command(MocGeneratedFile-cross-config-build ${CMAKE_COMMAND} --build . --config Release --target libgen:Debug)
  107. run_cmake_command(MocGeneratedFile-cross-config-build ${CMAKE_COMMAND} --build . --config Debug --target libgen:Release)
  108. endblock()
  109. endif()
  110. endif()
  111. if(RunCMake_GENERATOR MATCHES "Make|Ninja")
  112. block()
  113. if(QtCore_VERSION VERSION_GREATER_EQUAL 5.15.0)
  114. set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/QtAutoMocDeps-build)
  115. run_cmake(QtAutoMocDeps)
  116. set(RunCMake_TEST_NO_CLEAN 1)
  117. # Build the project.
  118. run_cmake_command(QtAutoMocDeps-build ${CMAKE_COMMAND} --build . --verbose)
  119. # Touch just the library source file, which shouldn't cause a rerun of AUTOMOC
  120. # for app_with_qt target.
  121. file(TOUCH "${RunCMake_SOURCE_DIR}/simple_lib.cpp")
  122. set(RunCMake_TEST_NOT_EXPECT_stdout "Automatic MOC for target app_with_qt|\
  123. Automatic MOC for target sub_exe_1|\
  124. Automatic MOC for target sub_exe_2")
  125. set(RunCMake_TEST_VARIANT_DESCRIPTION "-Don't execute AUTOMOC for 'app_with_qt', 'sub_exe_1' and 'sub_exe_2'")
  126. # Build and assert that AUTOMOC was not run for app_with_qt, sub_exe_1 and sub_exe_2.
  127. run_cmake_command(QtAutoMocDeps-build ${CMAKE_COMMAND} --build . --verbose)
  128. unset(RunCMake_TEST_VARIANT_DESCRIPTION)
  129. unset(RunCMake_TEST_NOT_EXPECT_stdout)
  130. macro(check_file_exists file)
  131. if (EXISTS "${file}")
  132. set(check_result "PASSED")
  133. set(message_type "STATUS")
  134. else()
  135. set(check_result "FAILED")
  136. set(message_type "FATAL_ERROR")
  137. endif()
  138. message(${message_type} "QtAutoMocDeps-build-\"${file}\" was generated - ${check_result}")
  139. endmacro()
  140. check_file_exists("${RunCMake_TEST_BINARY_DIR}/app_with_qt_autogen/deps")
  141. check_file_exists("${RunCMake_TEST_BINARY_DIR}/QtSubDir1/sub_exe_1_autogen/deps")
  142. check_file_exists("${RunCMake_TEST_BINARY_DIR}/QtSubDir2/sub_exe_2_autogen/deps")
  143. check_file_exists("${RunCMake_TEST_BINARY_DIR}/app_with_qt_autogen/timestamp")
  144. check_file_exists("${RunCMake_TEST_BINARY_DIR}/QtSubDir1/sub_exe_1_autogen/timestamp")
  145. check_file_exists("${RunCMake_TEST_BINARY_DIR}/QtSubDir2/sub_exe_2_autogen/timestamp")
  146. # Touch a header file to make sure an automoc dependency cycle is not introduced.
  147. file(TOUCH "${RunCMake_SOURCE_DIR}/MyWindow.h")
  148. set(RunCMake_TEST_VARIANT_DESCRIPTION "-First build after touch to detect dependency cycle")
  149. run_cmake_command(QtAutoMocDeps-build ${CMAKE_COMMAND} --build . --verbose)
  150. # Need to run a second time to hit the dependency cycle.
  151. set(RunCMake_TEST_VARIANT_DESCRIPTION "-Don't hit dependency cycle")
  152. run_cmake_command(QtAutoMocDeps-build ${CMAKE_COMMAND} --build . --verbose)
  153. endif()
  154. endblock()
  155. endif()
  156. endif ()