CMake build: Make translation function available to external plugins

And fix that the "ts_all" target did not get the custom target prefix.

Change-Id: Iff6a5e328456f3d949c31f2e41b48c400fad773c
Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
This commit is contained in:
Eike Ziller
2020-04-29 15:08:17 +02:00
parent 8b16daf0ed
commit cc04c8d8e4
4 changed files with 174 additions and 162 deletions

View File

@@ -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.")

View File

@@ -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()

View File

@@ -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"

View File

@@ -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