FindGettext.cmake 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. # - Find GNU gettext tools
  2. # This module looks for the GNU gettext tools. This module defines the
  3. # following values:
  4. # GETTEXT_MSGMERGE_EXECUTABLE: the full path to the msgmerge tool.
  5. # GETTEXT_MSGFMT_EXECUTABLE: the full path to the msgfmt tool.
  6. # GETTEXT_FOUND: True if gettext has been found.
  7. # GETTEXT_VERSION_STRING: the version of gettext found (since CMake 2.8.8)
  8. #
  9. # Additionally it provides the following macros:
  10. # GETTEXT_CREATE_TRANSLATIONS ( outputFile [ALL] file1 ... fileN )
  11. # This will create a target "translations" which will convert the
  12. # given input po files into the binary output mo file. If the
  13. # ALL option is used, the translations will also be created when
  14. # building the default target.
  15. # GETTEXT_PROCESS_POT( <potfile> [ALL] [INSTALL_DESTINATION <destdir>] LANGUAGES <lang1> <lang2> ... )
  16. # Process the given pot file to mo files.
  17. # If INSTALL_DESTINATION is given then automatically install rules will be created,
  18. # the language subdirectory will be taken into account (by default use share/locale/).
  19. # If ALL is specified, the pot file is processed when building the all traget.
  20. # It creates a custom target "potfile".
  21. # GETTEXT_PROCESS_PO_FILES( <lang> [ALL] [INSTALL_DESTINATION <dir>] PO_FILES <po1> <po2> ... )
  22. # Process the given po files to mo files for the given language.
  23. # If INSTALL_DESTINATION is given then automatically install rules will be created,
  24. # the language subdirectory will be taken into account (by default use share/locale/).
  25. # If ALL is specified, the po files are processed when building the all traget.
  26. # It creates a custom target "pofiles".
  27. #=============================================================================
  28. # Copyright 2007-2009 Kitware, Inc.
  29. # Copyright 2007 Alexander Neundorf <[email protected]>
  30. #
  31. # Distributed under the OSI-approved BSD License (the "License");
  32. # see accompanying file Copyright.txt for details.
  33. #
  34. # This software is distributed WITHOUT ANY WARRANTY; without even the
  35. # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  36. # See the License for more information.
  37. #=============================================================================
  38. # (To distribute this file outside of CMake, substitute the full
  39. # License text for the above reference.)
  40. FIND_PROGRAM(GETTEXT_MSGMERGE_EXECUTABLE msgmerge)
  41. FIND_PROGRAM(GETTEXT_MSGFMT_EXECUTABLE msgfmt)
  42. IF(GETTEXT_MSGMERGE_EXECUTABLE)
  43. EXECUTE_PROCESS(COMMAND ${GETTEXT_MSGMERGE_EXECUTABLE} --version
  44. OUTPUT_VARIABLE gettext_version
  45. ERROR_QUIET
  46. OUTPUT_STRIP_TRAILING_WHITESPACE)
  47. IF (gettext_version MATCHES "^msgmerge \\(.*\\) [0-9]")
  48. STRING(REGEX REPLACE "^msgmerge \\([^\\)]*\\) ([0-9\\.]+[^ \n]*).*" "\\1" GETTEXT_VERSION_STRING "${gettext_version}")
  49. ENDIF()
  50. UNSET(gettext_version)
  51. ENDIF(GETTEXT_MSGMERGE_EXECUTABLE)
  52. INCLUDE(FindPackageHandleStandardArgs)
  53. FIND_PACKAGE_HANDLE_STANDARD_ARGS(Gettext
  54. REQUIRED_VARS GETTEXT_MSGMERGE_EXECUTABLE GETTEXT_MSGFMT_EXECUTABLE
  55. VERSION_VAR GETTEXT_VERSION_STRING)
  56. INCLUDE(CMakeParseArguments)
  57. FUNCTION(_GETTEXT_GET_UNIQUE_TARGET_NAME _name _unique_name)
  58. SET(propertyName "_GETTEXT_UNIQUE_COUNTER_${_name}")
  59. GET_PROPERTY(currentCounter GLOBAL PROPERTY "${propertyName}")
  60. IF(NOT currentCounter)
  61. SET(currentCounter 1)
  62. ENDIF()
  63. SET(${_unique_name} "${_name}_${currentCounter}" PARENT_SCOPE)
  64. MATH(EXPR currentCounter "${currentCounter} + 1")
  65. SET_PROPERTY(GLOBAL PROPERTY ${propertyName} ${currentCounter} )
  66. ENDFUNCTION()
  67. MACRO(GETTEXT_CREATE_TRANSLATIONS _potFile _firstPoFileArg)
  68. # make it a real variable, so we can modify it here
  69. SET(_firstPoFile "${_firstPoFileArg}")
  70. SET(_gmoFiles)
  71. GET_FILENAME_COMPONENT(_potName ${_potFile} NAME)
  72. STRING(REGEX REPLACE "^(.+)(\\.[^.]+)$" "\\1" _potBasename ${_potName})
  73. GET_FILENAME_COMPONENT(_absPotFile ${_potFile} ABSOLUTE)
  74. SET(_addToAll)
  75. IF(${_firstPoFile} STREQUAL "ALL")
  76. SET(_addToAll "ALL")
  77. SET(_firstPoFile)
  78. ENDIF(${_firstPoFile} STREQUAL "ALL")
  79. FOREACH (_currentPoFile ${_firstPoFile} ${ARGN})
  80. GET_FILENAME_COMPONENT(_absFile ${_currentPoFile} ABSOLUTE)
  81. GET_FILENAME_COMPONENT(_abs_PATH ${_absFile} PATH)
  82. GET_FILENAME_COMPONENT(_lang ${_absFile} NAME_WE)
  83. SET(_gmoFile ${CMAKE_CURRENT_BINARY_DIR}/${_lang}.gmo)
  84. ADD_CUSTOM_COMMAND(
  85. OUTPUT ${_gmoFile}
  86. COMMAND ${GETTEXT_MSGMERGE_EXECUTABLE} --quiet --update --backup=none -s ${_absFile} ${_absPotFile}
  87. COMMAND ${GETTEXT_MSGFMT_EXECUTABLE} -o ${_gmoFile} ${_absFile}
  88. DEPENDS ${_absPotFile} ${_absFile}
  89. )
  90. INSTALL(FILES ${_gmoFile} DESTINATION share/locale/${_lang}/LC_MESSAGES RENAME ${_potBasename}.mo)
  91. SET(_gmoFiles ${_gmoFiles} ${_gmoFile})
  92. ENDFOREACH (_currentPoFile )
  93. IF(NOT TARGET translations)
  94. ADD_CUSTOM_TARGET(translations)
  95. ENDIF()
  96. _GETTEXT_GET_UNIQUE_TARGET_NAME(translations uniqueTargetName)
  97. ADD_CUSTOM_TARGET(${uniqueTargetName} ${_addToAll} DEPENDS ${_gmoFiles})
  98. ADD_DEPENDENCIES(translations ${uniqueTargetName})
  99. ENDMACRO(GETTEXT_CREATE_TRANSLATIONS )
  100. FUNCTION(GETTEXT_PROCESS_POT_FILE _potFile)
  101. SET(_gmoFiles)
  102. SET(_options ALL)
  103. SET(_oneValueArgs INSTALL_DESTINATION)
  104. SET(_multiValueArgs LANGUAGES)
  105. CMAKE_PARSE_ARGUMENTS(_parsedArguments "${_options}" "${_oneValueArgs}" "${_multiValueArgs}" ${ARGN})
  106. GET_FILENAME_COMPONENT(_potName ${_potFile} NAME)
  107. STRING(REGEX REPLACE "^(.+)(\\.[^.]+)$" "\\1" _potBasename ${_potName})
  108. GET_FILENAME_COMPONENT(_absPotFile ${_potFile} ABSOLUTE)
  109. FOREACH (_lang ${_parsedArguments_LANGUAGES})
  110. SET(_poFile "${CMAKE_CURRENT_BINARY_DIR}/${_lang}.po")
  111. SET(_gmoFile "${CMAKE_CURRENT_BINARY_DIR}/${_lang}.gmo")
  112. ADD_CUSTOM_COMMAND(
  113. OUTPUT "${_poFile}"
  114. COMMAND ${GETTEXT_MSGMERGE_EXECUTABLE} --quiet --update --backup=none -s ${_poFile} ${_absPotFile}
  115. DEPENDS ${_absPotFile}
  116. )
  117. ADD_CUSTOM_COMMAND(
  118. OUTPUT "${_gmoFile}"
  119. COMMAND ${GETTEXT_MSGFMT_EXECUTABLE} -o ${_gmoFile} ${_poFile}
  120. DEPENDS ${_absPotFile} ${_poFile}
  121. )
  122. IF(_parsedArguments_INSTALL_DESTINATION)
  123. INSTALL(FILES ${_gmoFile} DESTINATION ${_parsedArguments_INSTALL_DESTINATION}/${_lang}/LC_MESSAGES RENAME ${_potBasename}.mo)
  124. ENDIF(_parsedArguments_INSTALL_DESTINATION)
  125. LIST(APPEND _gmoFiles ${_gmoFile})
  126. ENDFOREACH (_lang )
  127. IF(NOT TARGET potfiles)
  128. ADD_CUSTOM_TARGET(potfiles)
  129. ENDIF()
  130. _GETTEXT_GET_UNIQUE_TARGET_NAME( potfiles uniqueTargetName)
  131. IF(_parsedArguments_ALL)
  132. ADD_CUSTOM_TARGET(${uniqueTargetName} ALL DEPENDS ${_gmoFiles})
  133. ELSE(_parsedArguments_ALL)
  134. ADD_CUSTOM_TARGET(${uniqueTargetName} DEPENDS ${_gmoFiles})
  135. ENDIF(_parsedArguments_ALL)
  136. ADD_DEPENDENCIES(potfiles ${uniqueTargetName})
  137. ENDFUNCTION(GETTEXT_PROCESS_POT_FILE)
  138. FUNCTION(GETTEXT_PROCESS_PO_FILES _lang)
  139. SET(_options ALL)
  140. SET(_oneValueArgs INSTALL_DESTINATION)
  141. SET(_multiValueArgs PO_FILES)
  142. SET(_gmoFiles)
  143. CMAKE_PARSE_ARGUMENTS(_parsedArguments "${_options}" "${_oneValueArgs}" "${_multiValueArgs}" ${ARGN})
  144. FOREACH(_current_PO_FILE ${_parsedArguments_PO_FILES})
  145. GET_FILENAME_COMPONENT(_name ${_current_PO_FILE} NAME)
  146. STRING(REGEX REPLACE "^(.+)(\\.[^.]+)$" "\\1" _basename ${_name})
  147. SET(_gmoFile ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.gmo)
  148. ADD_CUSTOM_COMMAND(OUTPUT ${_gmoFile}
  149. COMMAND ${GETTEXT_MSGFMT_EXECUTABLE} -o ${_gmoFile} ${_current_PO_FILE}
  150. WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
  151. DEPENDS ${_current_PO_FILE}
  152. )
  153. IF(_parsedArguments_INSTALL_DESTINATION)
  154. INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.gmo DESTINATION ${_parsedArguments_INSTALL_DESTINATION}/${_lang}/LC_MESSAGES/ RENAME ${_basename}.mo)
  155. ENDIF(_parsedArguments_INSTALL_DESTINATION)
  156. LIST(APPEND _gmoFiles ${_gmoFile})
  157. ENDFOREACH(_current_PO_FILE)
  158. IF(NOT TARGET pofiles)
  159. ADD_CUSTOM_TARGET(pofiles)
  160. ENDIF()
  161. _GETTEXT_GET_UNIQUE_TARGET_NAME( pofiles uniqueTargetName)
  162. IF(_parsedArguments_ALL)
  163. ADD_CUSTOM_TARGET(${uniqueTargetName} ALL DEPENDS ${_gmoFiles})
  164. ELSE(_parsedArguments_ALL)
  165. ADD_CUSTOM_TARGET(${uniqueTargetName} DEPENDS ${_gmoFiles})
  166. ENDIF(_parsedArguments_ALL)
  167. ADD_DEPENDENCIES(pofiles ${uniqueTargetName})
  168. ENDFUNCTION(GETTEXT_PROCESS_PO_FILES)
  169. IF (GETTEXT_MSGMERGE_EXECUTABLE AND GETTEXT_MSGFMT_EXECUTABLE )
  170. SET(GETTEXT_FOUND TRUE)
  171. ELSE (GETTEXT_MSGMERGE_EXECUTABLE AND GETTEXT_MSGFMT_EXECUTABLE )
  172. SET(GETTEXT_FOUND FALSE)
  173. IF (GetText_REQUIRED)
  174. MESSAGE(FATAL_ERROR "GetText not found")
  175. ENDIF (GetText_REQUIRED)
  176. ENDIF (GETTEXT_MSGMERGE_EXECUTABLE AND GETTEXT_MSGFMT_EXECUTABLE )