CMake: Pass -v to ninja when using ctest --build-and-test

So we can see the command line invocations of the built cmake
auto tests.

To achieve that, we create a ninja shell script wrapper, because
ctest --build-and-test does not currently allow specifying custom
build tool options.

Details at
https://gitlab.kitware.com/cmake/cmake/-/issues/22443

Pick-to: 6.2 6.3
Change-Id: I7fb3b7f7f802943a7013c859b2cf39842a34e2e4
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Jörg Bornemann <joerg.bornemann@qt.io>
This commit is contained in:
Alexandru Croitor 2022-03-23 16:49:52 +01:00
parent a42e7839b2
commit 2061cea0f3
4 changed files with 93 additions and 4 deletions

View File

@ -296,10 +296,12 @@ qt_copy_or_install(DIRECTORY
DESTINATION "${__GlobalConfig_install_dir}/config.tests"
)
# Install qt-internal-strip files.
# Install qt-internal-strip and qt-internal-ninja files.
set(__qt_internal_strip_wrappers
libexec/qt-internal-strip.in
libexec/qt-internal-strip.bat.in
libexec/qt-internal-ninja.in
libexec/qt-internal-ninja.bat.in
)
qt_copy_or_install(PROGRAMS
${__qt_internal_strip_wrappers}

View File

@ -0,0 +1,3 @@
:: Make sure we don't echo, because CMake uses the output to parse out ninja's version
@echo off
@original_ninja@ @ninja_arguments@ %*

2
libexec/qt-internal-ninja.in Executable file
View File

@ -0,0 +1,2 @@
#!/bin/sh
@original_ninja@ @ninja_arguments@ "$@"

View File

@ -17,6 +17,65 @@ foreach(_mod ${CMAKE_MODULES_UNDER_TEST})
message("CMAKE_${_mod}_MODULE_PATCH_VERSION: ${CMAKE_${_mod}_MODULE_PATCH_VERSION}")
endforeach()
# Generate a shell script wrapper that calls ninja with -v parameter.
# Upstream issue to allow specifying custom build tool options when using ctest's --build-and-test
# https://gitlab.kitware.com/cmake/cmake/-/issues/22443.
# Only one file is created that is used by all tests.
function(_qt_internal_get_ninja_wrapper ninja_path out_wrapper_path)
if(QT_INTERNAL_CTEST_NINJA_WRAPPER AND EXISTS "${QT_INTERNAL_CTEST_NINJA_WRAPPER}")
set(${out_wrapper_path} "${QT_INTERNAL_CTEST_NINJA_WRAPPER}" PARENT_SCOPE)
return()
endif()
if(NOT ninja_path)
message(FATAL_ERROR "Invalid ninja path specified: '${ninja_path}'.")
endif()
set(wrapper_extension "")
if(NOT CMAKE_HOST_UNIX)
set(wrapper_extension ".bat")
endif()
set(script_name "qt-internal-ninja")
# the libexec literal is used on purpose for the source, so the file is found
# on Windows hosts.
set(wrapper_rel_path "libexec/${script_name}${wrapper_extension}.in")
# Need to find the libexec input file depending whether the qtbase sources are available.
# This mirrors the logic in qt_set_up_build_internals_paths.
# TODO: Clean this up, together with qt_set_up_build_internals_paths to only use the
# the qtbase sources when building qtbase. And perhaps also when doing a non-prefix
# developer-build.
set(qtbase_wrapper_in_path "${QT_SOURCE_TREE}/${wrapper_rel_path}")
set(installed_wrapper_in_path
"${_qt_cmake_dir}/${QT_CMAKE_EXPORT_NAMESPACE}/${wrapper_rel_path}")
# qtbase sources available, always use them, regardless of prefix or non-prefix builds.
if(EXISTS "${qtbase_wrapper_in_path}")
set(wrapper_in "${qtbase_wrapper_in_path}")
# qtbase sources unavailable, use installed files.
elseif(EXISTS "${installed_wrapper_in_path}")
set(wrapper_in "${installed_wrapper_in_path}")
else()
message(FATAL_ERROR "Can't find ${script_name}${wrapper_extension}.in file.")
endif()
set(wrapper_out "${CMAKE_BINARY_DIR}/.qt/${script_name}${wrapper_extension}")
set(original_ninja "${ninja_path}")
set(ninja_arguments "-v")
configure_file("${wrapper_in}" "${wrapper_out}" @ONLY)
set(QT_INTERNAL_CTEST_NINJA_WRAPPER "${wrapper_out}" CACHE STRING
"Internal Qt ninja wrapper for ctest tests")
set(${out_wrapper_path} "${QT_INTERNAL_CTEST_NINJA_WRAPPER}" PARENT_SCOPE)
endfunction()
# The function collects configuring options for the test projects generated by Qt cmake tests.
# Arguments:
# OUT_PREFIX_PATH <variable name>: stores the CMAKE_PREFIX_PATH value in the output variable.
@ -238,9 +297,14 @@ macro(_qt_internal_test_expect_pass _dir)
endif()
# Allow setting a different make program.
set(make_program "${CMAKE_MAKE_PROGRAM}")
if(_ARGS_MAKE_PROGRAM)
set(make_program "${_ARGS_MAKE_PROGRAM}")
elseif(CMAKE_GENERATOR MATCHES "Ninja")
# Use a ninja wrapper when generator is ninja
_qt_internal_get_ninja_wrapper("${CMAKE_MAKE_PROGRAM}" ninja_wrapper)
set(make_program "${ninja_wrapper}")
else()
set(make_program "${CMAKE_MAKE_PROGRAM}")
endif()
# Only pass build config if it was specified during the initial tests/auto project
@ -418,13 +482,22 @@ list(APPEND CMAKE_PREFIX_PATH \"${__expect_fail_prefixes}\")
"
)
if(CMAKE_GENERATOR MATCHES "Ninja")
# Use a ninja wrapper when generator is ninja
_qt_internal_get_ninja_wrapper("${CMAKE_MAKE_PROGRAM}" ninja_wrapper)
set(make_program "${ninja_wrapper}")
else()
set(make_program "${CMAKE_MAKE_PROGRAM}")
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-makeprogram "${make_program}"
--build-project "${_dir}"
--build-options ${option_list}
)
@ -522,13 +595,22 @@ function(_qt_internal_test_module_includes)
)
_qt_internal_get_cmake_test_configure_options(option_list)
if(CMAKE_GENERATOR MATCHES "Ninja")
# Use a ninja wrapper when generator is ninja
_qt_internal_get_ninja_wrapper("${CMAKE_MAKE_PROGRAM}" ninja_wrapper)
set(make_program "${ninja_wrapper}")
else()
set(make_program "${CMAKE_MAKE_PROGRAM}")
endif()
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-makeprogram "${make_program}"
--build-project module_includes
--build-options ${option_list}
)