aboutsummaryrefslogtreecommitdiffstats
path: root/po/CMakeLists.txt
blob: cd9300777d73219cbb351835642a55f3dfc45717 (plain)
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
# Most of this copied from the repository of Stellarium
# http://sourceforge.net/projects/stellarium/

# Special targets for translations:
#
# translations
#   Converts all PO files to GMO files. Note that it does *not* update
#   the PO files or the PO templates -- in fact, these files are never
#   updated automatically.
#
# generate-pot
#   Re-creates all POT files unconditionally.
#
# update-po
#   Updates all PO files unconditionally. Note that it takes care of
#   updating the POT files.
#
# translations-<DOMAIN>
# generate-pot-<DOMAIN>
# update-po-<DOMAIN>
#   Same as above, but only affect the files in the corresponding
#   po/<DOMAIN> directory. (DOMAIN is actually the base name of the POT
#   file in the subdirectory, but that should match the directory name
#   anyway.)

ADD_CUSTOM_TARGET(translations)
ADD_CUSTOM_TARGET(generate-pot)
ADD_CUSTOM_TARGET(update-po)

# GETTEXT_CREATE_TRANSLATIONS(domain [DEFAULT_TARGET] lang1 ... langN)
#
# Creates custom build rules to create and install (G)MO files for the
# specified languages. If the DEFAULT_TARGET option is used, the
# translations will also be created when building the default target.
#
# "domain" is the translation domain, eg. "gawk". A POT file
# with the name ${domain}.pot must exist in the directory of the
# CMakeLists.txt file invoking the macro.
#
# This macro also creates the "translations-${domain}" and
# "update-po-${domain}" targets (see above for an explanation).
#
MACRO(GETTEXT_CREATE_TRANSLATIONS _domain _firstLang)

    SET(_gmoFiles)
    GET_FILENAME_COMPONENT(_absPotFile ${_domain}.pot ABSOLUTE)

    # Update these PO files when building the "update-po-<DOMAIN>" and
    # "update-po" targets.
    ADD_CUSTOM_TARGET(update-po-${_domain})
    ADD_DEPENDENCIES(update-po update-po-${_domain})

    # Make sure the POT file is updated before updating the PO files.
    ADD_DEPENDENCIES(update-po-${_domain} generate-pot-${_domain})

    SET(_addToAll)
    IF(${_firstLang} STREQUAL "DEFAULT_TARGET")
        SET(_addToAll "ALL")
        SET(_firstLang)
    ENDIF(${_firstLang} STREQUAL "DEFAULT_TARGET")

    FOREACH (_lang ${ARGN})
        GET_FILENAME_COMPONENT(_absFile ${_lang}.po ABSOLUTE)
        FILE(RELATIVE_PATH _relFile ${PROJECT_SOURCE_DIR} ${_absFile})
        SET(_gmoFile ${CMAKE_CURRENT_BINARY_DIR}/${_lang}.gmo)

        # Convert a PO file into a GMO file.
        ADD_CUSTOM_COMMAND(
            OUTPUT ${_gmoFile} 
            COMMAND ${GETTEXT_MSGFMT_EXECUTABLE} -o ${_gmoFile} ${_absFile}
            DEPENDS ${_absFile}
        )

        # Update the PO file unconditionally when building the
        # "update-po-<DOMAIN>" target. Note that to see the file being
        # processed, we have to run "cmake -E echo", because the
        # COMMENT is not displayed by cmake...
        ADD_CUSTOM_COMMAND(
            TARGET update-po-${_domain}
            POST_BUILD
            COMMAND ${CMAKE_COMMAND} -E echo "** Updating ${_relFile}"
            COMMAND ${GETTEXT_MSGMERGE_EXECUTABLE}
                --quiet --update -m --backup=none -s
                ${_absFile} ${_absPotFile}
            VERBATIM
        )

        INSTALL(FILES ${_gmoFile} DESTINATION share/locale/${_lang}/LC_MESSAGES RENAME ${_domain}.mo)
        SET(_gmoFiles ${_gmoFiles} ${_gmoFile})

   ENDFOREACH (_lang)

   # Create the GMO files when building the "translations-<DOMAIN>" and
   # "translations" targets.
   ADD_CUSTOM_TARGET(translations-${_domain} ${_addToAll} DEPENDS ${_gmoFiles})
   ADD_DEPENDENCIES(translations translations-${_domain})

ENDMACRO(GETTEXT_CREATE_TRANSLATIONS )

SET(gawk_DOMAIN gawk)
SET(gawk_POT ${gawk_DOMAIN}.pot)

file(READ LINGUAS linguas)
string(REGEX REPLACE "\n" ";"  linguas ${linguas})
GETTEXT_CREATE_TRANSLATIONS(${gawk_DOMAIN} DEFAULT_TARGET ${linguas})

ADD_CUSTOM_TARGET(
  generate-pot-${gawk_DOMAIN}
  ${GETTEXT_XGETTEXT_EXECUTABLE}
  -o ${CMAKE_CURRENT_SOURCE_DIR}/${gawk_POT}
  -C
  --keyword=_
  --keyword=N_
  --keyword=q_
  --keyword=translate:2
  --add-comments=TRANSLATORS:
  --directory=${CMAKE_BINARY_DIR}
  --directory=${CMAKE_SOURCE_DIR}
  --output-dir=${CMAKE_BINARY_DIR}
  --files-from=${CMAKE_CURRENT_SOURCE_DIR}/POTFILES.in
  --copyright-holder=FSF
  WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
  COMMENT "Generating ${gawk_POT}"
  VERBATIM
)
# TODO: It would be nice to just depend on the exact files in POTFILES.in
#file(READ ${CMAKE_CURRENT_SOURCE_DIR}/${gawk_POT} UiHeaders)
#ADD_DEPENDENCIES(generate-pot-${gawk_DOMAIN} UiHeaders)
#ADD_DEPENDENCIES(generate-pot-${gawk_DOMAIN} gawk_UIS_H)
# Make sure the UI headers are created first.
ADD_DEPENDENCIES(generate-pot-${gawk_DOMAIN} StelGuiLib)  # ??? FIXME
# Generate this POT file when building the "generate-pot" target.
ADD_DEPENDENCIES(generate-pot generate-pot-${gawk_DOMAIN})