summaryrefslogtreecommitdiffstats
path: root/src/corelib/Qt6CTestMacros.cmake
diff options
context:
space:
mode:
Diffstat (limited to 'src/corelib/Qt6CTestMacros.cmake')
-rw-r--r--src/corelib/Qt6CTestMacros.cmake243
1 files changed, 243 insertions, 0 deletions
diff --git a/src/corelib/Qt6CTestMacros.cmake b/src/corelib/Qt6CTestMacros.cmake
new file mode 100644
index 0000000000..962d49d6b2
--- /dev/null
+++ b/src/corelib/Qt6CTestMacros.cmake
@@ -0,0 +1,243 @@
+#
+# W A R N I N G
+# -------------
+#
+# This file is not part of the Qt API. It exists purely as an
+# implementation detail. This file, and its contents may change from version to
+# version without notice, or even be removed.
+#
+# We mean it.
+
+message("CMAKE_VERSION: ${CMAKE_VERSION}")
+message("CMAKE_PREFIX_PATH: ${CMAKE_PREFIX_PATH}")
+message("CMAKE_MODULES_UNDER_TEST: ${CMAKE_MODULES_UNDER_TEST}")
+foreach(_mod ${CMAKE_MODULES_UNDER_TEST})
+ message("CMAKE_${_mod}_MODULE_MAJOR_VERSION: ${CMAKE_${_mod}_MODULE_MAJOR_VERSION}")
+ message("CMAKE_${_mod}_MODULE_MINOR_VERSION: ${CMAKE_${_mod}_MODULE_MINOR_VERSION}")
+ message("CMAKE_${_mod}_MODULE_PATCH_VERSION: ${CMAKE_${_mod}_MODULE_PATCH_VERSION}")
+endforeach()
+
+set(BUILD_OPTIONS_LIST)
+
+if (CMAKE_C_COMPILER)
+ list(APPEND BUILD_OPTIONS_LIST "-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}")
+endif()
+
+if (CMAKE_CXX_COMPILER)
+ list(APPEND BUILD_OPTIONS_LIST "-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}")
+endif()
+
+if (CMAKE_BUILD_TYPE)
+ list(APPEND BUILD_OPTIONS_LIST "-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}")
+endif()
+
+if (CMAKE_TOOLCHAIN_FILE)
+ list(APPEND BUILD_OPTIONS_LIST "-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}")
+endif()
+
+if (CMAKE_VERBOSE_MAKEFILE)
+ list(APPEND BUILD_OPTIONS_LIST "-DCMAKE_VERBOSE_MAKEFILE=1")
+endif()
+
+if (NO_GUI)
+ list(APPEND BUILD_OPTIONS_LIST "-DNO_GUI=True")
+endif()
+if (NO_WIDGETS)
+ list(APPEND BUILD_OPTIONS_LIST "-DNO_WIDGETS=True")
+endif()
+if (NO_DBUS)
+ list(APPEND BUILD_OPTIONS_LIST "-DNO_DBUS=True")
+endif()
+
+# Qt requires C++11 features in header files, which means
+# the buildsystem needs to add a -std flag for certain compilers
+# CMake adds the flag automatically in most cases, but notably not
+# on Windows prior to CMake 3.3
+if (CMAKE_VERSION VERSION_LESS 3.3)
+ if (CMAKE_CXX_COMPILER_ID STREQUAL AppleClang
+ OR (APPLE AND CMAKE_CXX_COMPILER_ID STREQUAL Clang))
+ list(APPEND BUILD_OPTIONS_LIST "-DCMAKE_CXX_FLAGS=-std=gnu++0x -stdlib=libc++")
+ elseif (CMAKE_CXX_COMPILER_ID STREQUAL GNU
+ OR CMAKE_CXX_COMPILER_ID STREQUAL Clang)
+ list(APPEND BUILD_OPTIONS_LIST "-DCMAKE_CXX_FLAGS=-std=gnu++0x")
+ endif()
+endif()
+
+foreach(module ${CMAKE_MODULES_UNDER_TEST})
+ list(APPEND BUILD_OPTIONS_LIST
+ "-DCMAKE_${module}_MODULE_MAJOR_VERSION=${CMAKE_${module}_MODULE_MAJOR_VERSION}"
+ "-DCMAKE_${module}_MODULE_MINOR_VERSION=${CMAKE_${module}_MODULE_MINOR_VERSION}"
+ "-DCMAKE_${module}_MODULE_PATCH_VERSION=${CMAKE_${module}_MODULE_PATCH_VERSION}"
+ )
+endforeach()
+
+macro(expect_pass _dir)
+ cmake_parse_arguments(_ARGS "" "BINARY" "" ${ARGN})
+ string(REPLACE "(" "_" testname "${_dir}")
+ string(REPLACE ")" "_" testname "${testname}")
+ add_test(${testname} ${CMAKE_CTEST_COMMAND}
+ --build-and-test
+ "${CMAKE_CURRENT_SOURCE_DIR}/${_dir}"
+ "${CMAKE_CURRENT_BINARY_DIR}/${_dir}"
+ --build-config "${CMAKE_BUILD_TYPE}"
+ --build-generator ${CMAKE_GENERATOR}
+ --build-makeprogram ${CMAKE_MAKE_PROGRAM}
+ --build-project ${_dir}
+ --build-options "-DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH}" ${BUILD_OPTIONS_LIST}
+ --test-command ${_ARGS_BINARY}
+ )
+endmacro()
+
+macro(expect_fail _dir)
+ string(REPLACE "(" "_" testname "${_dir}")
+ string(REPLACE ")" "_" testname "${testname}")
+ file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/failbuild/${_dir}")
+ file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/${_dir}" DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/failbuild/${_dir}")
+
+ file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/failbuild/${_dir}/${_dir}/FindPackageHints.cmake" "set(Qt5Tests_PREFIX_PATH \"${CMAKE_PREFIX_PATH}\")")
+
+ file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/failbuild/${_dir}/CMakeLists.txt"
+ "
+ cmake_minimum_required(VERSION 2.8)
+ project(${_dir})
+
+ try_compile(Result \${CMAKE_CURRENT_BINARY_DIR}/${_dir}
+ \${CMAKE_CURRENT_SOURCE_DIR}/${_dir}
+ ${_dir}
+ OUTPUT_VARIABLE Out
+ )
+ message(\"\${Out}\")
+ if (Result)
+ message(SEND_ERROR \"Succeeded build which should fail\")
+ endif()
+ "
+ )
+ add_test(${testname} ${CMAKE_CTEST_COMMAND}
+ --build-and-test
+ "${CMAKE_CURRENT_BINARY_DIR}/failbuild/${_dir}"
+ "${CMAKE_CURRENT_BINARY_DIR}/failbuild/${_dir}/build"
+ --build-config "${CMAKE_BUILD_TYPE}"
+ --build-generator ${CMAKE_GENERATOR}
+ --build-makeprogram ${CMAKE_MAKE_PROGRAM}
+ --build-project ${_dir}
+ --build-options "-DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH}" ${BUILD_OPTIONS_LIST}
+ )
+endmacro()
+
+function(test_module_includes)
+
+ set(all_args ${ARGN})
+ set(packages_string "")
+ set(libraries_string "")
+
+ foreach(_package ${Qt5_MODULE_TEST_DEPENDS})
+ set(packages_string
+ "
+ ${packages_string}
+ find_package(Qt5${_package} 5.0.0 REQUIRED)
+ "
+ )
+ endforeach()
+
+ while(all_args)
+ list(GET all_args 0 qtmodule)
+ list(REMOVE_AT all_args 0 1)
+
+ set(CMAKE_MODULE_VERSION ${CMAKE_${qtmodule}_MODULE_MAJOR_VERSION}.${CMAKE_${qtmodule}_MODULE_MINOR_VERSION}.${CMAKE_${qtmodule}_MODULE_PATCH_VERSION} )
+
+ set(packages_string
+ "${packages_string}
+ find_package(Qt5${qtmodule} 5.0.0 REQUIRED)
+ include_directories(\${Qt5${qtmodule}_INCLUDE_DIRS})
+ add_definitions(\${Qt5${qtmodule}_DEFINITIONS})\n")
+
+ list(FIND CMAKE_MODULES_UNDER_TEST ${qtmodule} _findIndex)
+ if (NOT _findIndex STREQUAL -1)
+ set(packages_string
+ "${packages_string}
+ if(NOT \"\${Qt5${qtmodule}_VERSION}\" VERSION_EQUAL ${CMAKE_MODULE_VERSION})
+ message(SEND_ERROR \"Qt5${qtmodule}_VERSION variable was not ${CMAKE_MODULE_VERSION}. Got \${Qt5${qtmodule}_VERSION} instead.\")
+ endif()
+ if(NOT \"\${Qt5${qtmodule}_VERSION_MAJOR}\" VERSION_EQUAL ${CMAKE_${qtmodule}_MODULE_MAJOR_VERSION})
+ message(SEND_ERROR \"Qt5${qtmodule}_VERSION_MAJOR variable was not ${CMAKE_${qtmodule}_MODULE_MAJOR_VERSION}. Got \${Qt5${qtmodule}_VERSION_MAJOR} instead.\")
+ endif()
+ if(NOT \"\${Qt5${qtmodule}_VERSION_MINOR}\" VERSION_EQUAL ${CMAKE_${qtmodule}_MODULE_MINOR_VERSION})
+ message(SEND_ERROR \"Qt5${qtmodule}_VERSION_MINOR variable was not ${CMAKE_${qtmodule}_MODULE_MINOR_VERSION}. Got \${Qt5${qtmodule}_VERSION_MINOR} instead.\")
+ endif()
+ if(NOT \"\${Qt5${qtmodule}_VERSION_PATCH}\" VERSION_EQUAL ${CMAKE_${qtmodule}_MODULE_PATCH_VERSION})
+ message(SEND_ERROR \"Qt5${qtmodule}_VERSION_PATCH variable was not ${CMAKE_${qtmodule}_MODULE_PATCH_VERSION}. Got \${Qt5${qtmodule}_VERSION_PATCH} instead.\")
+ endif()
+ if(NOT \"\${Qt5${qtmodule}_VERSION_STRING}\" VERSION_EQUAL ${CMAKE_MODULE_VERSION})
+ message(SEND_ERROR \"Qt5${qtmodule}_VERSION_STRING variable was not ${CMAKE_MODULE_VERSION}. Got \${Qt5${qtmodule}_VERSION_STRING} instead.\")
+ endif()\n"
+ )
+ endif()
+ set(libraries_string "${libraries_string} Qt5::${qtmodule}")
+ endwhile()
+
+ file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/module_includes/CMakeLists.txt"
+ "
+ cmake_minimum_required(VERSION 2.8)
+ project(module_includes)
+
+ ${packages_string}
+
+ set(CMAKE_CXX_FLAGS \"\${CMAKE_CXX_FLAGS} \${Qt5Core_EXECUTABLE_COMPILE_FLAGS}\")
+ if (CMAKE_VERSION VERSION_LESS 3.3)
+ if (CMAKE_CXX_COMPILER_ID STREQUAL AppleClang
+ OR (APPLE AND CMAKE_CXX_COMPILER_ID STREQUAL Clang))
+ set(CMAKE_CXX_FLAGS \"\${CMAKE_CXX_FLAGS} -std=gnu++0x -stdlib=libc++\")
+ elseif (CMAKE_CXX_COMPILER_ID STREQUAL GNU
+ OR CMAKE_CXX_COMPILER_ID STREQUAL Clang)
+ set(CMAKE_CXX_FLAGS \"\${CMAKE_CXX_FLAGS} -std=gnu++0x\")
+ endif()
+ endif()
+
+ add_executable(module_includes_exe \"\${CMAKE_CURRENT_SOURCE_DIR}/main.cpp\")
+ target_link_libraries(module_includes_exe ${libraries_string})\n"
+ )
+
+ set(all_args ${ARGN})
+ set(includes_string "")
+ set(instances_string "")
+ while(all_args)
+ list(GET all_args 0 qtmodule)
+ list(GET all_args 1 qtclass)
+ if (${qtclass}_NAMESPACE)
+ set(qtinstancetype ${${qtclass}_NAMESPACE}::${qtclass})
+ else()
+ set(qtinstancetype ${qtclass})
+ endif()
+ list(REMOVE_AT all_args 0 1)
+ set(includes_string
+ "${includes_string}
+ #include <${qtclass}>
+ #include <Qt${qtmodule}/${qtclass}>
+ #include <Qt${qtmodule}>
+ #include <Qt${qtmodule}/Qt${qtmodule}>"
+ )
+ set(instances_string
+ "${instances_string}
+ ${qtinstancetype} local${qtclass};
+ ")
+ endwhile()
+
+ file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/module_includes/main.cpp"
+ "
+
+ ${includes_string}
+
+ int main(int, char **) { ${instances_string} return 0; }\n"
+ )
+
+ add_test(module_includes ${CMAKE_CTEST_COMMAND}
+ --build-and-test
+ "${CMAKE_CURRENT_BINARY_DIR}/module_includes/"
+ "${CMAKE_CURRENT_BINARY_DIR}/module_includes/build"
+ --build-config "${CMAKE_BUILD_TYPE}"
+ --build-generator ${CMAKE_GENERATOR}
+ --build-makeprogram ${CMAKE_MAKE_PROGRAM}
+ --build-project module_includes
+ --build-options "-DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH}" ${BUILD_OPTIONS_LIST}
+ )
+endfunction()