summaryrefslogtreecommitdiffstats
path: root/cmake
diff options
context:
space:
mode:
authorAlexey Edelev <alexey.edelev@qt.io>2021-12-29 18:00:52 +0100
committerAlexey Edelev <alexey.edelev@qt.io>2022-02-10 18:09:43 +0100
commitaa2ee036e8948fc67b0095e032ab2a56c296fc62 (patch)
treee086d6090f72c2f2c36d6a3447c87c4610bdee68 /cmake
parente67c803fa9c1399ac819041ead77924aff24bbf2 (diff)
Use 'copy' but not 'copy_if_different' on Windows platforms
Use custom script to copy big Android artifacts on Windows platforms. The script uses 'copy' but not 'copy_if_different' when source file size is bigger than 2GB. 'cmake -E copy_if_different' only compares first 2GB of files because of cmake issue, so this step only workaround the problem. Task-number: QTBUG-99491 Change-Id: Id076734700e334dfc3330da412462c2b53829b33 Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io> Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> (cherry picked from commit 2201934efa1b9889d474347e705784bf6925e120)
Diffstat (limited to 'cmake')
-rw-r--r--cmake/QtBaseGlobalTargets.cmake2
-rw-r--r--cmake/QtConfig.cmake.in1
-rw-r--r--cmake/QtCopyFileIfDifferent.cmake15
-rw-r--r--cmake/QtPublicCMakeHelpers.cmake20
4 files changed, 38 insertions, 0 deletions
diff --git a/cmake/QtBaseGlobalTargets.cmake b/cmake/QtBaseGlobalTargets.cmake
index ee1d493821..d5e1313443 100644
--- a/cmake/QtBaseGlobalTargets.cmake
+++ b/cmake/QtBaseGlobalTargets.cmake
@@ -218,6 +218,7 @@ qt_copy_or_install(FILES
cmake/QtCompilerFlags.cmake
cmake/QtCompilerOptimization.cmake
cmake/QtConfigDependencies.cmake.in
+ cmake/QtCopyFileIfDifferent.cmake
cmake/QtDeferredDependenciesHelpers.cmake
cmake/QtDbusHelpers.cmake
cmake/QtDocsHelpers.cmake
@@ -299,6 +300,7 @@ qt_copy_or_install(DIRECTORY
set(__public_cmake_helpers
cmake/QtFeature.cmake
cmake/QtFeatureCommon.cmake
+ cmake/QtPublicCMakeHelpers.cmake
cmake/QtPublicCMakeVersionHelpers.cmake
cmake/QtPublicFinalizerHelpers.cmake
cmake/QtPublicPluginHelpers.cmake
diff --git a/cmake/QtConfig.cmake.in b/cmake/QtConfig.cmake.in
index 752655c21e..bea97da05c 100644
--- a/cmake/QtConfig.cmake.in
+++ b/cmake/QtConfig.cmake.in
@@ -91,6 +91,7 @@ include("${CMAKE_CURRENT_LIST_DIR}/QtPublicTargetHelpers.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/QtPublicWalkLibsHelpers.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/QtPublicFindPackageHelpers.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/QtPublicDependencyHelpers.cmake")
+include("${CMAKE_CURRENT_LIST_DIR}/QtPublicCMakeHelpers.cmake")
if(NOT DEFINED QT_CMAKE_EXPORT_NAMESPACE)
set(QT_CMAKE_EXPORT_NAMESPACE @QT_CMAKE_EXPORT_NAMESPACE@)
diff --git a/cmake/QtCopyFileIfDifferent.cmake b/cmake/QtCopyFileIfDifferent.cmake
new file mode 100644
index 0000000000..4c64895b53
--- /dev/null
+++ b/cmake/QtCopyFileIfDifferent.cmake
@@ -0,0 +1,15 @@
+# copy_if_different works incorrect in Windows if file size if bigger than 2GB.
+# See https://gitlab.kitware.com/cmake/cmake/-/issues/23052 and QTBUG-99491 for details.
+
+cmake_minimum_required(VERSION 3.16)
+
+set(copy_strategy "copy_if_different")
+if(CMAKE_HOST_WIN32)
+ file(SIZE "${SRC_FILE_PATH}" size)
+ # If file size is bigger than 2GB copy it unconditionally
+ if(size GREATER_EQUAL 2147483648)
+ set(copy_strategy "copy")
+ endif()
+endif()
+
+execute_process(COMMAND ${CMAKE_COMMAND} -E ${copy_strategy} "${SRC_FILE_PATH}" "${DST_FILE_PATH}")
diff --git a/cmake/QtPublicCMakeHelpers.cmake b/cmake/QtPublicCMakeHelpers.cmake
new file mode 100644
index 0000000000..86b8edacd4
--- /dev/null
+++ b/cmake/QtPublicCMakeHelpers.cmake
@@ -0,0 +1,20 @@
+# copy_if_different works incorrect in Windows if file size if bigger than 2GB.
+# See https://gitlab.kitware.com/cmake/cmake/-/issues/23052 and QTBUG-99491 for details.
+function(_qt_internal_copy_file_if_different_command out_var src_file dst_file)
+ # The CMake version higher than 3.23 doesn't contain the issue
+ if(CMAKE_HOST_WIN32 AND CMAKE_VERSION VERSION_LESS 3.23)
+ set(${out_var} "${CMAKE_COMMAND}"
+ "-DSRC_FILE_PATH=${src_file}"
+ "-DDST_FILE_PATH=${dst_file}"
+ -P "${_qt_6_config_cmake_dir}/QtCopyFileIfDifferent.cmake"
+ PARENT_SCOPE
+ )
+ else()
+ set(${out_var} "${CMAKE_COMMAND}"
+ -E copy_if_different
+ "${src_file}"
+ "${dst_file}"
+ PARENT_SCOPE
+ )
+ endif()
+endfunction()