From 501018ea3358b12f26bbe50e24e87a8ba88dae43 Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Tue, 6 Dec 2022 17:07:39 +0100 Subject: [PATCH] Win32: Add "longPathAware" manifest / rc for internal tools This will enable all qt internal tools to be able to access files on paths longer than 255 characters. Two examples that were not working before: moc and windeployqt. Fixes: QTBUG-109207 Change-Id: I93f9770f1d3c4f3f2cca4655e4bed89c95b9786b Reviewed-by: Alexandru Croitor --- cmake/QtToolHelpers.cmake | 4 +++ src/corelib/Qt6CoreMacros.cmake | 43 +++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/cmake/QtToolHelpers.cmake b/cmake/QtToolHelpers.cmake index 68d054f2828..f74a9d39bfa 100644 --- a/cmake/QtToolHelpers.cmake +++ b/cmake/QtToolHelpers.cmake @@ -115,6 +115,10 @@ function(qt_internal_add_tool target_name) _qt_internal_apply_strict_cpp("${target_name}") qt_internal_adjust_main_config_runtime_output_dir("${target_name}" "${output_dir}") + if (WIN32) + _qt_internal_generate_longpath_win32_rc_file_and_manifest("${target_name}") + endif() + set_target_properties(${target_name} PROPERTIES _qt_package_version "${PROJECT_VERSION}" ) diff --git a/src/corelib/Qt6CoreMacros.cmake b/src/corelib/Qt6CoreMacros.cmake index 081cb3bc708..1c71a9546fd 100644 --- a/src/corelib/Qt6CoreMacros.cmake +++ b/src/corelib/Qt6CoreMacros.cmake @@ -1413,6 +1413,49 @@ END endif() endfunction() +# Generate Win32 longPathAware RC and Manifest files for a target. +# MSVC needs the manifest file as part of target_sources. MinGW the RC file. +# +function(_qt_internal_generate_longpath_win32_rc_file_and_manifest target) + set(prohibited_target_types INTERFACE_LIBRARY STATIC_LIBRARY OBJECT_LIBRARY) + get_target_property(target_type ${target} TYPE) + if(target_type IN_LIST prohibited_target_types) + return() + endif() + + get_target_property(target_binary_dir ${target} BINARY_DIR) + + # Generate manifest + set(target_mn_filename "${target}_longpath.manifest") + set(mn_file_output "${target_binary_dir}/${target_mn_filename}") + + set(mn_contents [=[ + + + + true + + +]=]) + file(GENERATE OUTPUT "${mn_file_output}" CONTENT "${mn_contents}") + + # Generate RC File + set(rc_file_output "${target_binary_dir}/${target}_longpath.rc") + set(rc_contents "1 /* CREATEPROCESS_MANIFEST_RESOURCE_ID */ 24 /* RT_MANIFEST */ ${target_mn_filename}") + file(GENERATE OUTPUT "${rc_file_output}" CONTENT "${rc_contents}") + + if (MINGW) + set(outputs "${rc_file_output}") + endif() + list(APPEND outputs "${mn_file_output}") + + foreach(output IN LISTS outputs) + # Needed for CMake versions < 3.19 + set_source_files_properties(${output} PROPERTIES GENERATED TRUE) + target_sources(${target} PRIVATE "${output}") + endforeach() +endfunction() + function(__qt_get_relative_resource_path_for_file output_alias file) get_property(alias SOURCE ${file} PROPERTY QT_RESOURCE_ALIAS) if (NOT alias)