FindGettext.cmake 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  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. #
  8. # Additionally it provides the following macros:
  9. # GETTEXT_CREATE_TRANSLATIONS ( outputFile [ALL] file1 ... fileN )
  10. # This will create a target "translations" which will convert the
  11. # given input po files into the binary output mo file. If the
  12. # ALL option is used, the translations will also be created when
  13. # building the default target.
  14. # GETTEXT_PROCESS_POT( <potfile> [ALL] [INSTALL_DESTINATION <destdir>] LANGUAGES <lang1> <lang2> ... )
  15. # Process the given pot file to mo files.
  16. # If INSTALL_DESTINATION is given then automatically install rules will be created,
  17. # the language subdirectory will be taken into account (by default use share/locale/).
  18. # If ALL is specified, the pot file is processed when building the all traget.
  19. # It creates a custom target "potfile".
  20. # GETTEXT_PROCESS_PO_FILES( <lang> [ALL] [INSTALL_DESTINATION <dir>] PO_FILES <po1> <po2> ... )
  21. # Process the given po files to mo files for the given language.
  22. # If INSTALL_DESTINATION is given then automatically install rules will be created,
  23. # the language subdirectory will be taken into account (by default use share/locale/).
  24. # If ALL is specified, the po files are processed when building the all traget.
  25. # It creates a custom target "pofiles".
  26. #=============================================================================
  27. # Copyright 2007-2009 Kitware, Inc.
  28. # Copyright 2007 Alexander Neundorf <[email protected]>
  29. #
  30. # Distributed under the OSI-approved BSD License (the "License");
  31. # see accompanying file Copyright.txt for details.
  32. #
  33. # This software is distributed WITHOUT ANY WARRANTY; without even the
  34. # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  35. # See the License for more information.
  36. #=============================================================================
  37. # (To distribute this file outside of CMake, substitute the full
  38. # License text for the above reference.)
  39. FIND_PROGRAM(GETTEXT_MSGMERGE_EXECUTABLE msgmerge)
  40. FIND_PROGRAM(GETTEXT_MSGFMT_EXECUTABLE msgfmt)
  41. INCLUDE(FindPackageHandleStandardArgs)
  42. FIND_PACKAGE_HANDLE_STANDARD_ARGS(Gettext REQUIRED_VARS GETTEXT_MSGMERGE_EXECUTABLE GETTEXT_MSGFMT_EXECUTABLE)
  43. INCLUDE(CMakeParseArguments)
  44. MACRO(GETTEXT_CREATE_TRANSLATIONS _potFile _firstPoFileArg)
  45. # make it a real variable, so we can modify it here
  46. SET(_firstPoFile "${_firstPoFileArg}")
  47. SET(_gmoFiles)
  48. GET_FILENAME_COMPONENT(_potName ${_potFile} NAME)
  49. STRING(REGEX REPLACE "^(.+)(\\.[^.]+)$" "\\1" _potBasename ${_potName})
  50. GET_FILENAME_COMPONENT(_absPotFile ${_potFile} ABSOLUTE)
  51. SET(_addToAll)
  52. IF(${_firstPoFile} STREQUAL "ALL")
  53. SET(_addToAll "ALL")
  54. SET(_firstPoFile)
  55. ENDIF(${_firstPoFile} STREQUAL "ALL")
  56. FOREACH (_currentPoFile ${_firstPoFile} ${ARGN})
  57. GET_FILENAME_COMPONENT(_absFile ${_currentPoFile} ABSOLUTE)
  58. GET_FILENAME_COMPONENT(_abs_PATH ${_absFile} PATH)
  59. GET_FILENAME_COMPONENT(_lang ${_absFile} NAME_WE)
  60. SET(_gmoFile ${CMAKE_CURRENT_BINARY_DIR}/${_lang}.gmo)
  61. ADD_CUSTOM_COMMAND(
  62. OUTPUT ${_gmoFile}
  63. COMMAND ${GETTEXT_MSGMERGE_EXECUTABLE} --quiet --update --backup=none -s ${_absFile} ${_absPotFile}
  64. COMMAND ${GETTEXT_MSGFMT_EXECUTABLE} -o ${_gmoFile} ${_absFile}
  65. DEPENDS ${_absPotFile} ${_absFile}
  66. )
  67. INSTALL(FILES ${_gmoFile} DESTINATION share/locale/${_lang}/LC_MESSAGES RENAME ${_potBasename}.mo)
  68. SET(_gmoFiles ${_gmoFiles} ${_gmoFile})
  69. ENDFOREACH (_currentPoFile )
  70. ADD_CUSTOM_TARGET(translations ${_addToAll} DEPENDS ${_gmoFiles})
  71. ENDMACRO(GETTEXT_CREATE_TRANSLATIONS )
  72. FUNCTION(GETTEXT_PROCESS_POT_FILE _potFile)
  73. SET(_gmoFiles)
  74. SET(_options ALL)
  75. SET(_oneValueArgs INSTALL_DESTINATION)
  76. SET(_multiValueArgs LANGUAGES)
  77. CMAKE_PARSE_ARGUMENTS(_parsedArguments "${_options}" "${_oneValueArgs}" "${_multiValueArgs}" ${ARGN})
  78. GET_FILENAME_COMPONENT(_potName ${_potFile} NAME)
  79. STRING(REGEX REPLACE "^(.+)(\\.[^.]+)$" "\\1" _potBasename ${_potName})
  80. GET_FILENAME_COMPONENT(_absPotFile ${_potFile} ABSOLUTE)
  81. FOREACH (_lang ${_parsedArguments_LANGUAGES})
  82. SET(_poFile "${CMAKE_CURRENT_BINARY_DIR}/${_lang}.po")
  83. SET(_gmoFile "${CMAKE_CURRENT_BINARY_DIR}/${_lang}.gmo")
  84. ADD_CUSTOM_COMMAND(
  85. OUTPUT "${_poFile}"
  86. COMMAND ${GETTEXT_MSGMERGE_EXECUTABLE} --quiet --update --backup=none -s ${_poFile} ${_absPotFile}
  87. DEPENDS ${_absPotFile}
  88. )
  89. ADD_CUSTOM_COMMAND(
  90. OUTPUT "${_gmoFile}"
  91. COMMAND ${GETTEXT_MSGFMT_EXECUTABLE} -o ${_gmoFile} ${_poFile}
  92. DEPENDS ${_absPotFile} ${_poFile}
  93. )
  94. IF(_parsedArguments_INSTALL_DESTINATION)
  95. INSTALL(FILES ${_gmoFile} DESTINATION ${_parsedArguments_INSTALL_DESTINATION}/${_lang}/LC_MESSAGES RENAME ${_potBasename}.mo)
  96. ENDIF(_parsedArguments_INSTALL_DESTINATION)
  97. LIST(APPEND _gmoFiles ${_gmoFile})
  98. ENDFOREACH (_lang )
  99. IF(_parsedArguments_ALL)
  100. ADD_CUSTOM_TARGET(potfiles ALL DEPENDS ${_gmoFiles})
  101. ELSE(_parsedArguments_ALL)
  102. ADD_CUSTOM_TARGET(potfiles DEPENDS ${_gmoFiles})
  103. ENDIF(_parsedArguments_ALL)
  104. ENDFUNCTION(GETTEXT_PROCESS_POT_FILE)
  105. FUNCTION(GETTEXT_PROCESS_PO_FILES _lang)
  106. SET(_options ALL)
  107. SET(_oneValueArgs INSTALL_DESTINATION)
  108. SET(_multiValueArgs PO_FILES)
  109. SET(_gmoFiles)
  110. CMAKE_PARSE_ARGUMENTS(_parsedArguments "${_options}" "${_oneValueArgs}" "${_multiValueArgs}" ${ARGN})
  111. FOREACH(_current_PO_FILE ${_parsedArguments_PO_FILES})
  112. GET_FILENAME_COMPONENT(_name ${_current_PO_FILE} NAME)
  113. STRING(REGEX REPLACE "^(.+)(\\.[^.]+)$" "\\1" _basename ${_name})
  114. SET(_gmoFile ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.gmo)
  115. ADD_CUSTOM_COMMAND(OUTPUT ${_gmoFile}
  116. COMMAND ${GETTEXT_MSGFMT_EXECUTABLE} -o ${_gmoFile} ${_current_PO_FILE}
  117. WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
  118. DEPENDS ${_current_PO_FILE}
  119. )
  120. IF(_parsedArguments_INSTALL_DESTINATION)
  121. INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.gmo DESTINATION ${_parsedArguments_INSTALL_DESTINATION}/${_lang}/LC_MESSAGES/ RENAME ${_basename}.mo)
  122. ENDIF(_parsedArguments_INSTALL_DESTINATION)
  123. LIST(APPEND _gmoFiles ${_gmoFile})
  124. ENDFOREACH(_current_PO_FILE)
  125. IF(_parsedArguments_ALL)
  126. ADD_CUSTOM_TARGET(pofiles ALL DEPENDS ${_gmoFiles})
  127. ELSE(_parsedArguments_ALL)
  128. ADD_CUSTOM_TARGET(pofiles DEPENDS ${_gmoFiles})
  129. ENDIF(_parsedArguments_ALL)
  130. ENDFUNCTION(GETTEXT_PROCESS_PO_FILES)
  131. IF (GETTEXT_MSGMERGE_EXECUTABLE AND GETTEXT_MSGFMT_EXECUTABLE )
  132. SET(GETTEXT_FOUND TRUE)
  133. ELSE (GETTEXT_MSGMERGE_EXECUTABLE AND GETTEXT_MSGFMT_EXECUTABLE )
  134. SET(GETTEXT_FOUND FALSE)
  135. IF (GetText_REQUIRED)
  136. MESSAGE(FATAL_ERROR "GetText not found")
  137. ENDIF (GetText_REQUIRED)
  138. ENDIF (GETTEXT_MSGMERGE_EXECUTABLE AND GETTEXT_MSGFMT_EXECUTABLE )