2023-12-15 11:22:55 +01:00
|
|
|
# Copyright (C) 2024 The Qt Company Ltd.
|
|
|
|
# SPDX-License-Identifier: BSD-3-Clause
|
|
|
|
|
|
|
|
cmake_minimum_required(VERSION 3.16)
|
2025-03-25 11:52:23 +01:00
|
|
|
|
|
|
|
list(APPEND CMAKE_MODULE_PATH "${EXTRA_MODULE_PATH}")
|
|
|
|
include(Common)
|
2023-12-15 11:22:55 +01:00
|
|
|
|
|
|
|
# The file is included separately from Common.cmake because it has side-effects
|
|
|
|
# that we want to apply only in the RunCMake part of the test.
|
2025-03-25 11:52:23 +01:00
|
|
|
include(RunCMake)
|
2023-12-15 11:22:55 +01:00
|
|
|
|
|
|
|
# Uses prefix set from outside scope.
|
|
|
|
function(run_suite_command name)
|
2025-03-27 11:21:33 +01:00
|
|
|
set(RunCMake_TEST_COMMAND "${ARGN}")
|
|
|
|
set(RunCMake-check-file "check.cmake")
|
|
|
|
|
|
|
|
set(args ${ARGN})
|
|
|
|
list(JOIN args " " args_str)
|
|
|
|
set(working_dir "${RunCMake_TEST_COMMAND_WORKING_DIRECTORY}")
|
|
|
|
message(STATUS "Running command: '${args_str}' in dir: '${working_dir}'")
|
|
|
|
|
|
|
|
run_cmake("${prefix}${name}")
|
|
|
|
# set by the check file above.
|
|
|
|
if(should_error_out)
|
|
|
|
message(FATAL_ERROR "Command ${prefix}${name} failed. Exiting early.")
|
|
|
|
endif()
|
2023-12-15 11:22:55 +01:00
|
|
|
endfunction()
|
|
|
|
|
|
|
|
macro(read_expected_output test file_name)
|
|
|
|
set(expect "")
|
|
|
|
set(expect_path "${RunCMake_SOURCE_DIR}/${file_name}-stdout.txt")
|
|
|
|
if(EXISTS "${expect_path}")
|
|
|
|
file(READ "${expect_path}" expect)
|
|
|
|
endif()
|
|
|
|
|
|
|
|
if(NOT expect)
|
|
|
|
message(FATAL_ERROR "No expected output for test ${file_name}. "
|
|
|
|
"Make sure to add a ${file_name}-stdout.txt file.")
|
|
|
|
endif()
|
|
|
|
|
|
|
|
set(RunCMake_TEST_EXPECT_stdout "${expect}")
|
|
|
|
endmacro()
|
|
|
|
|
|
|
|
function(run_suite_test test_name)
|
|
|
|
set(options "ONLY_CMAKE")
|
|
|
|
set(oneValueArgs "EXPECT_NAME")
|
|
|
|
set(multiValueArgs "COMMAND_ARGS")
|
|
|
|
cmake_parse_arguments(arg "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
|
|
|
|
|
|
|
|
if(prefix STREQUAL "perl" AND arg_ONLY_CMAKE)
|
|
|
|
return()
|
|
|
|
endif()
|
|
|
|
|
|
|
|
if(arg_EXPECT_NAME)
|
|
|
|
set(expect_name "${arg_EXPECT_NAME}")
|
|
|
|
else()
|
|
|
|
set(expect_name "${test_name}")
|
|
|
|
endif()
|
|
|
|
|
|
|
|
read_expected_output(${test_name} ${expect_name})
|
|
|
|
run_suite_command(${test_name} ${arg_COMMAND_ARGS})
|
|
|
|
endfunction()
|
|
|
|
|
|
|
|
function(run_suite)
|
|
|
|
set(options
|
|
|
|
USE_PERL_SCRIPT
|
|
|
|
)
|
|
|
|
set(oneValueArgs "")
|
|
|
|
set(multiValueArgs "")
|
|
|
|
cmake_parse_arguments(arg "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
|
|
|
|
|
|
|
|
if(arg_USE_PERL_SCRIPT)
|
|
|
|
set(use_perl_script TRUE)
|
|
|
|
set(prefix "perl")
|
|
|
|
set(extra_ir_args "")
|
|
|
|
else()
|
|
|
|
set(use_perl_script FALSE)
|
|
|
|
set(prefix "cmake")
|
|
|
|
# When testing the cmake script, we don't want to resolve deps by default and
|
|
|
|
# we want output to be the same as the one shown by the perl script.
|
|
|
|
set(extra_ir_args "--no-resolve-deps" "--perl-identical-output")
|
|
|
|
endif()
|
|
|
|
|
|
|
|
# Set in Common.cmake
|
|
|
|
set(local_clone_url "${top_repo_dir_path}")
|
|
|
|
|
|
|
|
# Path to temp qt6 dir based on script used.
|
|
|
|
set(tmp_path "${CMAKE_CURRENT_SOURCE_DIR}/tmp_${prefix}")
|
|
|
|
set(qt6_repo_dir "${tmp_path}/qt6")
|
|
|
|
|
|
|
|
# Path to init-repository script
|
|
|
|
set(init_repository_script_path "${qt6_repo_dir}/init-repository")
|
|
|
|
if(use_perl_script)
|
|
|
|
string(APPEND init_repository_script_path ".pl")
|
|
|
|
|
|
|
|
# Need to call perl explicitly, especially on Windows
|
|
|
|
list(PREPEND init_repository_script_path perl)
|
|
|
|
elseif(CMAKE_HOST_WIN32)
|
|
|
|
string(APPEND init_repository_script_path ".bat")
|
|
|
|
endif()
|
|
|
|
|
|
|
|
# Clean up the temp qt6 repo dir.
|
|
|
|
file(REMOVE_RECURSE "${qt6_repo_dir}")
|
|
|
|
file(REMOVE_RECURSE "${tmp_path}")
|
|
|
|
file(MAKE_DIRECTORY "${tmp_path}")
|
|
|
|
set(RunCMake_TEST_COMMAND_WORKING_DIRECTORY "${tmp_path}")
|
|
|
|
|
2025-03-27 11:35:29 +01:00
|
|
|
set(code_qt_io_mirror "https://code.qt.io/qt/qt5.git")
|
|
|
|
set(gerrit_mirror "https://codereview.qt-project.org/qt/qt5")
|
|
|
|
|
|
|
|
# Make a copy of the qt6 repo on which the test will operate on.
|
|
|
|
# On the CI we clone it from the official mirror, because we don't have a git repo, but only
|
|
|
|
# a source archive.
|
|
|
|
# On a local build we use the current qt6 checkout.
|
|
|
|
set(ci_ref "$ENV{TESTED_MODULE_REVISION_COIN}")
|
|
|
|
if(ci_ref)
|
|
|
|
set(final_clone_url "${code_qt_io_mirror}")
|
|
|
|
else()
|
|
|
|
set(final_clone_url "${local_clone_url}")
|
|
|
|
endif()
|
|
|
|
|
|
|
|
run_suite_command(0010_prepare_qt6_clone git clone "${final_clone_url}" qt6 --quiet)
|
2023-12-15 11:22:55 +01:00
|
|
|
set(RunCMake_TEST_COMMAND_WORKING_DIRECTORY "${qt6_repo_dir}")
|
|
|
|
|
2025-03-27 11:35:29 +01:00
|
|
|
# On the CI we also checkout the exact tested ref, so it behaves as it would with locally.
|
|
|
|
if(ci_ref)
|
|
|
|
run_suite_command(0011_fetch_ci_qt6_ref git fetch "${gerrit_mirror}" "${ci_ref}" --quiet)
|
|
|
|
run_suite_command(0012_checkout_ci_qt6_ref git checkout FETCH_HEAD --quiet)
|
|
|
|
endif()
|
|
|
|
|
2023-12-15 11:22:55 +01:00
|
|
|
# Adjust its remote url to be the official mirror rather the local url.
|
2025-03-27 11:35:29 +01:00
|
|
|
set(remote_clone_url "${code_qt_io_mirror}")
|
2023-12-15 11:22:55 +01:00
|
|
|
run_suite_command(0020_set_qt6_remote_url git remote set-url origin "${remote_clone_url}")
|
|
|
|
|
|
|
|
# Ignore certain lines
|
|
|
|
set(RunCMake_TEST_EXTRA_IGNORE_LINE_REGEX
|
|
|
|
"|Trace will be written to"
|
|
|
|
"|Put cmake in trace mode, but with variables expanded"
|
|
|
|
"|Put cmake in trace mode and redirect trace output"
|
|
|
|
)
|
|
|
|
|
|
|
|
# Merge stdout with stderr, otherwise we can't test for the same output across script
|
|
|
|
# implementations, because CMake has no easy way to control with output stream
|
|
|
|
# should be used.
|
|
|
|
set(RunCMake_TEST_OUTPUT_MERGE TRUE)
|
|
|
|
|
|
|
|
# Initialize just qtsvg
|
|
|
|
run_suite_test(0030_ir_qtsvg
|
|
|
|
COMMAND_ARGS ${init_repository_script_path} --module-subset=qtsvg ${extra_ir_args})
|
|
|
|
|
|
|
|
# Asking to do it again will refuse to do it, unless forced, because the repo has already been
|
|
|
|
# initialized. Only do this check for cmake, because the perl script checks for initialization
|
|
|
|
# if qtbase is initialized, and we don't want to test that because cloning qtbase just for the
|
|
|
|
# test is too slow.
|
|
|
|
run_suite_test(0040_ir_qtsvg_again
|
|
|
|
ONLY_CMAKE
|
|
|
|
COMMAND_ARGS ${init_repository_script_path} --module-subset=qtsvg ${extra_ir_args})
|
|
|
|
|
|
|
|
# Configuring without a module-subset will initialize qtsvg again, because the new behavior
|
|
|
|
# of the cmake script is to initialize previously existing submodules, rather than all of them.
|
|
|
|
run_suite_test(0050_ir_existing
|
|
|
|
ONLY_CMAKE
|
|
|
|
COMMAND_ARGS ${init_repository_script_path} -f ${extra_ir_args})
|
|
|
|
|
|
|
|
# Initialize more than one submodule, choosing the smaller ones, for faster cloning.
|
|
|
|
run_suite_test(0060_ir_shadertools_and_svg
|
|
|
|
COMMAND_ARGS ${init_repository_script_path}
|
|
|
|
--module-subset=qtshadertools,qtsvg -f
|
|
|
|
${extra_ir_args})
|
|
|
|
|
|
|
|
# Initialize qttools with dependencies, but without qtbase and qtdeclarative.
|
|
|
|
# This should also clone qtactiveqt.
|
|
|
|
list(REMOVE_ITEM extra_ir_args "--no-resolve-deps")
|
|
|
|
run_suite_test(0070_ir_qttools_with_deps
|
|
|
|
ONLY_CMAKE
|
|
|
|
COMMAND_ARGS ${init_repository_script_path}
|
|
|
|
--module-subset=qttools,-qtbase,-qtdeclarative,-qtimageformats,-qtlanguageserver -f
|
|
|
|
${extra_ir_args})
|
|
|
|
|
|
|
|
# Unset the working dir for further tests.
|
|
|
|
unset(RunCMake_TEST_COMMAND_WORKING_DIRECTORY)
|
|
|
|
endfunction()
|
|
|
|
|
|
|
|
run_suite()
|
|
|
|
run_suite(USE_PERL_SCRIPT)
|