]> git.saurik.com Git - apt.git/blame - CMake/Documentation.cmake
zh_CN.po: update simplified Chinese translation
[apt.git] / CMake / Documentation.cmake
CommitLineData
10ec2d23
JAK
1# po4a/docbook documentation support for CMake
2# - see documentation of add_docbook()
3#
4# Copyright (C) 2016 Julian Andres Klode <jak@debian.org>.
9a2aa0e7
JAK
5#
6# Permission is hereby granted, free of charge, to any person
7# obtaining a copy of this software and associated documentation files
8# (the "Software"), to deal in the Software without restriction,
9# including without limitation the rights to use, copy, modify, merge,
10# publish, distribute, sublicense, and/or sell copies of the Software,
11# and to permit persons to whom the Software is furnished to do so,
12# subject to the following conditions:
13#
14# The above copyright notice and this permission notice shall be
15# included in all copies or substantial portions of the Software.
16#
17# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
21# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
22# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
23# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24# SOFTWARE.
25
9a2aa0e7 26
10ec2d23
JAK
27# Split up a string of the form DOCUMENT[.DOCUMENT][.LANGUAGE][.SECTION].EXTENSION
28#
29# There might be up to two parts in the document name. The language must be
30# a two char language code like de, or a 5 char code of the form de_DE.
31function(po4a_components doc lang sec ext translated_full_document)
32 get_filename_component(name ${translated_full_document} NAME)
33 string(REPLACE "." ";" name "${name}") # Make it a list
34
35 list(GET name 0 _doc) # First element is always the document
36 list(GET name 1 _lang) # Second *might* be a language
37 list(GET name -2 _sec) # Second-last *might* be a section
38 list(GET name -1 _ext) # Last element is always the file type
39
40 # If the language code is neither a file type, nor a section, nor a language
41 # assume it is part of the file name and use the next component as the lang.
42 if(_lang AND NOT _lang MATCHES "^(xml|dbk|[0-9]|[a-z][a-z]|[a-z][a-z]_[A-Z][A-Z])$")
43 set(_doc "${_doc}.${_lang}")
44 list(GET name 2 _lang)
45 endif()
46 # If no language is present, we get a section; both not present => type
47 if(_lang MATCHES "xml|dbk|[0-9]")
48 set(_lang "")
49 endif()
50 if(NOT _sec MATCHES "^[0-9]$") # A (manpage) section must be a number
51 set(_sec "")
52 endif()
53
54 set(${doc} ${_doc} PARENT_SCOPE)
55 set(${lang} ${_lang} PARENT_SCOPE)
56 set(${sec} ${_sec} PARENT_SCOPE)
57 set(${ext} ${_ext} PARENT_SCOPE)
9a2aa0e7
JAK
58endfunction()
59
60
10ec2d23
JAK
61# Process one document
62function(po4a_one stamp_out out full_document language deps)
63 path_join(full_path "${CMAKE_CURRENT_SOURCE_DIR}" "${full_document}")
64 po4a_components(document _ section ext "${full_document}")
65
66 # Calculate target file name
67 set(dest "${language}/${document}.${language}")
68 if(section)
69 set(dest "${dest}.${section}")
70 endif()
71
72 # po4a might drop files not translated enough, so build a stamp file
73 set(stamp ${CMAKE_CURRENT_BINARY_DIR}/${dest}.po4a-stamp)
74 add_custom_command(
75 OUTPUT ${stamp}
76 COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/${language}
77 COMMAND po4a --previous --no-backups
ee60e00c 78 --package-name='${PROJECT_NAME}-doc'
10ec2d23
JAK
79 --package-version='${PACKAGE_VERSION}'
80 --msgid-bugs-address='${PACKAGE_MAIL}'
81 --translate-only ${dest}.${ext}
82 --srcdir ${CMAKE_CURRENT_SOURCE_DIR}
83 --destdir ${CMAKE_CURRENT_BINARY_DIR}
84 ${CMAKE_CURRENT_SOURCE_DIR}/po4a.conf
85 COMMAND ${CMAKE_COMMAND} -E touch ${stamp}
86 COMMENT "Generating ${dest}.${ext} (or dropping it)"
87 DEPENDS ${full_document} ${deps} po/${language}.po
88 )
89 # Return result
90 set(${stamp_out} ${stamp} PARENT_SCOPE)
91 set(${out} ${CMAKE_CURRENT_BINARY_DIR}/${dest}.${ext} PARENT_SCOPE)
9a2aa0e7
JAK
92endfunction()
93
10ec2d23
JAK
94function(xsltproc_one)
95 set(generated "")
96 set(options HTML TEXT MANPAGE)
97 set(oneValueArgs STAMP STAMP_OUT FULL_DOCUMENT)
98 set(multiValueArgs INSTALL DEPENDS)
99 cmake_parse_arguments(DOC "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
9a2aa0e7 100
10ec2d23
JAK
101 po4a_components(document language section ext "${DOC_FULL_DOCUMENT}")
102
103 # Default parameters
104 set(params
105 --nonet
106 --xinclude
107 --stringparam chunk.quietly yes
108 --stringparam man.output.quietly yes
109 --path ${PROJECT_SOURCE_DIR}/vendor/${CURRENT_VENDOR}/
110 --path ${CMAKE_CURRENT_SOURCE_DIR}/
111 )
112
113 # Parameters if localized
114 if(language)
115 list(APPEND params -stringparam l10n.gentext.default.language ${language})
116 endif()
117
118 path_join(full_input_path ${CMAKE_CURRENT_SOURCE_DIR} ${DOC_FULL_DOCUMENT})
119
120 if (DOC_MANPAGE)
121 if (language)
122 set(manpage_output "${CMAKE_CURRENT_BINARY_DIR}/${language}/${document}.${section}")
123 else()
124 set(manpage_output "${CMAKE_CURRENT_BINARY_DIR}/${document}.${section}")
125 endif()
126 set(manpage_stylesheet "${CMAKE_CURRENT_SOURCE_DIR}/manpage-style.xsl")
ee60e00c 127 set(manpage_params)
10ec2d23
JAK
128
129 install(FILES ${manpage_output}
130 DESTINATION ${CMAKE_INSTALL_MANDIR}/${language}/man${section}
131 OPTIONAL)
132 endif()
133 if (DOC_HTML)
134 if (language)
135 set(html_output "${CMAKE_CURRENT_BINARY_DIR}/${language}/${document}.${language}.html")
136 else()
137 set(html_output "${CMAKE_CURRENT_BINARY_DIR}/${document}.html")
138 endif()
139 set(html_params --stringparam base.dir ${html_output})
140 set(html_stylesheet "${CMAKE_CURRENT_SOURCE_DIR}/docbook-html-style.xsl")
141 install(DIRECTORY ${html_output}
142 DESTINATION ${DOC_INSTALL}
143 OPTIONAL)
9a2aa0e7 144
10ec2d23
JAK
145 endif()
146 if (DOC_TEXT)
147 if (language)
148 set(text_output "${CMAKE_CURRENT_BINARY_DIR}/${language}/${document}.${language}.text")
149 else()
150 set(text_output "${CMAKE_CURRENT_BINARY_DIR}/${document}.text")
151 endif()
152 set(text_params --stringparam base.dir ${text_output})
153 set(text_stylesheet "${CMAKE_CURRENT_SOURCE_DIR}/docbook-text-style.xsl")
9a2aa0e7 154
10ec2d23 155 file(RELATIVE_PATH text_output_relative ${CMAKE_CURRENT_BINARY_DIR} ${text_output})
9a2aa0e7 156
10ec2d23
JAK
157 add_custom_command(OUTPUT ${text_output}.w3m-stamp
158 COMMAND ${PROJECT_SOURCE_DIR}/CMake/run_if_exists.sh
159 --stdout ${text_output}
160 ${text_output}.html
161 env LC_ALL=C.UTF-8 w3m -cols 78 -dump
162 -o display_charset=UTF-8
163 -no-graph -T text/html ${text_output}.html
164 COMMAND ${CMAKE_COMMAND} -E touch ${text_output}.w3m-stamp
165 COMMENT "Generating ${text_output_relative} (if not dropped by po4a)"
166 DEPENDS "${text_output}.html.xsltproc-stamp"
167 )
168 list(APPEND generated ${text_output}.w3m-stamp)
9a2aa0e7 169
10ec2d23
JAK
170 install(FILES ${text_output}
171 DESTINATION ${DOC_INSTALL}
172 OPTIONAL)
173 set(text_output "${text_output}.html")
174 endif()
9a2aa0e7 175
10ec2d23
JAK
176 foreach(type in manpage html text)
177 if (NOT ${type}_output)
178 continue()
179 endif()
9a2aa0e7 180
10ec2d23
JAK
181 set(output ${${type}_output})
182 set(stylesheet ${${type}_stylesheet})
183 set(type_params ${${type}_params})
184 file(RELATIVE_PATH output_relative ${CMAKE_CURRENT_BINARY_DIR} ${output})
9a2aa0e7 185
10ec2d23
JAK
186 add_custom_command(OUTPUT ${output}.xsltproc-stamp
187 COMMAND ${PROJECT_SOURCE_DIR}/CMake/run_if_exists.sh
188 ${full_input_path}
189 xsltproc ${params} ${type_params} -o ${output}
190 ${stylesheet}
191 ${full_input_path}
192 COMMAND ${CMAKE_COMMAND} -E touch ${output}.xsltproc-stamp
193 COMMENT "Generating ${output_relative} (if not dropped by po4a)"
194 DEPENDS ${DOC_STAMP} ${DOC_DEPENDS})
9a2aa0e7 195
10ec2d23
JAK
196 list(APPEND generated ${output}.xsltproc-stamp)
197 endforeach()
198
199 set(${DOC_STAMP_OUT} ${generated} PARENT_SCOPE)
200endfunction()
9a2aa0e7 201
9a2aa0e7 202
10ec2d23
JAK
203# add_docbook(Name [ALL] [HTML] [TEXT] [MANPAGE]
204# [INSTALL install dir]
205# [DEPENDS depend ...]
206# [DOCUMENTS documents ...]
207# [LINGUAS lingua ...])
208#
209# Generate a target called name with all the documents being converted to
210# the chosen output formats and translated to the chosen languages using po4a.
211#
212# For the translation support, the po4a.conf must be written so that
213# translations for a document guide.xml are written to LANG/guide.LANG.xml,
214# and for a manual page man.5.xml to a file called LANG/man.LANG.5.xml.
215#
216# The guide and manual page names may also contain a second component separated
217# by a dot, it must however not be a valid language code.
218#
219# Note that po4a might chose not to generate a translated manual page for a
220# given language if the translation rate is not high enough. We deal with this
221# by creating stamp files.
222function(add_docbook target)
223 set(generated "")
224 set(options HTML TEXT MANPAGE ALL)
ee60e00c 225 set(oneValueArgs)
10ec2d23
JAK
226 set(multiValueArgs INSTALL DOCUMENTS LINGUAS DEPENDS)
227 cmake_parse_arguments(DOC "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
228
229 if (DOC_HTML)
230 list(APPEND formats HTML)
231 endif()
232 if (DOC_TEXT)
233 list(APPEND formats TEXT)
234 endif()
235 if (DOC_MANPAGE)
236 list(APPEND formats MANPAGE)
237 endif()
238
239 foreach(document ${DOC_DOCUMENTS})
240 foreach(lang ${DOC_LINGUAS})
241 po4a_one(po4a_stamp po4a_out ${document} "${lang}" "${DOC_DEPENDS}")
242 xsltproc_one(STAMP_OUT xslt_stamp
243 STAMP ${po4a_stamp}
244 FULL_DOCUMENT ${po4a_out}
245 INSTALL ${DOC_INSTALL}
246 ${formats})
247
248 list(APPEND stamps ${xslt_stamp})
249 endforeach()
250 xsltproc_one(STAMP_OUT xslt_stamp
251 STAMP ${document}
252 FULL_DOCUMENT ${document}
253 INSTALL ${DOC_INSTALL}
254 ${formats})
255
256 list(APPEND stamps ${xslt_stamp})
257 endforeach()
258
259 if (DOC_ALL)
260 add_custom_target(${target} ALL DEPENDS ${stamps})
261 else()
262 add_custom_target(${target} DEPENDS ${stamps})
263 endif()
9a2aa0e7
JAK
264endfunction()
265
10ec2d23
JAK
266# Add an update-po4a target
267function(add_update_po4a target pot header)
268 set(WRITE_HEADER "")
9a2aa0e7 269
10ec2d23
JAK
270 if (header)
271 set(WRITE_HEADER
272 COMMAND sed -n "/^\#$/,$p" ${pot} > ${pot}.headerfree
273 COMMAND cat ${header} ${pot}.headerfree > ${pot}
274 COMMAND rm ${pot}.headerfree
275 )
276 endif()
277 add_custom_target(${target}
278 COMMAND po4a --previous --no-backups --force --no-translations
279 --msgmerge-opt --add-location=file
280 --porefs noline,wrap
281 --package-name=${PROJECT_NAME}-doc --package-version=${PACKAGE_VERSION}
282 --msgid-bugs-address=${PACKAGE_MAIL} po4a.conf
283 ${WRITE_HEADER}
284 VERBATIM
285 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
286 )
9a2aa0e7 287endfunction()