cmake/Modules/FindGettext.cmake

232 lines
7.9 KiB
CMake
Raw Normal View History

2016-10-30 18:24:19 +01:00
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
# file Copyright.txt or https://cmake.org/licensing for details.
2014-08-03 19:52:23 +02:00
#.rst:
# FindGettext
# -----------
#
# Find GNU gettext tools
#
# This module looks for the GNU gettext tools. This module defines the
# following values:
2014-08-03 19:52:23 +02:00
#
# ::
#
# GETTEXT_MSGMERGE_EXECUTABLE: the full path to the msgmerge tool.
# GETTEXT_MSGFMT_EXECUTABLE: the full path to the msgfmt tool.
# GETTEXT_FOUND: True if gettext has been found.
# GETTEXT_VERSION_STRING: the version of gettext found (since CMake 2.8.8)
#
#
#
# Additionally it provides the following macros:
2015-04-27 22:25:09 +02:00
#
2014-08-03 19:52:23 +02:00
# GETTEXT_CREATE_TRANSLATIONS ( outputFile [ALL] file1 ... fileN )
#
# ::
#
# This will create a target "translations" which will convert the
# given input po files into the binary output mo file. If the
# ALL option is used, the translations will also be created when
# building the default target.
#
2015-04-27 22:25:09 +02:00
# GETTEXT_PROCESS_POT_FILE( <potfile> [ALL] [INSTALL_DESTINATION <destdir>]
2014-08-03 19:52:23 +02:00
# LANGUAGES <lang1> <lang2> ... )
#
# ::
#
# Process the given pot file to mo files.
2015-04-27 22:25:09 +02:00
# If INSTALL_DESTINATION is given then automatically install rules will
# be created, the language subdirectory will be taken into account
# (by default use share/locale/).
2014-08-03 19:52:23 +02:00
# If ALL is specified, the pot file is processed when building the all traget.
# It creates a custom target "potfile".
#
# GETTEXT_PROCESS_PO_FILES( <lang> [ALL] [INSTALL_DESTINATION <dir>]
# PO_FILES <po1> <po2> ... )
#
# ::
#
# Process the given po files to mo files for the given language.
2015-04-27 22:25:09 +02:00
# If INSTALL_DESTINATION is given then automatically install rules will
# be created, the language subdirectory will be taken into account
# (by default use share/locale/).
2014-08-03 19:52:23 +02:00
# If ALL is specified, the po files are processed when building the all traget.
# It creates a custom target "pofiles".
2015-04-27 22:25:09 +02:00
#
# .. note::
# If you wish to use the Gettext library (libintl), use :module:`FindIntl`.
2013-03-16 19:13:01 +02:00
find_program(GETTEXT_MSGMERGE_EXECUTABLE msgmerge)
2013-03-16 19:13:01 +02:00
find_program(GETTEXT_MSGFMT_EXECUTABLE msgfmt)
2013-03-16 19:13:01 +02:00
if(GETTEXT_MSGMERGE_EXECUTABLE)
execute_process(COMMAND ${GETTEXT_MSGMERGE_EXECUTABLE} --version
2012-04-19 19:04:21 +03:00
OUTPUT_VARIABLE gettext_version
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE)
2018-01-26 17:06:56 +01:00
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}")
2013-03-16 19:13:01 +02:00
endif()
unset(gettext_version)
2018-01-26 17:06:56 +01:00
unset(msgmerge_name)
unset(msgmerge_namewe)
2013-03-16 19:13:01 +02:00
endif()
2012-04-19 19:04:21 +03:00
2013-03-16 19:13:01 +02:00
include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake)
2012-04-19 19:04:21 +03:00
FIND_PACKAGE_HANDLE_STANDARD_ARGS(Gettext
REQUIRED_VARS GETTEXT_MSGMERGE_EXECUTABLE GETTEXT_MSGFMT_EXECUTABLE
VERSION_VAR GETTEXT_VERSION_STRING)
2012-02-18 12:40:36 +02:00
2013-03-16 19:13:01 +02:00
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()
2012-04-19 19:04:21 +03:00
2013-03-16 19:13:01 +02:00
macro(GETTEXT_CREATE_TRANSLATIONS _potFile _firstPoFileArg)
# make it a real variable, so we can modify it here
2013-03-16 19:13:01 +02:00
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(
2012-02-18 12:40:36 +02:00
OUTPUT ${_gmoFile}
COMMAND ${GETTEXT_MSGMERGE_EXECUTABLE} --quiet --update --backup=none -s ${_absFile} ${_absPotFile}
COMMAND ${GETTEXT_MSGFMT_EXECUTABLE} -o ${_gmoFile} ${_absFile}
2012-02-18 12:40:36 +02:00
DEPENDS ${_absPotFile} ${_absFile}
)
2013-03-16 19:13:01 +02:00
install(FILES ${_gmoFile} DESTINATION share/locale/${_lang}/LC_MESSAGES RENAME ${_potBasename}.mo)
set(_gmoFiles ${_gmoFiles} ${_gmoFile})
2013-03-16 19:13:01 +02:00
endforeach ()
2013-03-16 19:13:01 +02:00
if(NOT TARGET translations)
add_custom_target(translations)
endif()
2012-04-19 19:04:21 +03:00
_GETTEXT_GET_UNIQUE_TARGET_NAME(translations uniqueTargetName)
2013-03-16 19:13:01 +02:00
add_custom_target(${uniqueTargetName} ${_addToAll} DEPENDS ${_gmoFiles})
2012-04-19 19:04:21 +03:00
2013-03-16 19:13:01 +02:00
add_dependencies(translations ${uniqueTargetName})
2013-03-16 19:13:01 +02:00
endmacro()
2012-02-18 12:40:36 +02:00
2013-03-16 19:13:01 +02:00
function(GETTEXT_PROCESS_POT_FILE _potFile)
set(_gmoFiles)
set(_options ALL)
set(_oneValueArgs INSTALL_DESTINATION)
set(_multiValueArgs LANGUAGES)
2012-02-18 12:40:36 +02:00
CMAKE_PARSE_ARGUMENTS(_parsedArguments "${_options}" "${_oneValueArgs}" "${_multiValueArgs}" ${ARGN})
2013-03-16 19:13:01 +02:00
get_filename_component(_potName ${_potFile} NAME)
string(REGEX REPLACE "^(.+)(\\.[^.]+)$" "\\1" _potBasename ${_potName})
get_filename_component(_absPotFile ${_potFile} ABSOLUTE)
2012-02-18 12:40:36 +02:00
2013-03-16 19:13:01 +02:00
foreach (_lang ${_parsedArguments_LANGUAGES})
set(_poFile "${CMAKE_CURRENT_BINARY_DIR}/${_lang}.po")
set(_gmoFile "${CMAKE_CURRENT_BINARY_DIR}/${_lang}.gmo")
2012-02-18 12:40:36 +02:00
2013-03-16 19:13:01 +02:00
add_custom_command(
2012-02-18 12:40:36 +02:00
OUTPUT "${_poFile}"
COMMAND ${GETTEXT_MSGMERGE_EXECUTABLE} --quiet --update --backup=none -s ${_poFile} ${_absPotFile}
DEPENDS ${_absPotFile}
)
2013-03-16 19:13:01 +02:00
add_custom_command(
2012-02-18 12:40:36 +02:00
OUTPUT "${_gmoFile}"
COMMAND ${GETTEXT_MSGFMT_EXECUTABLE} -o ${_gmoFile} ${_poFile}
DEPENDS ${_absPotFile} ${_poFile}
)
2013-03-16 19:13:01 +02:00
if(_parsedArguments_INSTALL_DESTINATION)
install(FILES ${_gmoFile} DESTINATION ${_parsedArguments_INSTALL_DESTINATION}/${_lang}/LC_MESSAGES RENAME ${_potBasename}.mo)
endif()
list(APPEND _gmoFiles ${_gmoFile})
endforeach ()
2012-02-18 12:40:36 +02:00
2013-03-16 19:13:01 +02:00
if(NOT TARGET potfiles)
add_custom_target(potfiles)
endif()
2012-04-19 19:04:21 +03:00
_GETTEXT_GET_UNIQUE_TARGET_NAME( potfiles uniqueTargetName)
2013-03-16 19:13:01 +02:00
if(_parsedArguments_ALL)
add_custom_target(${uniqueTargetName} ALL DEPENDS ${_gmoFiles})
else()
add_custom_target(${uniqueTargetName} DEPENDS ${_gmoFiles})
endif()
2012-04-19 19:04:21 +03:00
2013-03-16 19:13:01 +02:00
add_dependencies(potfiles ${uniqueTargetName})
2012-04-19 19:04:21 +03:00
2013-03-16 19:13:01 +02:00
endfunction()
2012-02-18 12:40:36 +02:00
2013-03-16 19:13:01 +02:00
function(GETTEXT_PROCESS_PO_FILES _lang)
set(_options ALL)
set(_oneValueArgs INSTALL_DESTINATION)
set(_multiValueArgs PO_FILES)
set(_gmoFiles)
2012-02-18 12:40:36 +02:00
CMAKE_PARSE_ARGUMENTS(_parsedArguments "${_options}" "${_oneValueArgs}" "${_multiValueArgs}" ${ARGN})
2013-03-16 19:13:01 +02:00
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}
2012-02-18 12:40:36 +02:00
COMMAND ${GETTEXT_MSGFMT_EXECUTABLE} -o ${_gmoFile} ${_current_PO_FILE}
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
DEPENDS ${_current_PO_FILE}
)
2013-03-16 19:13:01 +02:00
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()
2012-02-18 12:40:36 +02:00
2012-04-19 19:04:21 +03:00
2013-03-16 19:13:01 +02:00
if(NOT TARGET pofiles)
add_custom_target(pofiles)
endif()
2012-04-19 19:04:21 +03:00
_GETTEXT_GET_UNIQUE_TARGET_NAME( pofiles uniqueTargetName)
2013-03-16 19:13:01 +02:00
if(_parsedArguments_ALL)
add_custom_target(${uniqueTargetName} ALL DEPENDS ${_gmoFiles})
else()
add_custom_target(${uniqueTargetName} DEPENDS ${_gmoFiles})
endif()
2012-04-19 19:04:21 +03:00
2013-03-16 19:13:01 +02:00
add_dependencies(pofiles ${uniqueTargetName})
2012-04-19 19:04:21 +03:00
2013-03-16 19:13:01 +02:00
endfunction()