qt6-bb10/tests/auto/cmake/test_qt_add_ui_common/functions.cmake

223 lines
9.1 KiB
CMake

# Copyright (C) 2024 The Qt Company Ltd.
# SPDX-License-Identifier: BSD-3-Clause
function(generate_hash_folder target_name infile out_folder)
get_filename_component(infile_abs "${infile}" ABSOLUTE)
string(SHA1 infile_hash "${target_name}${infile_abs}")
string(SUBSTRING "${infile_hash}" 0 6 short_hash)
set(${out_folder} "${short_hash}" PARENT_SCOPE)
endfunction()
function(get_latest_vs_generator output)
execute_process(COMMAND ${CMAKE_COMMAND} -G
ERROR_VARIABLE CMAKE_GENERATORS_ERROR
OUTPUT_STRIP_TRAILING_WHITESPACE)
string(REGEX MATCHALL "Visual Studio [0-9]+ [0-9]+" vs_generators
"${CMAKE_GENERATORS_ERROR}")
if(NOT vs_generators)
message(FATAL_ERROR "No visual studio generators found")
endif()
set(last_version "0")
set(last_generator "")
foreach(generator IN LISTS vs_generators)
string(REGEX MATCH "Visual Studio ([0-9]+) [0-9]+" unused "${generator}")
if("${CMAKE_MATCH_1}" VERSION_GREATER "${last_version}")
set(last_version "${CMAKE_MATCH_1}")
set(last_generator "${CMAKE_MATCH_0}")
endif()
endforeach()
set(${output} "${last_generator}" PARENT_SCOPE)
endfunction()
function(check_unwanted_builds_after_first_build cmake_output test_name test_dir
generator)
set(unwanted_builds_success_message
"\"${test_name}\" in \"${test_dir}\" -> No unwanted builds")
set(unwanted_builds_failure_message
"\"${test_name}\" in \"${test_dir}\" -> Unwanted builds found")
if(${generator} MATCHES "Ninja")
expect_string_not_contains(${cmake_output}
"widget2.cpp.o.d|mainwindow.cpp.o.d"
SUCCESS_MESSAGE ${unwanted_builds_success_message}
FAILURE_MESSAGE ${unwanted_builds_failure_message})
elseif(${generator} MATCHES "Make")
string(CONCAT not_expect_string
"Building CXX object UicIncrementalBuild/CMakeFiles"
"/example.dir/src/widget2.cpp.o|Building CXX object UicIncremental"
"Build/CMakeFiles/example.dir/src/mainwindow.cpp.o")
expect_string_not_contains(${cmake_output} "${not_expect_string}"
SUCCESS_MESSAGE ${unwanted_builds_success_message}
FAILURE_MESSAGE ${unwanted_builds_failure_message})
elseif(${generator} MATCHES "Visual Studio")
expect_string_not_contains(${cmake_output} "widget2.cpp|mainwindow.cpp"
SUCCESS_MESSAGE ${unwanted_builds_success_message}
FAILURE_MESSAGE ${unwanted_builds_failure_message})
elseif(${generator} MATCHES "Xcode")
expect_string_not_contains(${cmake_output} "widget2.cpp|mainwindow.cpp"
SUCCESS_MESSAGE ${unwanted_builds_success_message}
FAILURE_MESSAGE ${unwanted_builds_failure_message})
endif()
endfunction()
function(check_output_after_second_build cmake_output test_name
test_dir generator)
set(second_build_success_message
"\"${test_name}\" in \"${test_dir}\" -> Generation of UI files were not \
triggered in the second build")
set(second_build_failure_message
"\"${test_name}\" in \"${test_dir}\" -> Generation of UI files were \
triggered in the second build")
if(${generator} MATCHES "Ninja")
expect_string_contains(${cmake_output} "ninja: no work to do."
SUCCESS_MESSAGE ${second_build_success_message}
FAILURE_MESSAGE ${second_build_failure_message})
elseif(${generator} MATCHES "Visual Studio" OR ${generator} MATCHES "Xcode")
expect_string_not_contains(${cmake_output} "mainwindow"
SUCCESS_MESSAGE
${second_build_success_message}
FAILURE_MESSAGE
${second_build_failure_message})
elseif(${generator} MATCHES "Makefiles")
expect_string_not_contains(${cmake_output} "mainwindow.cpp.o.d -o"
SUCCESS_MESSAGE ${second_build_success_message}
FAILURE_MESSAGE ${second_build_failure_message})
endif()
endfunction()
function(incremental_build_test)
set(options CHECK_UNWANTED_BUILDS)
set(oneValueArgs CONFIG TEST_NAME SOURCE_DIR BUILD_DIR FILE_TO_TOUCH
FILE_TO_CHECK FOLDER_TO_CHECK GENERATOR)
set(multiValueArgs ADDITIONAL_ARGS)
cmake_parse_arguments(arg "${options}" "${oneValueArgs}" "${multiValueArgs}"
${ARGN})
if ("${arg_SOURCE_DIR}" STREQUAL "")
message(FATAL_ERROR "FAIL: \"${arg_TEST_NAME}\" test failed because "
"SOURCE_DIR is empty")
endif()
if ("${arg_BUILD_DIR}" STREQUAL "")
message(FATAL_ERROR "FAIL: \"${arg_TEST_NAME}\" test failed because "
"BUILD_DIR is empty")
endif()
if ("${arg_GENERATOR}" STREQUAL "")
message(FATAL_ERROR "FAIL: \"${arg_TEST_NAME}\" test failed because "
"GENERATOR is empty")
endif()
run_cmake_configure(SOURCE_DIR "${arg_SOURCE_DIR}"
BUILD_DIR "${arg_BUILD_DIR}"
GENERATOR "${arg_GENERATOR}"
CLEAN_FIRST
ADDITIONAL_ARGS ${arg_ADDITIONAL_ARGS}
OUTPUT_VARIABLE cmake_output
ERROR_VARIABLE cmake_error
RESULT_VARIABLE cmake_result)
if(${cmake_result} EQUAL 0)
message(STATUS
"PASS: \"${arg_TEST_NAME}\" test in ${arg_BUILD_DIR} was configured "
"successfully")
else()
message(FATAL_ERROR "cmake_output: ${cmake_output}\ncmake_error: "
"${cmake_error}\nFAIL: \"${arg_TEST_NAME}\" test in ${arg_BUILD_DIR}"
" failed to configure")
endif()
if(NOT "${arg_CONFIG}" STREQUAL "single_config")
set(config_arg "${arg_CONFIG}")
endif()
run_cmake_build(BUILD_DIR ${arg_BUILD_DIR}
VERBOSE ON
CONFIG ${config_arg}
OUTPUT_VARIABLE cmake_build_output
ERROR_VARIABLE cmake_build_error
RESULT_VARIABLE cmake_build_result)
if(${cmake_build_result} EQUAL 0)
message(STATUS
"PASS: \"${arg_TEST_NAME}\" test in ${arg_BUILD_DIR} was built "
"successfully")
else()
message(FATAL_ERROR
"cmake_build_output: ${cmake_build_output}\ncmake_build_error: "
"${cmake_build_error}\nFAIL: \"${arg_TEST_NAME}\" test in "
"${arg_BUILD_DIR} failed to build")
endif()
if(NOT "${arg_FILE_TO_CHECK}" STREQUAL "")
if(NOT EXISTS "${arg_FILE_TO_CHECK}")
message(FATAL_ERROR "FAIL: \"${arg_TEST_NAME}\" ${arg_FILE_TO_CHECK}"
" could not be found")
else()
message(STATUS "PASS: \"${arg_TEST_NAME}\" \"${arg_FILE_TO_CHECK}\" "
"was generated successfully")
endif()
endif()
if(NOT "${arg_FOLDER_TO_CHECK}" STREQUAL "" AND NOT WIN32)
if(NOT EXISTS "${arg_FOLDER_TO_CHECK}")
message(FATAL_ERROR
"FAIL: \"${arg_TEST_NAME}\" Folder \"${arg_FOLDER_TO_CHECK}\" "
"does not exist")
else()
message(STATUS
"PASS: \"${arg_TEST_NAME}\" Folder \"${arg_FOLDER_TO_CHECK}\" "
"exists")
endif()
endif()
if(NOT "${arg_FILE_TO_TOUCH}" STREQUAL "")
file(TOUCH "${arg_FILE_TO_TOUCH}")
endif()
run_cmake_build(BUILD_DIR ${arg_BUILD_DIR}
VERBOSE ON
CONFIG ${arg_CONFIG}
OUTPUT_VARIABLE cmake_build_output)
if(${arg_CHECK_UNWANTED_BUILDS})
check_unwanted_builds_after_first_build(${cmake_build_output}
${arg_TEST_NAME} ${arg_BUILD_DIR} ${arg_GENERATOR})
endif()
run_cmake_build(BUILD_DIR ${arg_BUILD_DIR}
VERBOSE ON
CONFIG ${arg_CONFIG}
OUTPUT_VARIABLE cmake_build_output)
check_output_after_second_build(${cmake_build_output}
${arg_TEST_NAME} ${arg_BUILD_DIR} ${arg_GENERATOR})
endfunction()
function(get_generators output)
if(${CMAKE_HOST_SYSTEM_NAME} MATCHES "Linux")
set(generators "Unix Makefiles" "Ninja" "Ninja Multi-Config")
elseif(${CMAKE_HOST_SYSTEM_NAME} MATCHES "Windows")
# CI fails with Clang and Visual Studio generators.
# That's why discard that combination.
if (NOT "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" AND
NOT MINGW)
get_latest_vs_generator(latest_vs)
endif()
set(generators "Ninja" "Ninja Multi-Config" "${latest_vs}")
elseif(${CMAKE_HOST_SYSTEM_NAME} MATCHES "Darwin")
# TODO: Add Xcode generator when
# https://gitlab.kitware.com/cmake/cmake/-/issues/25790 is fixed.
# Otherwise, adding Xcode generator might fail CI due to the timeout
# issue.
set(generators "Unix Makefiles" "Ninja" "Ninja Multi-Config")
else()
string(JOIN "" ERROR_MESSAGE
"FAIL: host OS not supported for this test."
"host : ${CMAKE_HOST_SYSTEM_NAME}")
message(FATAL_ERROR "${ERROR_MESSAGE}")
endif()
set(${output} "${generators}" PARENT_SCOPE)
endfunction()