|  | # Distributed under the OSI-approved BSD 3-Clause License.  See accompanying | 
|  | # file LICENSE.rst or https://cmake.org/licensing for details. | 
|  |  | 
|  | #[=======================================================================[.rst: | 
|  | FindGettext | 
|  | ----------- | 
|  |  | 
|  | Finds the GNU gettext tools and provides commands for producing multi-lingual | 
|  | messages: | 
|  |  | 
|  | .. code-block:: cmake | 
|  |  | 
|  | find_package(Gettext [<version>] ...) | 
|  |  | 
|  | GNU gettext is a system for internationalization (i18n) and localization | 
|  | (l10n), consisting of command-line tools and a runtime library (``libintl``). | 
|  | This module finds the gettext tools (such as ``msgmerge`` and ``msgfmt``), | 
|  | while the runtime library can be found using the separate :module:`FindIntl` | 
|  | module, which abstracts ``libintl`` handling across various implementations. | 
|  |  | 
|  | Common file types used with gettext: | 
|  |  | 
|  | POT files | 
|  | Portable Object Template (``.pot``) files used as the source template for | 
|  | translations. | 
|  |  | 
|  | PO files | 
|  | Portable Object (``.po``) files containing human-readable translations. | 
|  |  | 
|  | MO files | 
|  | Machine Object (``.mo``) files compiled from ``.po`` files for runtime use. | 
|  |  | 
|  | Result Variables | 
|  | ^^^^^^^^^^^^^^^^ | 
|  |  | 
|  | This module defines the following variables: | 
|  |  | 
|  | ``Gettext_FOUND`` | 
|  | Boolean indicating whether (the requested version of) gettext is found.  For | 
|  | backward compatibility, the ``GETTEXT_FOUND`` variable is also set to the same | 
|  | value. | 
|  |  | 
|  | ``GETTEXT_VERSION_STRING`` | 
|  | The version of gettext found. | 
|  |  | 
|  | Cache Variables | 
|  | ^^^^^^^^^^^^^^^ | 
|  |  | 
|  | The following cache variables may also be set: | 
|  |  | 
|  | ``GETTEXT_MSGMERGE_EXECUTABLE`` | 
|  | The full path to the ``msgmerge`` tool for merging message catalog and | 
|  | template. | 
|  |  | 
|  | ``GETTEXT_MSGFMT_EXECUTABLE`` | 
|  | The full path to the ``msgfmt`` tool for compiling message catalog to a binary | 
|  | format. | 
|  |  | 
|  | Commands | 
|  | ^^^^^^^^ | 
|  |  | 
|  | This module provides the following commands to work with gettext in CMake, if | 
|  | gettext is found: | 
|  |  | 
|  | .. command:: gettext_process_po_files | 
|  |  | 
|  | Creates a build rule that processes one or more ``.po`` translation files | 
|  | into binary ``.mo`` files for a specified translatable language locale: | 
|  |  | 
|  | .. code-block:: cmake | 
|  |  | 
|  | gettext_process_po_files( | 
|  | <language> | 
|  | [ALL] | 
|  | [INSTALL_DESTINATION <destdir>] | 
|  | PO_FILES <po-files>... | 
|  | ) | 
|  |  | 
|  | This command defines a custom target that compiles the given ``<po-files>`` | 
|  | into ``.mo`` files for the specified ``<language>``.  On first invocation, | 
|  | it also creates a global custom target named ``pofiles``, to which all | 
|  | subsequent invocations contribute.  This target can be used to build all | 
|  | translation files collectively or referenced in other CMake commands. | 
|  |  | 
|  | This command should be invoked separately for each language locale to | 
|  | generate the appropriate ``.mo`` files per locale. | 
|  |  | 
|  | The arguments are: | 
|  |  | 
|  | ``<language>`` | 
|  | The target translatable language locale of the PO files. | 
|  |  | 
|  | This string is typically formatted as a locale identifier (e.g., ``de_DE`` | 
|  | for German as used in Germany, or ``de_AT`` for German as used in Austria, | 
|  | etc.).  The part before the underscore specifies the language, and the | 
|  | part after specifies the country or regional variant.  In some cases, a | 
|  | shorter form using only the language code (e.g., ``de``) may also be used. | 
|  |  | 
|  | ``ALL`` | 
|  | This option adds the generated target to the default CMake build target so | 
|  | that translations are built by default. | 
|  |  | 
|  | ``INSTALL_DESTINATION <destdir>`` | 
|  | Specifies the installation directory for the generated ``.mo`` files at | 
|  | the install phase.  If specified, files are installed to: | 
|  | ``<destdir>/<language>/LC_MESSAGES/*.mo``.  If not specified, files are | 
|  | not installed. | 
|  |  | 
|  | ``PO_FILES <po-files>...`` | 
|  | A list of one or more ``.po`` translation files to be compiled into | 
|  | ``.mo`` files at build phase for the specified ``<language>``.  Relative | 
|  | paths will be interpreted relative to the current source directory | 
|  | (:variable:`CMAKE_CURRENT_SOURCE_DIR`). | 
|  |  | 
|  | .. command:: gettext_process_pot_file | 
|  |  | 
|  | Creates a build rule that processes a gettext Portable Object Template | 
|  | (``.pot``) file and associated ``.po`` files into compiled gettext Machine | 
|  | Object (``.mo``) files: | 
|  |  | 
|  | .. code-block:: cmake | 
|  |  | 
|  | gettext_process_pot_file( | 
|  | <pot-file> | 
|  | [ALL] | 
|  | [INSTALL_DESTINATION <destdir>] | 
|  | LANGUAGES <languages>... | 
|  | ) | 
|  |  | 
|  | This command defines a custom target named ``potfiles`` that compiles the | 
|  | given ``<pot-file>`` and language-specific ``.po`` files into binary ``.mo`` | 
|  | files for each specified language.  The corresponding ``<language>.po`` | 
|  | files must exist in the current binary directory | 
|  | (:variable:`CMAKE_CURRENT_BINARY_DIR`) before this command is invoked. | 
|  |  | 
|  | The arguments are: | 
|  |  | 
|  | ``<pot-file>`` | 
|  | The path to the gettext Portable Object Template file (``.pot``) serving | 
|  | as the source for translations.  If given as a relative path, it will be | 
|  | interpreted relative to the current source directory | 
|  | (:variable:`CMAKE_CURRENT_SOURCE_DIR`). | 
|  |  | 
|  | ``ALL`` | 
|  | Adds the generated target to the default CMake build target so that the | 
|  | files are built by default. | 
|  |  | 
|  | ``INSTALL_DESTINATION <destdir>`` | 
|  | Specifies the installation directory for the generated ``.mo`` files at | 
|  | the install phase.  If specified, files are installed to: | 
|  | ``<destdir>/<language>/LC_MESSAGES/<pot-base-filename>.mo``.  If not | 
|  | specified, files are not installed. | 
|  |  | 
|  | ``LANGUAGES <languages>...`` | 
|  | A list of one or more translatable language locales (e.g., ``en_US``, | 
|  | ``fr``, ``de_DE``, ``zh_CN``, etc.). | 
|  |  | 
|  | .. command:: gettext_create_translations | 
|  |  | 
|  | Creates a build rule that processes a given ``.pot`` template file and | 
|  | associated ``.po`` translation files into compiled Machine Object (``.mo``) | 
|  | files: | 
|  |  | 
|  | .. code-block:: cmake | 
|  |  | 
|  | gettext_create_translations(<pot-file> [ALL] <po-files>...) | 
|  |  | 
|  | This command defines a custom target named ``translations`` that compiles | 
|  | the specified ``<pot-file>`` and ``<po-files>`` into binary ``.mo`` files. | 
|  | It also automatically adds an install rule for the generated ``.mo`` files, | 
|  | installing them into the default | 
|  | ``share/locale/<language>/LC_MESSAGES/<pot-base-filename>.mo`` path during | 
|  | the install phase. | 
|  |  | 
|  | The arguments are: | 
|  |  | 
|  | ``<pot-file>`` | 
|  | The path to the gettext Portable Object Template file (``.pot``) serving | 
|  | as the source for translations.  If given as a relative path, it will be | 
|  | interpreted relative to the current source directory | 
|  | (:variable:`CMAKE_CURRENT_SOURCE_DIR`). | 
|  |  | 
|  | ``ALL`` | 
|  | Adds the generated target to the default CMake build target so that | 
|  | translations are created by default during the build. | 
|  |  | 
|  | ``<po-files>...`` | 
|  | A list of one or more translation source files in ``.po`` format, whose | 
|  | filenames must follow the format ``<language>.po``.  Relative paths will | 
|  | be interpreted relative to the current source directory | 
|  | (:variable:`CMAKE_CURRENT_SOURCE_DIR`). | 
|  |  | 
|  | .. note:: | 
|  | For better control over build and installation behavior, use | 
|  | :command:`gettext_process_po_files` instead. | 
|  |  | 
|  | Examples | 
|  | ^^^^^^^^ | 
|  |  | 
|  | Examples: Finding gettext | 
|  | """"""""""""""""""""""""" | 
|  |  | 
|  | Finding the GNU gettext tools: | 
|  |  | 
|  | .. code-block:: cmake | 
|  |  | 
|  | find_package(Gettext) | 
|  |  | 
|  | Or, finding gettext and specifying a minimum required version: | 
|  |  | 
|  | .. code-block:: cmake | 
|  |  | 
|  | find_package(Gettext 0.21) | 
|  |  | 
|  | Or, finding gettext and making it required (if not found, processing stops | 
|  | with an error message): | 
|  |  | 
|  | .. code-block:: cmake | 
|  |  | 
|  | find_package(Gettext REQUIRED) | 
|  |  | 
|  | Example: Working With gettext in CMake | 
|  | """""""""""""""""""""""""""""""""""""" | 
|  |  | 
|  | When starting with gettext, ``.pot`` file is considered to be created manually. | 
|  | For example, using a ``xgettext`` tool on the provided ``main.cxx`` source | 
|  | code file: | 
|  |  | 
|  | .. code-block:: c++ | 
|  | :caption: ``main.cxx`` | 
|  | :emphasize-lines: 18 | 
|  |  | 
|  | #include <iostream> | 
|  | #include <libintl.h> | 
|  | #include <locale.h> | 
|  |  | 
|  | int main() | 
|  | { | 
|  | // Set locale from environment | 
|  | setlocale(LC_ALL, ""); | 
|  |  | 
|  | // Bind the text domain | 
|  | const char* dir = std::getenv("TEXTDOMAINDIR"); | 
|  | if (!dir) { | 
|  | dir = "/usr/local/share/locale"; | 
|  | } | 
|  | bindtextdomain("MyApp", dir); | 
|  | textdomain("MyApp"); | 
|  |  | 
|  | std::cout << gettext("Hello, World") << std::endl; | 
|  |  | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | The ``xgettext`` tool extracts all strings from ``gettext()`` calls in provided | 
|  | source code and creates translatable strings: | 
|  |  | 
|  | .. code-block:: console | 
|  |  | 
|  | $ xgettext -o MyApp.pot main.cxx | 
|  |  | 
|  | Translatable files can be initialized by the project manually using | 
|  | ``msginit`` tool: | 
|  |  | 
|  | .. code-block:: console | 
|  |  | 
|  | $ mkdir -p locale/de_DE | 
|  | $ msginit -l de_DE.UTF8 -o locale/de_DE/MyApp.po -i MyApp.pot --no-translator | 
|  |  | 
|  | which creates a human-readable file that can be translated into a desired | 
|  | language (adjust as needed): | 
|  |  | 
|  | .. code-block:: po | 
|  | :caption: ``locale/de_DE/MyApp.po`` | 
|  | :emphasize-lines: 9 | 
|  |  | 
|  | msgid "" | 
|  | msgstr "" | 
|  | "Language: de\n" | 
|  | "Content-Type: text/plain; charset=UTF-8\n" | 
|  | "Content-Transfer-Encoding: 8bit\n" | 
|  | "Plural-Forms: nplurals=2; plural=(n != 1);\n" | 
|  |  | 
|  | msgid "Hello, World" | 
|  | msgstr "Hallo, Welt" | 
|  |  | 
|  | In CMake, the :command:`gettext_process_po_files` command provided by this | 
|  | module automatically creates the needed ``.mo`` files that application loads | 
|  | at runtime depending on the system environment variables such as ``LANG``. | 
|  | In the following example, also the :module:`GNUInstallDirs` module is used | 
|  | to provide the ``CMAKE_INSTALL_LOCALEDIR`` variable: | 
|  |  | 
|  | .. code-block:: cmake | 
|  | :caption: ``CMakeLists.txt`` | 
|  | :emphasize-lines: 9-14 | 
|  |  | 
|  | cmake_minimum_required(VERSION 3.24) | 
|  | project(GettextExample) | 
|  | include(GNUInstallDirs) | 
|  |  | 
|  | find_package(Gettext) | 
|  |  | 
|  | if(Gettext_FOUND) | 
|  | foreach(language IN ITEMS de_DE) | 
|  | gettext_process_po_files( | 
|  | ${language} | 
|  | ALL | 
|  | PO_FILES locale/${language}/MyApp.po | 
|  | INSTALL_DESTINATION ${CMAKE_INSTALL_LOCALEDIR} | 
|  | ) | 
|  | endforeach() | 
|  | endif() | 
|  |  | 
|  | add_executable(example main.cxx) | 
|  |  | 
|  | # Find and link Intl library to use gettext() from libintl.h | 
|  | find_package(Intl) | 
|  | target_link_libraries(example PRIVATE Intl::Intl) | 
|  |  | 
|  | install(TARGETS example) | 
|  |  | 
|  | .. code-block:: console | 
|  |  | 
|  | $ cmake -B build | 
|  | $ cmake --build build | 
|  | $ DESTDIR=$(pwd)/stage cmake --install build | 
|  |  | 
|  | To utilize the translations, the ``de_DE`` locale needs to be enabled on the | 
|  | system (see ``locale -a``).  And then the localized output can be run: | 
|  |  | 
|  | .. code-block:: console | 
|  |  | 
|  | $ LANG=de_DE.UTF-8 TEXTDOMAINDIR=./stage/usr/local/share/locale \ | 
|  | ./stage/usr/local/bin/example | 
|  |  | 
|  | Example: Processing POT File | 
|  | """""""""""""""""""""""""""" | 
|  |  | 
|  | The :command:`gettext_process_pot_file` command processes ``.po`` translation | 
|  | files located in the current binary directory into ``.mo`` files: | 
|  |  | 
|  | .. code-block:: cmake | 
|  | :caption: ``CMakeLists.txt`` | 
|  |  | 
|  | find_package(Gettext) | 
|  |  | 
|  | if(Gettext_FOUND) | 
|  | set(languages de_DE fr zh_CN) | 
|  |  | 
|  | foreach(language IN LISTS languages) | 
|  | configure_file(locale/${language}.po ${language}.po COPYONLY) | 
|  | endforeach() | 
|  |  | 
|  | gettext_process_pot_file( | 
|  | MyApp.pot | 
|  | ALL | 
|  | INSTALL_DESTINATION ${CMAKE_INSTALL_LOCALEDIR} | 
|  | LANGUAGES ${languages} | 
|  | ) | 
|  | endif() | 
|  |  | 
|  | Example: Creating Translations | 
|  | """""""""""""""""""""""""""""" | 
|  |  | 
|  | Using a simplified :command:`gettext_create_translations` command to create | 
|  | ``.mo`` files: | 
|  |  | 
|  | .. code-block:: cmake | 
|  | :caption: ``CMakeLists.txt`` | 
|  |  | 
|  | find_package(Gettext) | 
|  |  | 
|  | if(Gettext_FOUND) | 
|  | gettext_create_translations( | 
|  | MyApp.pot | 
|  | ALL | 
|  | locale/de_DE.po | 
|  | locale/fr.po | 
|  | locale/zh_CN.po | 
|  | ) | 
|  | endif() | 
|  |  | 
|  | See Also | 
|  | ^^^^^^^^ | 
|  |  | 
|  | * The :module:`FindIntl` module to find the Gettext runtime library (libintl). | 
|  | #]=======================================================================] | 
|  |  | 
|  | 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 ${_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 ${_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() |