1 # - Find GNU gettext tools
2 # This module looks for the GNU gettext tools. This module defines the
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)
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".
28 #=============================================================================
29 # Copyright 2007-2009 Kitware, Inc.
30 # Copyright 2007 Alexander Neundorf <neundorf@kde.org>
32 # Distributed under the OSI-approved BSD License (the "License");
33 # see accompanying file Copyright.txt for details.
35 # This software is distributed WITHOUT ANY WARRANTY; without even the
36 # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
37 # See the License for more information.
38 #=============================================================================
39 # (To distribute this file outside of CMake, substitute the full
40 # License text for the above reference.)
42 FIND_PROGRAM(GETTEXT_MSGMERGE_EXECUTABLE msgmerge)
44 FIND_PROGRAM(GETTEXT_MSGFMT_EXECUTABLE msgfmt)
46 IF(GETTEXT_MSGMERGE_EXECUTABLE)
47 EXECUTE_PROCESS(COMMAND ${GETTEXT_MSGMERGE_EXECUTABLE} --version
48 OUTPUT_VARIABLE gettext_version
50 OUTPUT_STRIP_TRAILING_WHITESPACE)
51 IF (gettext_version MATCHES "^msgmerge \\(.*\\) [0-9]")
52 STRING(REGEX REPLACE "^msgmerge \\([^\\)]*\\) ([0-9\\.]+[^ \n]*).*" "\\1" GETTEXT_VERSION_STRING "${gettext_version}")
54 UNSET(gettext_version)
55 ENDIF(GETTEXT_MSGMERGE_EXECUTABLE)
57 INCLUDE(FindPackageHandleStandardArgs)
58 FIND_PACKAGE_HANDLE_STANDARD_ARGS(Gettext
59 REQUIRED_VARS GETTEXT_MSGMERGE_EXECUTABLE GETTEXT_MSGFMT_EXECUTABLE
60 VERSION_VAR GETTEXT_VERSION_STRING)
62 INCLUDE(CMakeParseArguments)
64 FUNCTION(_GETTEXT_GET_UNIQUE_TARGET_NAME _name _unique_name)
65 SET(propertyName "_GETTEXT_UNIQUE_COUNTER_${_name}")
66 GET_PROPERTY(currentCounter GLOBAL PROPERTY "${propertyName}")
67 IF(NOT currentCounter)
70 SET(${_unique_name} "${_name}_${currentCounter}" PARENT_SCOPE)
71 MATH(EXPR currentCounter "${currentCounter} + 1")
72 SET_PROPERTY(GLOBAL PROPERTY ${propertyName} ${currentCounter} )
75 MACRO(GETTEXT_CREATE_TRANSLATIONS _potFile _firstPoFileArg)
76 # make it a real variable, so we can modify it here
77 SET(_firstPoFile "${_firstPoFileArg}")
80 GET_FILENAME_COMPONENT(_potName ${_potFile} NAME)
81 STRING(REGEX REPLACE "^(.+)(\\.[^.]+)$" "\\1" _potBasename ${_potName})
82 GET_FILENAME_COMPONENT(_absPotFile ${_potFile} ABSOLUTE)
85 IF(${_firstPoFile} STREQUAL "ALL")
88 ENDIF(${_firstPoFile} STREQUAL "ALL")
90 FOREACH (_currentPoFile ${_firstPoFile} ${ARGN})
91 GET_FILENAME_COMPONENT(_absFile ${_currentPoFile} ABSOLUTE)
92 GET_FILENAME_COMPONENT(_abs_PATH ${_absFile} PATH)
93 GET_FILENAME_COMPONENT(_lang ${_absFile} NAME_WE)
94 SET(_gmoFile ${CMAKE_CURRENT_BINARY_DIR}/${_lang}.gmo)
98 COMMAND ${GETTEXT_MSGMERGE_EXECUTABLE} --quiet --update --backup=none -s ${_absFile} ${_absPotFile}
99 COMMAND ${GETTEXT_MSGFMT_EXECUTABLE} -o ${_gmoFile} ${_absFile}
100 DEPENDS ${_absPotFile} ${_absFile}
103 INSTALL(FILES ${_gmoFile} DESTINATION share/locale/${_lang}/LC_MESSAGES RENAME ${_potBasename}.mo)
104 SET(_gmoFiles ${_gmoFiles} ${_gmoFile})
106 ENDFOREACH (_currentPoFile )
108 IF(NOT TARGET translations)
109 ADD_CUSTOM_TARGET(translations)
112 _GETTEXT_GET_UNIQUE_TARGET_NAME(translations uniqueTargetName)
114 ADD_CUSTOM_TARGET(${uniqueTargetName} ${_addToAll} DEPENDS ${_gmoFiles})
116 ADD_DEPENDENCIES(translations ${uniqueTargetName})
118 ENDMACRO(GETTEXT_CREATE_TRANSLATIONS )
121 FUNCTION(GETTEXT_PROCESS_POT_FILE _potFile)
124 SET(_oneValueArgs INSTALL_DESTINATION)
125 SET(_multiValueArgs LANGUAGES)
127 CMAKE_PARSE_ARGUMENTS(_parsedArguments "${_options}" "${_oneValueArgs}" "${_multiValueArgs}" ${ARGN})
129 GET_FILENAME_COMPONENT(_potName ${_potFile} NAME)
130 STRING(REGEX REPLACE "^(.+)(\\.[^.]+)$" "\\1" _potBasename ${_potName})
131 GET_FILENAME_COMPONENT(_absPotFile ${_potFile} ABSOLUTE)
133 FOREACH (_lang ${_parsedArguments_LANGUAGES})
134 SET(_poFile "${CMAKE_CURRENT_BINARY_DIR}/${_lang}.po")
135 SET(_gmoFile "${CMAKE_CURRENT_BINARY_DIR}/${_lang}.gmo")
139 COMMAND ${GETTEXT_MSGMERGE_EXECUTABLE} --quiet --update --backup=none -s ${_poFile} ${_absPotFile}
140 DEPENDS ${_absPotFile}
145 COMMAND ${GETTEXT_MSGFMT_EXECUTABLE} -o ${_gmoFile} ${_poFile}
146 DEPENDS ${_absPotFile} ${_poFile}
149 IF(_parsedArguments_INSTALL_DESTINATION)
150 INSTALL(FILES ${_gmoFile} DESTINATION ${_parsedArguments_INSTALL_DESTINATION}/${_lang}/LC_MESSAGES RENAME ${_potBasename}.mo)
151 ENDIF(_parsedArguments_INSTALL_DESTINATION)
152 LIST(APPEND _gmoFiles ${_gmoFile})
155 IF(NOT TARGET potfiles)
156 ADD_CUSTOM_TARGET(potfiles)
159 _GETTEXT_GET_UNIQUE_TARGET_NAME( potfiles uniqueTargetName)
161 IF(_parsedArguments_ALL)
162 ADD_CUSTOM_TARGET(${uniqueTargetName} ALL DEPENDS ${_gmoFiles})
163 ELSE(_parsedArguments_ALL)
164 ADD_CUSTOM_TARGET(${uniqueTargetName} DEPENDS ${_gmoFiles})
165 ENDIF(_parsedArguments_ALL)
167 ADD_DEPENDENCIES(potfiles ${uniqueTargetName})
169 ENDFUNCTION(GETTEXT_PROCESS_POT_FILE)
172 FUNCTION(GETTEXT_PROCESS_PO_FILES _lang)
174 SET(_oneValueArgs INSTALL_DESTINATION)
175 SET(_multiValueArgs PO_FILES)
178 CMAKE_PARSE_ARGUMENTS(_parsedArguments "${_options}" "${_oneValueArgs}" "${_multiValueArgs}" ${ARGN})
180 FOREACH(_current_PO_FILE ${_parsedArguments_PO_FILES})
181 GET_FILENAME_COMPONENT(_name ${_current_PO_FILE} NAME)
182 STRING(REGEX REPLACE "^(.+)(\\.[^.]+)$" "\\1" _basename ${_name})
183 SET(_gmoFile ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.gmo)
184 ADD_CUSTOM_COMMAND(OUTPUT ${_gmoFile}
185 COMMAND ${GETTEXT_MSGFMT_EXECUTABLE} -o ${_gmoFile} ${_current_PO_FILE}
186 WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
187 DEPENDS ${_current_PO_FILE}
190 IF(_parsedArguments_INSTALL_DESTINATION)
191 INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${_basename}.gmo DESTINATION ${_parsedArguments_INSTALL_DESTINATION}/${_lang}/LC_MESSAGES/ RENAME ${_basename}.mo)
192 ENDIF(_parsedArguments_INSTALL_DESTINATION)
193 LIST(APPEND _gmoFiles ${_gmoFile})
194 ENDFOREACH(_current_PO_FILE)
197 IF(NOT TARGET pofiles)
198 ADD_CUSTOM_TARGET(pofiles)
201 _GETTEXT_GET_UNIQUE_TARGET_NAME( pofiles uniqueTargetName)
203 IF(_parsedArguments_ALL)
204 ADD_CUSTOM_TARGET(${uniqueTargetName} ALL DEPENDS ${_gmoFiles})
205 ELSE(_parsedArguments_ALL)
206 ADD_CUSTOM_TARGET(${uniqueTargetName} DEPENDS ${_gmoFiles})
207 ENDIF(_parsedArguments_ALL)
209 ADD_DEPENDENCIES(pofiles ${uniqueTargetName})
211 ENDFUNCTION(GETTEXT_PROCESS_PO_FILES)
213 IF (GETTEXT_MSGMERGE_EXECUTABLE AND GETTEXT_MSGFMT_EXECUTABLE )
214 SET(GETTEXT_FOUND TRUE)
215 ELSE (GETTEXT_MSGMERGE_EXECUTABLE AND GETTEXT_MSGFMT_EXECUTABLE )
216 SET(GETTEXT_FOUND FALSE)
217 IF (GetText_REQUIRED)
218 MESSAGE(FATAL_ERROR "GetText not found")
219 ENDIF (GetText_REQUIRED)
220 ENDIF (GETTEXT_MSGMERGE_EXECUTABLE AND GETTEXT_MSGFMT_EXECUTABLE )