Fixes regression in Qt's CMake translation API. Bug reported here: qt5_create_translation breaks projects with multiple same-named ts files https://bugreports.qt.io/browse/QTBUG-113152 Backport of upstream patch: https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=270868#c4 https://people.freebsd.org/~tcberner/patches/0001-Qt-Update-Qt5-to-5.15.9.patch.v2 diff -Nuar a/src/linguist/Qt5LinguistToolsMacros.cmake b/src/linguist/Qt5LinguistToolsMacros.cmake --- a/src/linguist/Qt5LinguistToolsMacros.cmake 2023-03-23 15:00:31.000000000 +0100 +++ b/src/linguist/Qt5LinguistToolsMacros.cmake 2023-05-19 23:42:31.618949027 +0000 @@ -68,6 +68,7 @@ if(NOT EXISTS "${stamp_file_dir}") file(MAKE_DIRECTORY "${stamp_file_dir}") endif() + set(stamp_files "") foreach(_ts_file ${_my_tsfiles}) get_filename_component(_ts_name ${_ts_file} NAME) if(_my_sources) @@ -95,7 +96,14 @@ file(WRITE ${_ts_lst_file} "${_lst_file_srcs}") endif() - set(stamp_file "${stamp_file_dir}/${_ts_name}.stamp") + file(RELATIVE_PATH _ts_relative_path ${CMAKE_CURRENT_SOURCE_DIR} ${_ts_file}) + string(REPLACE "../" "__/" _ts_relative_path "${_ts_relative_path}") + set(stamp_file "${stamp_file_dir}/${_ts_relative_path}.stamp") + list(APPEND stamp_files ${stamp_file}) + get_filename_component(full_stamp_file_dir "${stamp_file}" DIRECTORY) + if(NOT EXISTS "${full_stamp_file_dir}") + file(MAKE_DIRECTORY "${full_stamp_file_dir}") + endif() add_custom_command(OUTPUT ${stamp_file} COMMAND ${Qt5_LUPDATE_EXECUTABLE} ARGS ${_lupdate_options} "@${_ts_lst_file}" -ts ${_ts_file} @@ -103,7 +111,7 @@ DEPENDS ${_dependencies} VERBATIM) endforeach() - qt5_add_translation(${_qm_files} __QT_INTERNAL_DEPEND_ON_TIMESTAMP_FILE ${_my_tsfiles}) + qt5_add_translation(${_qm_files} ${_my_tsfiles} __QT_INTERNAL_TIMESTAMP_FILES ${stamp_files}) set(${_qm_files} ${${_qm_files}} PARENT_SCOPE) endfunction() @@ -120,17 +128,17 @@ function(QT5_ADD_TRANSLATION _qm_files) - set(options __QT_INTERNAL_DEPEND_ON_TIMESTAMP_FILE) + set(options) set(oneValueArgs) - set(multiValueArgs OPTIONS) + set(multiValueArgs OPTIONS __QT_INTERNAL_TIMESTAMP_FILES) cmake_parse_arguments(_LRELEASE "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) set(_lrelease_files ${_LRELEASE_UNPARSED_ARGUMENTS}) + set(idx 0) foreach(_current_FILE ${_lrelease_files}) get_filename_component(_abs_FILE ${_current_FILE} ABSOLUTE) get_filename_component(qm ${_abs_FILE} NAME) - set(ts_stamp_file "${CMAKE_CURRENT_BINARY_DIR}/.lupdate/${qm}.stamp") # everything before the last dot has to be considered the file name (including other dots) string(REGEX REPLACE "\\.[^.]*$" "" FILE_NAME ${qm}) get_source_file_property(output_location ${_abs_FILE} OUTPUT_LOCATION) @@ -141,7 +149,9 @@ set(qm "${CMAKE_CURRENT_BINARY_DIR}/${FILE_NAME}.qm") endif() - if(_LRELEASE___QT_INTERNAL_DEPEND_ON_TIMESTAMP_FILE) + if(_LRELEASE___QT_INTERNAL_TIMESTAMP_FILES) + list(GET _LRELEASE___QT_INTERNAL_TIMESTAMP_FILES ${idx} ts_stamp_file) + math(EXPR idx "${idx} + 1") set(qm_dep "${ts_stamp_file}") else() set(qm_dep "${_abs_FILE}")