diff --git a/CMakeLists.txt b/CMakeLists.txt index 9cf66c74aa7..926cd34165c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,6 +5,7 @@ list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") include(FeatureSummary) include(QtCreatorIDEBranding) +include(QtCreatorTranslations) set(IDE_REVISION FALSE CACHE BOOL "Marks the presence of IDE revision string.") set(IDE_REVISION_STR "" CACHE STRING "The IDE revision string.") diff --git a/cmake/QtCreatorTranslations.cmake b/cmake/QtCreatorTranslations.cmake new file mode 100644 index 00000000000..dd0dae68758 --- /dev/null +++ b/cmake/QtCreatorTranslations.cmake @@ -0,0 +1,167 @@ +# Defines function add_translation_targets + +function(_extract_ts_data_from_targets outprefix) + set(_sources "") + set(_includes "") + + set(_targets "${ARGN}") + list(REMOVE_DUPLICATES _targets) + + foreach(t IN ITEMS ${_targets}) + if (TARGET "${t}") + get_target_property(_skip_translation "${t}" QT_SKIP_TRANSLATION) + get_target_property(_source_dir "${t}" SOURCE_DIR) + get_target_property(_interface_include_dirs "${t}" INTERFACE_INCLUDE_DIRECTORIES) + get_target_property(_include_dirs "${t}" INCLUDE_DIRECTORIES) + get_target_property(_source_files "${t}" SOURCES) + get_target_property(_extra_translations "${t}" QT_EXTRA_TRANSLATIONS) + + if (NOT _skip_translation) + if(_include_dirs) + list(APPEND _includes ${_include_dirs}) + endif() + + if(_interface_include_dirs) + list(APPEND _interface_includes ${_include_dirs}) + endif() + + set(_target_sources "") + if(_source_files) + list(APPEND _target_sources ${_source_files}) + endif() + if(_extra_translations) + list(APPEND _target_sources ${_extra_translations}) + endif() + foreach(s IN ITEMS ${_target_sources}) + get_filename_component(_abs_source "${s}" ABSOLUTE BASE_DIR "${_source_dir}") + list(APPEND _sources "${_abs_source}") + endforeach() + endif() + endif() + endforeach() + + set("${outprefix}_sources" "${_sources}" PARENT_SCOPE) + set("${outprefix}_includes" "${_includes}" PARENT_SCOPE) +endfunction() + +function(_create_ts_custom_target name) + cmake_parse_arguments(_arg "" "FILE_PREFIX;TS_TARGET_PREFIX" "LANGUAGES;SOURCES;INCLUDES" ${ARGN}) + if (_arg_UNPARSED_ARGUMENTS) + message(FATAL_ERROR "Invalid parameters to _create_ts_custom_target: ${_arg_UNPARSED_ARGUMENTS}.") + endif() + + if (NOT _arg_TS_TARGET_PREFIX) + set(_arg_TS_TARGET_PREFIX "ts_") + endif() + + set(ts_languages ${_arg_LANGUAGES}) + if (NOT ts_languages) + set(ts_languages "${name}") + endif() + + foreach(l IN ITEMS ${ts_languages}) + list(APPEND ts_files "${CMAKE_CURRENT_SOURCE_DIR}/${_arg_FILE_PREFIX}_${l}.ts") + endforeach() + + set(_sources "${_arg_SOURCES}") + list(SORT _sources) + + set(_includes "${_arg_INCLUDES}") + + list(REMOVE_DUPLICATES _sources) + list(REMOVE_DUPLICATES _includes) + + list(REMOVE_ITEM _sources "") + list(REMOVE_ITEM _includes "") + + set(_prepended_includes) + foreach(include IN LISTS _includes) + list(APPEND _prepended_includes "-I${include}") + endforeach() + set(_includes "${_prepended_includes}") + + string(REPLACE ";" "\n" _sources_str "${_sources}") + string(REPLACE ";" "\n" _includes_str "${_includes}") + + set(ts_file_list "${CMAKE_CURRENT_BINARY_DIR}/ts_${name}.lst") + file(WRITE "${ts_file_list}" "${_sources_str}\n${_includes_str}\n") + + add_custom_target("${_arg_TS_TARGET_PREFIX}${name}" + COMMAND Qt5::lupdate -locations relative -no-ui-lines -no-sort "@${ts_file_list}" -ts ${ts_files} + WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" + COMMENT "Generate .ts files" + DEPENDS ${_sources} + VERBATIM) +endfunction() + +function(add_translation_targets file_prefix) + if (NOT TARGET Qt5::lrelease) + # No Qt translation tools were found: Skip this directory + message(WARNING "No Qt translation tools found, skipping translation targets. Add find_package(Qt5 COMPONENTS LinguistTools) to CMake to enable.") + return() + endif() + + cmake_parse_arguments(_arg "" + "OUTPUT_DIRECTORY;INSTALL_DESTINATION;TS_TARGET_PREFIX;QM_TARGET_PREFIX;ALL_QM_TARGET" + "LANGUAGES;TARGETS;SOURCES;INCLUDES" ${ARGN}) + if (_arg_UNPARSED_ARGUMENTS) + message(FATAL_ERROR "Invalid parameters to add_translation_targets: ${_arg_UNPARSED_ARGUMENTS}.") + endif() + + if (NOT _arg_TS_TARGET_PREFIX) + set(_arg_TS_TARGET_PREFIX "ts_") + endif() + + if (NOT _arg_QM_TARGET_PREFIX) + set(_arg_QM_TARGET_PREFIX "generate_qm_file_") + endif() + + if (NOT _arg_ALL_QM_TARGET) + set(_arg_ALL_QM_TARGET "generate_qm_files") + endif() + + if (NOT _arg_OUTPUT_DIRECTORY) + set(_arg_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}") + endif() + + if (NOT _arg_INSTALL_DESTINATION) + message(FATAL_ERROR "Please provide a INSTALL_DESTINATION to add_translation_targets") + endif() + + _extract_ts_data_from_targets(_to_process "${_arg_TARGETS}") + + _create_ts_custom_target(untranslated + FILE_PREFIX "${file_prefix}" TS_TARGET_PREFIX "${_arg_TS_TARGET_PREFIX}" + SOURCES ${_to_process_sources} ${_arg_SOURCES} INCLUDES ${_to_process_includes} ${_arg_INCLUDES}) + + if (NOT TARGET "${_arg_ALL_QM_TARGET}") + add_custom_target("${_arg_ALL_QM_TARGET}" ALL COMMENT "Generate .qm-files") + endif() + + foreach(l IN ITEMS ${_arg_LANGUAGES}) + set(_ts_file "${CMAKE_CURRENT_SOURCE_DIR}/${file_prefix}_${l}.ts") + set(_qm_file "${_arg_OUTPUT_DIRECTORY}/${file_prefix}_${l}.qm") + + _create_ts_custom_target("${l}" FILE_PREFIX "${file_prefix}" TS_TARGET_PREFIX "${_arg_TS_TARGET_PREFIX}" + SOURCES ${_to_process_sources} ${_arg_SOURCES} INCLUDES ${_to_process_includes} ${_arg_INCLUDES}) + + add_custom_command(OUTPUT "${_qm_file}" + COMMAND Qt5::lrelease "${_ts_file}" -qm "${_qm_file}" + MAIN_DEPENDENCY "${_ts_file}" + WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" + COMMENT "Generate .qm file" + VERBATIM) + add_custom_target("${_arg_QM_TARGET_PREFIX}${l}" DEPENDS "${_qm_file}") + install(FILES "${_qm_file}" DESTINATION ${_arg_INSTALL_DESTINATION}) + + add_dependencies("${_arg_ALL_QM_TARGET}" "${_arg_QM_TARGET_PREFIX}${l}") + endforeach() + + _create_ts_custom_target(all + LANGUAGES ${_arg_LANGUAGES} + TS_TARGET_PREFIX "${_arg_TS_TARGET_PREFIX}" + FILE_PREFIX "${file_prefix}" + SOURCES ${_to_process_sources} ${_arg_SOURCES} + INCLUDES ${_to_process_includes} ${_arg_INCLUDES} + ) +endfunction() diff --git a/share/qtcreator/translations/CMakeLists.txt b/share/qtcreator/translations/CMakeLists.txt index 7b4d29bd77c..d8ade110bc1 100644 --- a/share/qtcreator/translations/CMakeLists.txt +++ b/share/qtcreator/translations/CMakeLists.txt @@ -44,168 +44,6 @@ else() VERBATIM) endif() -function(_extract_ts_data_from_targets outprefix) - set(_sources "") - set(_includes "") - - set(_targets "${ARGN}") - list(REMOVE_DUPLICATES _targets) - - foreach(t IN ITEMS ${_targets}) - if (TARGET "${t}") - get_target_property(_skip_translation "${t}" QT_SKIP_TRANSLATION) - get_target_property(_source_dir "${t}" SOURCE_DIR) - get_target_property(_interface_include_dirs "${t}" INTERFACE_INCLUDE_DIRECTORIES) - get_target_property(_include_dirs "${t}" INCLUDE_DIRECTORIES) - get_target_property(_source_files "${t}" SOURCES) - get_target_property(_extra_translations "${t}" QT_EXTRA_TRANSLATIONS) - - if (NOT _skip_translation) - if(_include_dirs) - list(APPEND _includes ${_include_dirs}) - endif() - - if(_interface_include_dirs) - list(APPEND _interface_includes ${_include_dirs}) - endif() - - set(_target_sources "") - if(_source_files) - list(APPEND _target_sources ${_source_files}) - endif() - if(_extra_translations) - list(APPEND _target_sources ${_extra_translations}) - endif() - foreach(s IN ITEMS ${_target_sources}) - get_filename_component(_abs_source "${s}" ABSOLUTE BASE_DIR "${_source_dir}") - list(APPEND _sources "${_abs_source}") - endforeach() - endif() - endif() - endforeach() - - set("${outprefix}_sources" "${_sources}" PARENT_SCOPE) - set("${outprefix}_includes" "${_includes}" PARENT_SCOPE) -endfunction() - -function(_create_ts_custom_target name) - cmake_parse_arguments(_arg "" "FILE_PREFIX;TS_TARGET_PREFIX" "LANGUAGES;SOURCES;INCLUDES" ${ARGN}) - if (_arg_UNPARSED_ARGUMENTS) - message(FATAL_ERROR "Invalid parameters to _create_ts_custom_target: ${_arg_UNPARSED_ARGUMENTS}.") - endif() - - if (NOT _arg_TS_TARGET_PREFIX) - set(_arg_TS_TARGET_PREFIX "ts_") - endif() - - set(ts_languages ${_arg_LANGUAGES}) - if (NOT ts_languages) - set(ts_languages "${name}") - endif() - - foreach(l IN ITEMS ${ts_languages}) - list(APPEND ts_files "${CMAKE_CURRENT_SOURCE_DIR}/${_arg_FILE_PREFIX}_${l}.ts") - endforeach() - - set(_sources "${_arg_SOURCES}") - list(SORT _sources) - - set(_includes "${_arg_INCLUDES}") - - list(REMOVE_DUPLICATES _sources) - list(REMOVE_DUPLICATES _includes) - - list(REMOVE_ITEM _sources "") - list(REMOVE_ITEM _includes "") - - set(_prepended_includes) - foreach(include IN LISTS _includes) - list(APPEND _prepended_includes "-I${include}") - endforeach() - set(_includes "${_prepended_includes}") - - string(REPLACE ";" "\n" _sources_str "${_sources}") - string(REPLACE ";" "\n" _includes_str "${_includes}") - - set(ts_file_list "${CMAKE_CURRENT_BINARY_DIR}/ts_${name}.lst") - file(WRITE "${ts_file_list}" "${_sources_str}\n${_includes_str}\n") - - add_custom_target("${_arg_TS_TARGET_PREFIX}${name}" - COMMAND Qt5::lupdate -locations relative -no-ui-lines -no-sort "@${ts_file_list}" -ts ${ts_files} - WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" - COMMENT "Generate .ts files" - DEPENDS ${_sources} - VERBATIM) -endfunction() - -function(add_translation_targets file_prefix) - if (NOT TARGET Qt5::lrelease) - # No Qt translation tools were found: Skip this directory - message(WARNING "No Qt translation tools found, skipping translation targets. Add find_package(Qt5 COMPONENTS LinguistTools) to CMake to enable.") - return() - endif() - - cmake_parse_arguments(_arg "" - "OUTPUT_DIRECTORY;INSTALL_DESTINATION;TS_TARGET_PREFIX;QM_TARGET_PREFIX;ALL_QM_TARGET" - "LANGUAGES;TARGETS;SOURCES;INCLUDES" ${ARGN}) - if (_arg_UNPARSED_ARGUMENTS) - message(FATAL_ERROR "Invalid parameters to add_translation_targets: ${_arg_UNPARSED_ARGUMENTS}.") - endif() - - if (NOT _arg_TS_TARGET_PREFIX) - set(_arg_TS_TARGET_PREFIX "ts_") - endif() - - if (NOT _arg_QM_TARGET_PREFIX) - set(_arg_QM_TARGET_PREFIX "generate_qm_file_") - endif() - - if (NOT _arg_ALL_QM_TARGET) - set(_arg_ALL_QM_TARGET "generate_qm_files") - endif() - - if (NOT _arg_OUTPUT_DIRECTORY) - set(_arg_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}") - endif() - - if (NOT _arg_INSTALL_DESTINATION) - message(FATAL_ERROR "Please provide a INSTALL_DESTINATION to add_translation_targets") - endif() - - _extract_ts_data_from_targets(_to_process "${_arg_TARGETS}") - - _create_ts_custom_target(untranslated - FILE_PREFIX "${file_prefix}" TS_TARGET_PREFIX "${_arg_TS_TARGET_PREFIX}" - SOURCES ${_to_process_sources} ${_arg_SOURCES} INCLUDES ${_to_process_includes} ${_arg_INCLUDES}) - - if (NOT TARGET "${_arg_ALL_QM_TARGET}") - add_custom_target("${_arg_ALL_QM_TARGET}" ALL COMMENT "Generate .qm-files") - endif() - - foreach(l IN ITEMS ${_arg_LANGUAGES}) - set(_ts_file "${CMAKE_CURRENT_SOURCE_DIR}/${file_prefix}_${l}.ts") - set(_qm_file "${_arg_OUTPUT_DIRECTORY}/${file_prefix}_${l}.qm") - - _create_ts_custom_target("${l}" FILE_PREFIX "${file_prefix}" TS_TARGET_PREFIX "${_arg_TS_TARGET_PREFIX}" - SOURCES ${_to_process_sources} ${_arg_SOURCES} INCLUDES ${_to_process_includes} ${_arg_INCLUDES}) - - add_custom_command(OUTPUT "${_qm_file}" - COMMAND Qt5::lrelease "${_ts_file}" -qm "${_qm_file}" - MAIN_DEPENDENCY "${_ts_file}" - WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" - COMMENT "Generate .qm file" - VERBATIM) - add_custom_target("${_arg_QM_TARGET_PREFIX}${l}" DEPENDS "${_qm_file}") - install(FILES "${_qm_file}" DESTINATION ${_arg_INSTALL_DESTINATION}) - - add_dependencies("${_arg_ALL_QM_TARGET}" "${_arg_QM_TARGET_PREFIX}${l}") - endforeach() - - _create_ts_custom_target(all LANGUAGES ${_arg_LANGUAGES} FILE_PREFIX "${file_prefix}" - SOURCES ${_to_process_sources} ${_arg_SOURCES} INCLUDES ${_to_process_includes} ${_arg_INCLUDES}) -endfunction() - -### collect targets to include in documentation: add_translation_targets(qtcreator LANGUAGES ${languages} OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/${IDE_DATA_PATH}/translations" diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index a04ed8a959b..25276f1de1e 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -49,6 +49,10 @@ if (NOT DEFINED add_qtc_plugin) include(\${CMAKE_CURRENT_LIST_DIR}/QtCreatorAPI.cmake) endif() +if (NOT DEFINED add_translation_targets) + include(\${CMAKE_CURRENT_LIST_DIR}/QtCreatorTranslations.cmake) +endif() + if (NOT TARGET QtCreator::Core) include(\${CMAKE_CURRENT_LIST_DIR}/QtCreatorTargets.cmake) endif() @@ -61,6 +65,7 @@ export(EXPORT QtCreator file(COPY ${PROJECT_SOURCE_DIR}/cmake/QtCreatorIDEBranding.cmake + ${PROJECT_SOURCE_DIR}/cmake/QtCreatorTranslations.cmake ${PROJECT_SOURCE_DIR}/cmake/QtCreatorAPI.cmake DESTINATION ${CMAKE_BINARY_DIR}/cmake ) @@ -69,6 +74,7 @@ file(COPY install( FILES ${PROJECT_SOURCE_DIR}/cmake/QtCreatorIDEBranding.cmake + ${PROJECT_SOURCE_DIR}/cmake/QtCreatorTranslations.cmake ${PROJECT_SOURCE_DIR}/cmake/QtCreatorAPI.cmake ${CMAKE_BINARY_DIR}/cmake/QtCreatorConfig.cmake DESTINATION lib/cmake/QtCreator