| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259 |
- # Distributed under the OSI-approved BSD 3-Clause License. See accompanying
- # file Copyright.txt or https://cmake.org/licensing for details.
- #[=======================================================================[.rst:
- FindGettext
- -----------
- Find GNU gettext tools.
- This module looks for the GNU gettext tools.
- Result Variables
- ^^^^^^^^^^^^^^^^
- This module defines the following variables:
- ``GETTEXT_FOUND``
- True if gettext has been found.
- ``GETTEXT_VERSION_STRING``
- The version of gettext found.
- ``GETTEXT_MSGMERGE_EXECUTABLE``
- The full path to the msgmerge tool.
- ``GETTEXT_MSGFMT_EXECUTABLE``
- The full path to the msgfmt tool.
- Functions
- ^^^^^^^^^
- This module provides several function.
- .. command:: gettext_create_translations
- .. code-block:: cmake
- gettext_create_translations(<potfile> [ALL] <file>...)
- This function creates a custom target "translations" which processes the
- given .pot file to .mo files. The generated binary files will be installed
- into ``share/locale/`` directory. Options:
- ``ALL``
- The translations will be created when building the default target.
- .. command:: gettext_process_pot_file
- .. code-block:: cmake
- gettext_process_pot_file(<potfile> [ALL]
- [INSTALL_DESTINATION <destdir>]
- LANGUAGES <lang>...)
- This function creates a custom target "potfile" which processes the given
- .pot file to .mo files. Options:
- ``ALL``
- The .pot file will be processed when building the default target.
- ``INSTALL_DESTINATION``
- Install the results into the given directory (``share/locale/`` by
- default). The language subdirectory will be taken into account.
- .. command:: gettext_process_po_files
- .. code-block:: cmake
- gettext_process_po_files(<lang> [ALL]
- [INSTALL_DESTINATION <dir>]
- PO_FILES <pofile>...)
- This function creates a custom target "pofiles", which processes the given
- .po files to .mo files for the given language. Options:
- ``ALL``
- The .po files will be processed when building the default target.
- ``INSTALL_DESTINATION``
- Install the results into the given directory (``share/locale/`` by
- default). The language subdirectory will be taken into account .
- .. versionadded:: 3.2
- If you wish to use the Gettext runtime library (libintl), use
- :module:`FindIntl`.
- #]=======================================================================]
- find_program(GETTEXT_MSGMERGE_EXECUTABLE msgmerge)
- find_program(GETTEXT_MSGFMT_EXECUTABLE msgfmt)
- if(GETTEXT_MSGMERGE_EXECUTABLE)
- execute_process(COMMAND ${GETTEXT_MSGMERGE_EXECUTABLE} --version
- OUTPUT_VARIABLE gettext_version
- ERROR_QUIET
- OUTPUT_STRIP_TRAILING_WHITESPACE)
- get_filename_component(msgmerge_name ${GETTEXT_MSGMERGE_EXECUTABLE} NAME)
- get_filename_component(msgmerge_namewe ${GETTEXT_MSGMERGE_EXECUTABLE} NAME_WE)
- if (gettext_version MATCHES "^(${msgmerge_name}|${msgmerge_namewe}) \\([^\\)]*\\) ([0-9\\.]+[^ \n]*)")
- set(GETTEXT_VERSION_STRING "${CMAKE_MATCH_2}")
- endif()
- unset(gettext_version)
- unset(msgmerge_name)
- unset(msgmerge_namewe)
- endif()
- include(FindPackageHandleStandardArgs)
- find_package_handle_standard_args(Gettext
- REQUIRED_VARS GETTEXT_MSGMERGE_EXECUTABLE GETTEXT_MSGFMT_EXECUTABLE
- VERSION_VAR GETTEXT_VERSION_STRING)
- function(_GETTEXT_GET_UNIQUE_TARGET_NAME _name _unique_name)
- set(propertyName "_GETTEXT_UNIQUE_COUNTER_${_name}")
- get_property(currentCounter GLOBAL PROPERTY "${propertyName}")
- if(NOT currentCounter)
- set(currentCounter 1)
- endif()
- set(${_unique_name} "${_name}_${currentCounter}" PARENT_SCOPE)
- math(EXPR currentCounter "${currentCounter} + 1")
- set_property(GLOBAL PROPERTY ${propertyName} ${currentCounter} )
- endfunction()
- macro(GETTEXT_CREATE_TRANSLATIONS _potFile _firstPoFileArg)
- # make it a real variable, so we can modify it here
- set(_firstPoFile "${_firstPoFileArg}")
- set(_gmoFiles)
- get_filename_component(_potName ${_potFile} NAME)
- string(REGEX REPLACE "^(.+)(\\.[^.]+)$" "\\1" _potBasename ${_potName})
- get_filename_component(_absPotFile ${_potFile} ABSOLUTE)
- set(_addToAll)
- if(${_firstPoFile} STREQUAL "ALL")
- set(_addToAll "ALL")
- set(_firstPoFile)
- endif()
- foreach (_currentPoFile ${_firstPoFile} ${ARGN})
- get_filename_component(_absFile ${_currentPoFile} ABSOLUTE)
- get_filename_component(_abs_PATH ${_absFile} PATH)
- get_filename_component(_lang ${_absFile} NAME_WE)
- set(_gmoFile ${CMAKE_CURRENT_BINARY_DIR}/${_lang}.gmo)
- add_custom_command(
- OUTPUT ${_gmoFile}
- COMMAND ${GETTEXT_MSGMERGE_EXECUTABLE} --quiet --update --backup=none -s ${_absFile} ${_absPotFile}
- COMMAND ${GETTEXT_MSGFMT_EXECUTABLE} -o ${_gmoFile} ${_absFile}
- DEPENDS ${_absPotFile} ${_absFile}
- )
- install(FILES ${_gmoFile} DESTINATION share/locale/${_lang}/LC_MESSAGES RENAME ${_potBasename}.mo)
- set(_gmoFiles ${_gmoFiles} ${_gmoFile})
- endforeach ()
- if(NOT TARGET translations)
- add_custom_target(translations)
- endif()
- _GETTEXT_GET_UNIQUE_TARGET_NAME(translations uniqueTargetName)
- add_custom_target(${uniqueTargetName} ${_addToAll} DEPENDS ${_gmoFiles})
- add_dependencies(translations ${uniqueTargetName})
- endmacro()
- function(GETTEXT_PROCESS_POT_FILE _potFile)
- set(_gmoFiles)
- set(_options ALL)
- set(_oneValueArgs INSTALL_DESTINATION)
- set(_multiValueArgs LANGUAGES)
- cmake_parse_arguments(_parsedArguments "${_options}" "${_oneValueArgs}" "${_multiValueArgs}" ${ARGN})
- get_filename_component(_potName ${_potFile} NAME)
- string(REGEX REPLACE "^(.+)(\\.[^.]+)$" "\\1" _potBasename ${_potName})
- get_filename_component(_absPotFile ${_potFile} ABSOLUTE)
- foreach (_lang ${_parsedArguments_LANGUAGES})
- set(_poFile "${CMAKE_CURRENT_BINARY_DIR}/${_lang}.po")
- set(_gmoFile "${CMAKE_CURRENT_BINARY_DIR}/${_lang}.gmo")
- add_custom_command(
- OUTPUT "${_poFile}"
- COMMAND ${GETTEXT_MSGMERGE_EXECUTABLE} --quiet --update --backup=none -s ${_poFile} ${_absPotFile}
- DEPENDS ${_absPotFile}
- )
- add_custom_command(
- OUTPUT "${_gmoFile}"
- COMMAND ${GETTEXT_MSGFMT_EXECUTABLE} -o ${_gmoFile} ${_poFile}
- DEPENDS ${_absPotFile} ${_poFile}
- )
- if(_parsedArguments_INSTALL_DESTINATION)
- install(FILES ${_gmoFile} DESTINATION ${_parsedArguments_INSTALL_DESTINATION}/${_lang}/LC_MESSAGES RENAME ${_potBasename}.mo)
- endif()
- list(APPEND _gmoFiles ${_gmoFile})
- endforeach ()
- if(NOT TARGET potfiles)
- add_custom_target(potfiles)
- endif()
- _GETTEXT_GET_UNIQUE_TARGET_NAME( potfiles uniqueTargetName)
- if(_parsedArguments_ALL)
- add_custom_target(${uniqueTargetName} ALL DEPENDS ${_gmoFiles})
- else()
- add_custom_target(${uniqueTargetName} DEPENDS ${_gmoFiles})
- endif()
- add_dependencies(potfiles ${uniqueTargetName})
- endfunction()
- function(GETTEXT_PROCESS_PO_FILES _lang)
- set(_options ALL)
- set(_oneValueArgs INSTALL_DESTINATION)
- set(_multiValueArgs PO_FILES)
- set(_gmoFiles)
- cmake_parse_arguments(_parsedArguments "${_options}" "${_oneValueArgs}" "${_multiValueArgs}" ${ARGN})
- foreach(_current_PO_FILE ${_parsedArguments_PO_FILES})
- get_filename_component(_name ${_current_PO_FILE} NAME)
- string(REGEX REPLACE "^(.+)(\\.[^.]+)$" "\\1" _basename ${_name})
- set(_gmoFile ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.gmo)
- add_custom_command(OUTPUT ${_gmoFile}
- COMMAND ${GETTEXT_MSGFMT_EXECUTABLE} -o ${_gmoFile} ${_current_PO_FILE}
- WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
- DEPENDS ${_current_PO_FILE}
- )
- if(_parsedArguments_INSTALL_DESTINATION)
- install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.gmo DESTINATION ${_parsedArguments_INSTALL_DESTINATION}/${_lang}/LC_MESSAGES/ RENAME ${_basename}.mo)
- endif()
- list(APPEND _gmoFiles ${_gmoFile})
- endforeach()
- if(NOT TARGET pofiles)
- add_custom_target(pofiles)
- endif()
- _GETTEXT_GET_UNIQUE_TARGET_NAME( pofiles uniqueTargetName)
- if(_parsedArguments_ALL)
- add_custom_target(${uniqueTargetName} ALL DEPENDS ${_gmoFiles})
- else()
- add_custom_target(${uniqueTargetName} DEPENDS ${_gmoFiles})
- endif()
- add_dependencies(pofiles ${uniqueTargetName})
- endfunction()
|