File: FindGettextTools.cmake

package info (click to toggle)
sdcv 0.5.5-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 596 kB
  • sloc: cpp: 3,082; sh: 226; xml: 23; makefile: 10
file content (152 lines) | stat: -rw-r--r-- 5,684 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
# - Finds GNU gettext and provides tools
# This module looks for the GNU gettext tools. This module defines the
# following values:
#  GETTEXT_XGETTEXT_EXECUTABLE: The full path to the xgettext tool.
#  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)
#
# It provides the following macro:
#
# GETTEXT_MAKE_TARGET (
#       targetName
#       HIERARCHY <HIERARCHY_FORMAT>
#       KEYWORDS  keyword1 ... keywordN
#       DOMAIN    <TRANSLATION_DOMAIN>
#       STOCK_DIR <DIR>
#       LANG_DIR  <DIR>
#       OUT_DIR   <DIR>
#       SOURCE    sourceFile1 ... sourceFileN )
#
#    Creates a target that will take a set of translatable source files,
#    create a Gettext pot file then copy stock translations in to the build
#    directory to allow user editing, then compiles them in to mo files in a
#    directory hierarchy to be used in the application.
#
#   USAGE:
#      targetName (e.g., "lang")
#        The name of the target that will be created to generate translations.
#
#      HIERARCHY (e.g., "{1}/{2}/{3}/{4}.mo")
#        This is the format in which compiled message catalogs are placed.
#        {1}: The path prefix.      (e.g., "/my-repo/build/locale/")
#        {2}: The language name.    (e.g., "en")
#        {3}: The catalog category. (e.g., "LC_MESSAGES")
#        {4}: The domain.           (e.g., "my-app")
#
#      KEYWORDS (e.g., "_")
#        A list of keywords used by xgettext to find translatable strings in the
#        source files.
#
#      DOMAIN (e.g., "my-app")
#        The Gettext domain. It should be unique to your application.
#
#      STOCK_DIR (e.g., "/my-repo/stock-lang/")
#        The path to the initial translations to be copied to the LANG_DIR.
#        If you have a set of official translations in your source repository,
#        you'd want to set STOCK_DIR to this.
#
#      LANG_DIR (e.g., "lang")
#        The name of the directory to be created in the build folder, containing
#        editable translations and updated templates.
#
#      OUT_DIR (e.g., "locale")
#        The directory that compiled catalogs will be placed in, according to
#        the HIERARCHY format.
#
#      SOURCE (e.g., "main.c")
#        A list of source files to read translatable strings from. Usually this
#        could be the same list you pass to add_executable.
#
#      If you use the examples above and have a structure like this:
#        /my-repo/stock-lang/en.po
#
#      You may end up with this structure:
#        /my-repo/stock-lang/en.po
#        /my-repo/build/lang/my-app.pot
#        /my-repo/build/lang/en.po
#        /my-repo/build/locale/en/LC_MESSAGES/my-app.mo

# This nasty set of tools is divided up in to three files:
#   FindGettextTools.cmake
#     This is the file you're reading right now. It provides a neat macro.
#   FindGettextTools/config.cmake.in
#     This is used as the bridge to transfer arguments from the macro to the
#     actual script used to do Gettext stuff. A copy is created and filled in by
#     FindGettextTools.cmake and read by FindGettextTools/script.cmake.
#     The copy is found in the target's directory in the CMakeFiles directory
#     under the name 'gettext.cmake'.
#   FindGettextTools/script.cmake
#     Does Gettext things based on the bridge config file whenever the target
#     created using FindGettextTools.cmake is run.

FIND_PROGRAM(GETTEXT_XGETTEXT_EXECUTABLE xgettext)
FIND_PROGRAM(GETTEXT_MSGMERGE_EXECUTABLE msgmerge)
FIND_PROGRAM(GETTEXT_MSGFMT_EXECUTABLE   msgfmt)

SET(_gettextScript "${CMAKE_CURRENT_LIST_DIR}/FindGettextTools/script.cmake")
SET(_gettextConfig "${CMAKE_CURRENT_LIST_DIR}/FindGettextTools/config.cmake.in")

IF(GETTEXT_XGETTEXT_EXECUTABLE)
   EXECUTE_PROCESS(COMMAND ${GETTEXT_XGETTEXT_EXECUTABLE} --version
      OUTPUT_VARIABLE gettext_version
      ERROR_QUIET
      OUTPUT_STRIP_TRAILING_WHITESPACE)
   IF(gettext_version MATCHES "^xgettext \\(.*\\) [0-9]")
      STRING(REGEX REPLACE "^xgettext \\([^\\)]*\\) ([0-9\\.]+[^ \n]*).*" "\\1"
         GETTEXT_VERSION_STRING "${gettext_version}")
   ENDIF()
   SET(gettext_version)
ENDIF()

INCLUDE(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(Gettext
   REQUIRED_VARS
      GETTEXT_XGETTEXT_EXECUTABLE
      GETTEXT_MSGMERGE_EXECUTABLE
      GETTEXT_MSGFMT_EXECUTABLE
   VERSION_VAR GETTEXT_VERSION_STRING)

INCLUDE(CMakeParseArguments)

FUNCTION(GETTEXT_MAKE_TARGET _targetName)
   SET(_oneValueArgs   HIERARCHY DOMAIN STOCK_DIR LANG_DIR OUT_DIR)
   SET(_multiValueArgs KEYWORDS SOURCE)
   
   CMAKE_PARSE_ARGUMENTS(_parsedArguments
      ""
      "${_oneValueArgs}"
      "${_multiValueArgs}"
      "${ARGN}")
   
   IF(NOT (
         _parsedArguments_HIERARCHY AND
         _parsedArguments_KEYWORDS  AND
         _parsedArguments_DOMAIN    AND
         _parsedArguments_STOCK_DIR AND
         _parsedArguments_LANG_DIR  AND
         _parsedArguments_OUT_DIR   AND
         _parsedArguments_SOURCE))
      MESSAGE(FATAL_ERROR "Wrong usage!")
   ENDIF()
   
   SET(_config
      "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${_targetName}.dir/gettext.cmake")
   
   CONFIGURE_FILE(${_gettextConfig} ${_config})
   
   ADD_CUSTOM_TARGET(${_targetName} ${CMAKE_COMMAND} "-P" ${_gettextScript}
      ${_config})
ENDFUNCTION()

IF(GETTEXT_MSGMERGE_EXECUTABLE AND
   GETTEXT_MSGFMT_EXECUTABLE AND
   GETTEXT_XGETTEXT_EXECUTABLE)
   SET(GETTEXT_FOUND TRUE)
ELSE()
   SET(GETTEXT_FOUND FALSE)
   IF(GETTEXT_REQUIRED)
      MESSAGE(FATAL_ERROR "Gettext not found")
   ENDIF()
ENDIF()