diff options
-rw-r--r-- | src/corelib/Qt6AndroidMacros.cmake | 41 | ||||
-rw-r--r-- | src/tools/androidtestrunner/main.cpp | 37 |
2 files changed, 44 insertions, 34 deletions
diff --git a/src/corelib/Qt6AndroidMacros.cmake b/src/corelib/Qt6AndroidMacros.cmake index ab793d3499..ceb894e2e7 100644 --- a/src/corelib/Qt6AndroidMacros.cmake +++ b/src/corelib/Qt6AndroidMacros.cmake @@ -288,35 +288,48 @@ function(qt6_android_add_apk_target target) if(NOT QT_NO_GLOBAL_APK_TARGET) if(NOT TARGET apk) add_custom_target(apk - DEPENDS ${target}_prepare_apk_dir + DEPENDS ${target}_make_apk COMMENT "Building all apks" ) endif() - set(should_add_to_global_apk TRUE) endif() set(deployment_tool "${QT_HOST_PATH}/${QT6_HOST_INFO_BINDIR}/androiddeployqt") - set(apk_dir "$<TARGET_PROPERTY:${target},BINARY_DIR>/android-build") + set(apk_final_dir "$<TARGET_PROPERTY:${target},BINARY_DIR>/android-build") + set(apk_intermediate_dir "${CMAKE_CURRENT_BINARY_DIR}/android-build") + set(apk_file_name "${target}.apk") + set(apk_final_file_path "${apk_final_dir}/${apk_file_name}") + set(apk_intermediate_file_path "${apk_intermediate_dir}/${apk_file_name}") + + # This target is used by Qt Creator's Android support. add_custom_target(${target}_prepare_apk_dir DEPENDS ${target} COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:${target}> - "${apk_dir}/libs/${CMAKE_ANDROID_ARCH_ABI}/$<TARGET_FILE_NAME:${target}>" + "${apk_final_dir}/libs/${CMAKE_ANDROID_ARCH_ABI}/$<TARGET_FILE_NAME:${target}>" COMMENT "Copying ${target} binary to apk folder" ) - add_custom_target(${target}_make_apk - DEPENDS ${target}_prepare_apk_dir - COMMAND ${deployment_tool} - --input ${deployment_file} - --output ${apk_dir} - --apk ${apk_dir}/${target}.apk + # Add custom command that creates the apk in an intermediate location. + # We need the intermediate location, because we cannot have target-dependent generator + # expressions in OUTPUT. + add_custom_command(OUTPUT "${apk_intermediate_file_path}" + COMMAND ${CMAKE_COMMAND} + -E copy "$<TARGET_FILE:${target}>" + "${apk_intermediate_dir}/libs/${CMAKE_ANDROID_ARCH_ABI}/$<TARGET_FILE_NAME:${target}>" + COMMAND "${deployment_tool}" + --input "${deployment_file}" + --output "${apk_intermediate_dir}" + --apk "${apk_intermediate_file_path}" COMMENT "Creating APK for ${target}" - ) + DEPENDS "${target}" "${deployment_file}") - if(should_add_to_global_apk) - add_dependencies(apk "${target}_make_apk") - endif() + # Create a ${target}_make_apk target to copy the apk from the intermediate to its final + # location. If the final and intermediate locations are identical, this is a no-op. + add_custom_target(${target}_make_apk + COMMAND "${CMAKE_COMMAND}" + -E copy_if_different "${apk_intermediate_file_path}" "${apk_final_file_path}" + DEPENDS "${apk_intermediate_file_path}") endfunction() if(NOT QT_NO_CREATE_VERSIONLESS_FUNCTIONS) diff --git a/src/tools/androidtestrunner/main.cpp b/src/tools/androidtestrunner/main.cpp index b10b7d0bf3..37e58d5257 100644 --- a/src/tools/androidtestrunner/main.cpp +++ b/src/tools/androidtestrunner/main.cpp @@ -446,26 +446,23 @@ int main(int argc, char *argv[]) return 1; } - if (!QFile::exists(g_options.apkPath)) { - if (g_options.makeCommand.isEmpty()) { - fprintf(stderr, - "No apk found at \"%s\". Provide a make command with the \"--make\" parameter " - "to generate it first.\n", - qPrintable(g_options.apkPath)); - return 1; - } - if (!execCommand(g_options.makeCommand, nullptr, true)) { - if (!g_options.skipAddInstallRoot) { - // we need to run make INSTALL_ROOT=path install to install the application file(s) first - if (!execCommand(QStringLiteral("%1 INSTALL_ROOT=%2 install") - .arg(g_options.makeCommand, QDir::toNativeSeparators(g_options.buildPath)), nullptr, g_options.verbose)) { - return 1; - } - } else { - if (!execCommand(QStringLiteral("%1") - .arg(g_options.makeCommand), nullptr, g_options.verbose)) { - return 1; - } + if (g_options.makeCommand.isEmpty()) { + fprintf(stderr, + "It is required to provide a make command with the \"--make\" parameter " + "to generate the apk.\n"); + return 1; + } + if (!execCommand(g_options.makeCommand, nullptr, true)) { + if (!g_options.skipAddInstallRoot) { + // we need to run make INSTALL_ROOT=path install to install the application file(s) first + if (!execCommand(QStringLiteral("%1 INSTALL_ROOT=%2 install") + .arg(g_options.makeCommand, QDir::toNativeSeparators(g_options.buildPath)), nullptr, g_options.verbose)) { + return 1; + } + } else { + if (!execCommand(QStringLiteral("%1") + .arg(g_options.makeCommand), nullptr, g_options.verbose)) { + return 1; } } } |