CMake: Add function to create qmake build tests
Uses CMake's add_test and fixtures to call qmake and make, thus allowing to create tests that ensure that building qmake projects works. Pick-to: 6.4 Task-number: QTBUG-96058 Change-Id: I6f03c4389896f9571bb4f9551f93295075c3d8e1 Reviewed-by: Jörg Bornemann <joerg.bornemann@qt.io>
This commit is contained in:
parent
459f714662
commit
e76286fd4b
@ -442,6 +442,137 @@ macro(_qt_internal_test_expect_pass _dir)
|
|||||||
unset(__expect_pass_build_dir)
|
unset(__expect_pass_build_dir)
|
||||||
endmacro()
|
endmacro()
|
||||||
|
|
||||||
|
# Checks if a qmake project can be built successfully. Arguments:
|
||||||
|
#
|
||||||
|
# TESTNAME: a custom test name to use instead of the one derived from the source directory name.
|
||||||
|
# the name also applies to the generated build directory.
|
||||||
|
#
|
||||||
|
# QMAKE_OPTIONS: a list of variable assignments to pass to the qmake invocation.
|
||||||
|
# e.g. CONFIG+=debug
|
||||||
|
#
|
||||||
|
# BUILD_ENVIRONMENT: a list of environment assignments to use when invoking the build tool
|
||||||
|
function(_qt_internal_add_qmake_test dir_name)
|
||||||
|
set(test_option_args
|
||||||
|
)
|
||||||
|
set(test_single_args
|
||||||
|
TESTNAME
|
||||||
|
)
|
||||||
|
set(test_multi_args
|
||||||
|
QMAKE_OPTIONS
|
||||||
|
BUILD_ENVIRONMENT
|
||||||
|
)
|
||||||
|
|
||||||
|
# PARSE_ARGV parsing keeps ';' in ENVIRONMENT variables
|
||||||
|
cmake_parse_arguments(PARSE_ARGV 1 arg
|
||||||
|
"${test_option_args}"
|
||||||
|
"${test_single_args}"
|
||||||
|
"${test_multi_args}"
|
||||||
|
)
|
||||||
|
|
||||||
|
if(arg_TESTNAME)
|
||||||
|
set(testname "${arg_TESTNAME}")
|
||||||
|
else()
|
||||||
|
string(REGEX REPLACE "[/)(]" "_" testname "${dir_name}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(source_dir "${CMAKE_CURRENT_SOURCE_DIR}/${dir_name}")
|
||||||
|
if(arg_TESTNAME)
|
||||||
|
set(build_dir "${CMAKE_CURRENT_BINARY_DIR}/${arg_TESTNAME}")
|
||||||
|
else()
|
||||||
|
set(build_dir "${CMAKE_CURRENT_BINARY_DIR}/${dir_name}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Find the qmake binary or the wrapper qmake script when cross-compiling..
|
||||||
|
if(QtBase_BINARY_DIR AND NOT QT_BUILD_STANDALONE_TESTS)
|
||||||
|
set(qmake_dir "${QtBase_BINARY_DIR}/${INSTALL_BINDIR}")
|
||||||
|
else()
|
||||||
|
set(qmake_dir "${QT6_INSTALL_PREFIX}/${QT6_INSTALL_BINS}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(qmake_path "${qmake_dir}/qmake${CMAKE_EXECUTABLE_SUFFIX}")
|
||||||
|
|
||||||
|
set(qmake_args
|
||||||
|
"${source_dir}"
|
||||||
|
${arg_QMAKE_OPTIONS}
|
||||||
|
)
|
||||||
|
|
||||||
|
# Try to choose an appropriate build tool.
|
||||||
|
if(ENV{QT_QMAKE_TEST_BUILD_TOOL})
|
||||||
|
set(build_tool "$ENV{QT_QMAKE_TEST_BUILD_TOOL}")
|
||||||
|
elseif(MSVC)
|
||||||
|
set(build_tool "nmake")
|
||||||
|
elseif(MINGW)
|
||||||
|
set(build_tool "mingw32-make")
|
||||||
|
else()
|
||||||
|
set(build_tool "make")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(build_tool_args "")
|
||||||
|
if(ENV{QT_QMAKE_TEST_BUILD_TOOL_OPTIONS})
|
||||||
|
set(build_tool_args "$ENV{QT_QMAKE_TEST_BUILD_TOOL_OPTIONS}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Remove any stale build dir, and create a new one on each test rerun.
|
||||||
|
add_test(${testname}_remove_build_dir
|
||||||
|
${CMAKE_COMMAND} -E remove_directory "${build_dir}"
|
||||||
|
)
|
||||||
|
set_tests_properties(${testname}_remove_build_dir PROPERTIES
|
||||||
|
FIXTURES_SETUP "${testname}_ensure_clean_build_dir"
|
||||||
|
)
|
||||||
|
|
||||||
|
add_test(${testname}_create_build_dir
|
||||||
|
${CMAKE_COMMAND} -E make_directory "${build_dir}"
|
||||||
|
)
|
||||||
|
set_tests_properties(${testname}_create_build_dir PROPERTIES
|
||||||
|
FIXTURES_SETUP "${testname}_ensure_clean_build_dir"
|
||||||
|
)
|
||||||
|
|
||||||
|
set_tests_properties(${testname}_create_build_dir
|
||||||
|
PROPERTIES DEPENDS ${testname}_remove_build_dir)
|
||||||
|
|
||||||
|
# Add test to call qmake.
|
||||||
|
#
|
||||||
|
# We can't use the add_test(NAME) signature to set a working directory, because that breaks
|
||||||
|
# when calling ctest without a -C <config> using multi-config generators, and the CI calls
|
||||||
|
# ctest without -C, and we use Xcode when configuring tests for iOS, which is multi-config.
|
||||||
|
# The plain add_test signature does not have this issue.
|
||||||
|
# Work around this by using a wrapper script that sets a working directory and use the plain
|
||||||
|
# signature.
|
||||||
|
# Somewhat related issue https://gitlab.kitware.com/cmake/cmake/-/issues/20283
|
||||||
|
set(qmake_wrapper_file "${CMAKE_CURRENT_BINARY_DIR}/run_qmake_${testname}.cmake")
|
||||||
|
_qt_internal_create_command_script(
|
||||||
|
COMMAND "${qmake_path}" ${qmake_args}
|
||||||
|
COMMAND_ECHO STDOUT
|
||||||
|
OUTPUT_FILE "${qmake_wrapper_file}"
|
||||||
|
WORKING_DIRECTORY "${build_dir}"
|
||||||
|
)
|
||||||
|
|
||||||
|
add_test(${testname}_qmake "${CMAKE_COMMAND}" "-P" "${qmake_wrapper_file}")
|
||||||
|
|
||||||
|
set_tests_properties(${testname}_qmake PROPERTIES
|
||||||
|
DEPENDS ${testname}_create_build_dir
|
||||||
|
FIXTURES_REQUIRED "${testname}_ensure_clean_build_dir"
|
||||||
|
FIXTURES_SETUP "${testname}_configure_project"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Add test to build the generated qmake project.
|
||||||
|
set(build_tool_wrapper_file "${CMAKE_CURRENT_BINARY_DIR}/run_build_${testname}.cmake")
|
||||||
|
_qt_internal_create_command_script(
|
||||||
|
COMMAND "${build_tool}" ${build_tool_args}
|
||||||
|
COMMAND_ECHO STDOUT
|
||||||
|
OUTPUT_FILE "${build_tool_wrapper_file}"
|
||||||
|
WORKING_DIRECTORY "${build_dir}"
|
||||||
|
ENVIRONMENT ${arg_BUILD_ENVIRONMENT}
|
||||||
|
)
|
||||||
|
|
||||||
|
add_test(${testname} "${CMAKE_COMMAND}" "-P" "${build_tool_wrapper_file}")
|
||||||
|
|
||||||
|
set_tests_properties(${testname} PROPERTIES
|
||||||
|
DEPENDS ${testname}_qmake
|
||||||
|
FIXTURES_REQUIRED "${testname}_ensure_clean_build_dir;${testname}_configure_project"
|
||||||
|
)
|
||||||
|
endfunction()
|
||||||
|
|
||||||
# Checks if the build of the test project fails.
|
# Checks if the build of the test project fails.
|
||||||
# This test passes if the test project fails either at the
|
# This test passes if the test project fails either at the
|
||||||
# configuring or build steps.
|
# configuring or build steps.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user