TZIVI-254: IVI needs a newer version of cmake
[profile/ivi/cmake.git] / Modules / FindGettext.cmake
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 #=============================================================================
29 # Copyright 2007-2009 Kitware, Inc.
30 # Copyright 2007      Alexander Neundorf <neundorf@kde.org>
31 #
32 # Distributed under the OSI-approved BSD License (the "License");
33 # see accompanying file Copyright.txt for details.
34 #
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.)
41
42 FIND_PROGRAM(GETTEXT_MSGMERGE_EXECUTABLE msgmerge)
43
44 FIND_PROGRAM(GETTEXT_MSGFMT_EXECUTABLE msgfmt)
45
46 IF(GETTEXT_MSGMERGE_EXECUTABLE)
47    EXECUTE_PROCESS(COMMAND ${GETTEXT_MSGMERGE_EXECUTABLE} --version
48                   OUTPUT_VARIABLE gettext_version
49                   ERROR_QUIET
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}")
53    ENDIF()
54    UNSET(gettext_version)
55 ENDIF(GETTEXT_MSGMERGE_EXECUTABLE)
56
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)
61
62 INCLUDE(CMakeParseArguments)
63
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)
68       SET(currentCounter 1)
69    ENDIF()
70    SET(${_unique_name} "${_name}_${currentCounter}" PARENT_SCOPE)
71    MATH(EXPR currentCounter "${currentCounter} + 1")
72    SET_PROPERTY(GLOBAL PROPERTY ${propertyName} ${currentCounter} )
73 ENDFUNCTION()
74
75 MACRO(GETTEXT_CREATE_TRANSLATIONS _potFile _firstPoFileArg)
76    # make it a real variable, so we can modify it here
77    SET(_firstPoFile "${_firstPoFileArg}")
78
79    SET(_gmoFiles)
80    GET_FILENAME_COMPONENT(_potName ${_potFile} NAME)
81    STRING(REGEX REPLACE "^(.+)(\\.[^.]+)$" "\\1" _potBasename ${_potName})
82    GET_FILENAME_COMPONENT(_absPotFile ${_potFile} ABSOLUTE)
83
84    SET(_addToAll)
85    IF(${_firstPoFile} STREQUAL "ALL")
86       SET(_addToAll "ALL")
87       SET(_firstPoFile)
88    ENDIF(${_firstPoFile} STREQUAL "ALL")
89
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)
95
96       ADD_CUSTOM_COMMAND(
97          OUTPUT ${_gmoFile}
98          COMMAND ${GETTEXT_MSGMERGE_EXECUTABLE} --quiet --update --backup=none -s ${_absFile} ${_absPotFile}
99          COMMAND ${GETTEXT_MSGFMT_EXECUTABLE} -o ${_gmoFile} ${_absFile}
100          DEPENDS ${_absPotFile} ${_absFile}
101       )
102
103       INSTALL(FILES ${_gmoFile} DESTINATION share/locale/${_lang}/LC_MESSAGES RENAME ${_potBasename}.mo)
104       SET(_gmoFiles ${_gmoFiles} ${_gmoFile})
105
106    ENDFOREACH (_currentPoFile )
107
108    IF(NOT TARGET translations)
109       ADD_CUSTOM_TARGET(translations)
110    ENDIF()
111
112   _GETTEXT_GET_UNIQUE_TARGET_NAME(translations uniqueTargetName)
113
114    ADD_CUSTOM_TARGET(${uniqueTargetName} ${_addToAll} DEPENDS ${_gmoFiles})
115
116    ADD_DEPENDENCIES(translations ${uniqueTargetName})
117
118 ENDMACRO(GETTEXT_CREATE_TRANSLATIONS )
119
120
121 FUNCTION(GETTEXT_PROCESS_POT_FILE _potFile)
122    SET(_gmoFiles)
123    SET(_options ALL)
124    SET(_oneValueArgs INSTALL_DESTINATION)
125    SET(_multiValueArgs LANGUAGES)
126
127    CMAKE_PARSE_ARGUMENTS(_parsedArguments "${_options}" "${_oneValueArgs}" "${_multiValueArgs}" ${ARGN})
128
129    GET_FILENAME_COMPONENT(_potName ${_potFile} NAME)
130    STRING(REGEX REPLACE "^(.+)(\\.[^.]+)$" "\\1" _potBasename ${_potName})
131    GET_FILENAME_COMPONENT(_absPotFile ${_potFile} ABSOLUTE)
132
133    FOREACH (_lang ${_parsedArguments_LANGUAGES})
134       SET(_poFile  "${CMAKE_CURRENT_BINARY_DIR}/${_lang}.po")
135       SET(_gmoFile "${CMAKE_CURRENT_BINARY_DIR}/${_lang}.gmo")
136
137       ADD_CUSTOM_COMMAND(
138          OUTPUT "${_poFile}"
139          COMMAND ${GETTEXT_MSGMERGE_EXECUTABLE} --quiet --update --backup=none -s ${_poFile} ${_absPotFile}
140          DEPENDS ${_absPotFile}
141       )
142
143       ADD_CUSTOM_COMMAND(
144          OUTPUT "${_gmoFile}"
145          COMMAND ${GETTEXT_MSGFMT_EXECUTABLE} -o ${_gmoFile} ${_poFile}
146          DEPENDS ${_absPotFile} ${_poFile}
147       )
148
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})
153    ENDFOREACH (_lang )
154
155   IF(NOT TARGET potfiles)
156      ADD_CUSTOM_TARGET(potfiles)
157   ENDIF()
158
159   _GETTEXT_GET_UNIQUE_TARGET_NAME( potfiles uniqueTargetName)
160
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)
166
167    ADD_DEPENDENCIES(potfiles ${uniqueTargetName})
168
169 ENDFUNCTION(GETTEXT_PROCESS_POT_FILE)
170
171
172 FUNCTION(GETTEXT_PROCESS_PO_FILES _lang)
173    SET(_options ALL)
174    SET(_oneValueArgs INSTALL_DESTINATION)
175    SET(_multiValueArgs PO_FILES)
176    SET(_gmoFiles)
177
178    CMAKE_PARSE_ARGUMENTS(_parsedArguments "${_options}" "${_oneValueArgs}" "${_multiValueArgs}" ${ARGN})
179
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}
188          )
189
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)
195
196
197   IF(NOT TARGET pofiles)
198      ADD_CUSTOM_TARGET(pofiles)
199   ENDIF()
200
201   _GETTEXT_GET_UNIQUE_TARGET_NAME( pofiles uniqueTargetName)
202
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)
208
209    ADD_DEPENDENCIES(pofiles ${uniqueTargetName})
210
211 ENDFUNCTION(GETTEXT_PROCESS_PO_FILES)
212
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 )