diff options
author | Leander Beernaert <leander.beernaert@qt.io> | 2019-10-24 10:50:06 +0200 |
---|---|---|
committer | Leander Beernaert <leander.beernaert@qt.io> | 2019-10-28 09:18:28 +0000 |
commit | 080f9ad160ef7422b2bab884c7ccc950d35b3a0a (patch) | |
tree | 3c27a8b4f386e4e8e66a5bbf9141de4d200f7560 | |
parent | d183c21a2cde1b4d987e1f4497611b0fe586bdc1 (diff) |
Enable running test on Android
This patch converts all add_executable calls when building for Android
to a module library and replaces the call to add_test() to use
the android testrunner binary.
Change-Id: I10ba5919217cdc93cc2cbbb7d13ad9d10fc5ac1a
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
-rw-r--r-- | cmake/QtBuild.cmake | 35 | ||||
-rw-r--r-- | cmake/QtPlatformAndroid.cmake | 29 |
2 files changed, 55 insertions, 9 deletions
diff --git a/cmake/QtBuild.cmake b/cmake/QtBuild.cmake index bb1cf3e414..4c2c1e69b8 100644 --- a/cmake/QtBuild.cmake +++ b/cmake/QtBuild.cmake @@ -2287,7 +2287,20 @@ function(add_qt_executable name) set(arg_INSTALL_DIRECTORY "${INSTALL_BINDIR}") endif() - add_executable("${name}" ${arg_EXE_FLAGS}) + if (ANDROID) + add_library("${name}" MODULE) + qt_android_apply_arch_suffix("${name}") + qt_android_generate_deployment_settings("${name}") + qt_android_add_apk_target("${name}") + # On our qmake builds we don't compile the executables with + # visibility=hidden. Not having this flag set will cause the + # executable to have main() hidden and can then no longer be loaded + # through dlopen() + set_property(TARGET ${name} PROPERTY C_VISIBILITY_PRESET default) + set_property(TARGET ${name} PROPERTY CXX_VISIBILITY_PRESET default) + else() + add_executable("${name}" ${arg_EXE_FLAGS}) + endif() qt_autogen_tools_initial_setup(${name}) @@ -2320,6 +2333,7 @@ function(add_qt_executable name) ) set_target_properties("${name}" PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${arg_OUTPUT_DIRECTORY}" + LIBRARY_OUTPUT_DIRECTORY "${arg_OUTPUT_DIRECTORY}" WIN32_EXECUTABLE "${arg_GUI}" MACOSX_BUNDLE "${arg_GUI}" ) @@ -2331,6 +2345,7 @@ function(add_qt_executable name) if(NOT arg_NO_INSTALL) qt_install(TARGETS "${name}" RUNTIME DESTINATION "${arg_INSTALL_DIRECTORY}" + LIBRARY DESTINATION "${arg_INSTALL_DIRECTORY}" BUNDLE DESTINATION "${arg_INSTALL_DIRECTORY}") endif() endfunction() @@ -2417,15 +2432,19 @@ function(add_qt_test name) # and use it also for XML output file(RELATIVE_PATH label "${PROJECT_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/${name}") - if(arg_QMLTEST AND NOT arg_SOURCES) - set(test_working_dir "${CMAKE_CURRENT_SOURCE_DIR}") - set(test_executable ${QT_CMAKE_EXPORT_NAMESPACE}::qmltestrunner) + if (ANDROID) + qt_android_add_test("${name}") else() - set(test_working_dir "${CMAKE_CURRENT_BINARY_DIR}") - set(test_executable "${name}") - endif() + if(arg_QMLTEST AND NOT arg_SOURCES) + set(test_working_dir "${CMAKE_CURRENT_SOURCE_DIR}") + set(test_executable ${QT_CMAKE_EXPORT_NAMESPACE}::qmltestrunner) + else() + set(test_working_dir "${CMAKE_CURRENT_BINARY_DIR}") + set(test_executable "${name}") + endif() - add_test(NAME "${name}" COMMAND ${test_executable} ${extra_test_args} -o ${name}.xml,xml -o -,txt WORKING_DIRECTORY "${test_working_dir}") + add_test(NAME "${name}" COMMAND ${test_executable} ${extra_test_args} -o ${name}.xml,xml -o -,txt WORKING_DIRECTORY "${test_working_dir}") + endif() set_tests_properties("${name}" PROPERTIES RUN_SERIAL "${arg_RUN_SERIAL}" LABELS "${label}") # Get path to qtbase/bin, then prepend this path containing the shared libraries to PATH diff --git a/cmake/QtPlatformAndroid.cmake b/cmake/QtPlatformAndroid.cmake index 0a91e14591..4b5bf6ff13 100644 --- a/cmake/QtPlatformAndroid.cmake +++ b/cmake/QtPlatformAndroid.cmake @@ -332,7 +332,7 @@ function(qt_android_add_apk_target target) endif() set(deployment_tool "${QT_HOST_PATH}/bin/androiddeployqt") - set(apk_dir "$<TARGET_PROPERTY:${target},BINARY_DIR>/apk") + set(apk_dir "$<TARGET_PROPERTY:${target},BINARY_DIR>/android-build") add_custom_target(${target}_prepare_apk_dir DEPENDS ${target} COMMAND ${CMAKE_COMMAND} @@ -349,3 +349,30 @@ function(qt_android_add_apk_target target) COMMENT "Creating APK for ${target}" ) endfunction() + + +# Add a test for Android which will be run by the android test runner tool +function(qt_android_add_test target) + + set(deployment_tool "${QT_HOST_PATH}/bin/androiddeployqt") + set(test_runner "${QT_HOST_PATH}/bin/androidtestrunner") + + get_target_property(deployment_file ${target} QT_ANDROID_DEPLOYMENT_SETTINGS_FILE) + if (NOT deployment_file) + message(FATAL_ERROR "Target ${target} is not a valid android executable target\n") + endif() + + set(target_binary_dir "$<TARGET_PROPERTY:${target},BINARY_DIR>") + set(apk_dir "${target_binary_dir}/android-build") + + add_test(NAME "${target}" + COMMAND "${test_runner}" + --androiddeployqt "${deployment_tool} --input ${deployment_file}" + --adb "${ANDROID_SDK_ROOT}/platform-tools/adb" + --path "${apk_dir}" + --skip-install-root + --make "${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} --target ${target}_make_apk" + --apk "${apk_dir}/${target}.apk" + --verbose + ) +endfunction() |