Docbook: Generate one PDF paper size.
[metze/wireshark/wip.git] / cmake / modules / FindXSLTPROC.cmake
1 #
2 # - Find unix commands from cygwin
3 # This module looks for some usual Unix commands.
4 #
5
6 include(FindCygwin)
7
8 if(ENABLE_PDF_GUIDES)
9     find_package(FOP)
10     if(${FOP_EXECUTABLE} STREQUAL "FOP_EXECUTABLE-NOTFOUND")
11         message(FATAL_ERROR "fop wasn't found, but is necessary for building PDFs." )
12     endif()
13 endif()
14
15 find_program(XSLTPROC_EXECUTABLE
16   NAMES
17     xsltproc
18   PATHS
19     ${CYGWIN_INSTALL_PATH}/bin
20     /bin
21     /usr/bin
22     /usr/local/bin
23     /sbin
24 )
25
26 # Handle the QUIETLY and REQUIRED arguments and set XSLTPROC_FOUND to TRUE if
27 # all listed variables are TRUE
28 INCLUDE(FindPackageHandleStandardArgs)
29 FIND_PACKAGE_HANDLE_STANDARD_ARGS(XSLTPROC DEFAULT_MSG XSLTPROC_EXECUTABLE)
30
31 MARK_AS_ADVANCED(XSLTPROC_EXECUTABLE)
32
33 set (_common_xsltproc_args
34     --stringparam use.id.as.filename 1
35     --stringparam admon.graphics 1
36     --stringparam admon.graphics.extension .svg
37     --stringparam section.autolabel 1
38     --stringparam section.label.includes.component.label 1
39     --stringparam html.stylesheet ws.css
40     )
41
42 if (WIN32 AND NOT "${CYGWIN_INSTALL_PATH}" STREQUAL "" AND ${XSLTPROC_EXECUTABLE} MATCHES "${CYGWIN_INSTALL_PATH}")
43     FIND_PROGRAM(CYGPATH_EXECUTABLE
44         NAMES cygpath
45         PATHS ${CYGWIN_INSTALL_PATH}/bin
46     )
47     # XXX Duplicate of TO_A2X_COMPATIBLE_PATH
48     MACRO( TO_XSLTPROC_COMPATIBLE_PATH _cmake_path _result )
49         execute_process(
50             COMMAND ${CYGPATH_EXECUTABLE} -u ${_cmake_path}
51             OUTPUT_VARIABLE _cygwin_path
52         )
53         # cygpath adds a linefeed.
54         string(STRIP "${_cygwin_path}" _cygwin_path)
55
56         set( ${_result} ${_cygwin_path} )
57     ENDMACRO()
58
59     TO_XSLTPROC_COMPATIBLE_PATH( ${CMAKE_CURRENT_SOURCE_DIR} _xsltproc_current_source_dir )
60     TO_XSLTPROC_COMPATIBLE_PATH( ${CMAKE_CURRENT_BINARY_DIR} _xsltproc_current_binary_dir )
61
62     set ( _xsltproc_path "${_xsltproc_current_source_dir}:${_xsltproc_current_binary_dir}:${_xsltproc_current_binary_dir}/wsluarm_src")
63 else()
64     set ( _xsltproc_path "${CMAKE_CURRENT_SOURCE_DIR}:${CMAKE_CURRENT_BINARY_DIR}:${CMAKE_CURRENT_BINARY_DIR}/wsluarm_src")
65 endif()
66
67 # Workaround for parallel build issue with msbuild.
68 # https://gitlab.kitware.com/cmake/cmake/issues/16767
69 if(CMAKE_GENERATOR MATCHES "Visual Studio")
70   # msbuild (as used by the Visual Studio generators) must not depend on the XML
71   # file (otherwise the XML file will be generated multiple times, possibly in
72   # parallel, breaking the build). Workaround: add one dependency to generate
73   # the XML file when outdated, depend on the -stamp file to ensure that the
74   # target is rebuilt when the XML file is regenerated.
75   function(get_docbook_xml_depends varname _dbk_source)
76     set(${varname}
77       "generate_${_dbk_source}"
78       "${CMAKE_CURRENT_BINARY_DIR}/${_dbk_source}-stamp"
79       PARENT_SCOPE
80     )
81   endfunction()
82 else()
83   # Unix Makefiles, Ninja, etc: first dependency enforces that the XML file is
84   # rebuilt when outdated, the second dependency ensures that the target is
85   # rebuilt when the XML file has changed.
86   function(get_docbook_xml_depends varname _dbk_source)
87     set(${varname}
88       "generate_${_dbk_source}"
89       "${_dbk_source}"
90       PARENT_SCOPE
91     )
92   endfunction()
93 endif()
94
95 # Translate XML to HTML
96 #XML2HTML(
97 #        wsug or wsdg
98 #        single-page or chunked
99 #        WSUG_FILES
100 #        WSUG_GRAPHICS
101 #)
102 MACRO(XML2HTML _target_dep _dir_pfx _mode _dbk_source _gfx_sources)
103     # We depend on the docbook target to avoid parallel builds.
104     SET(_dbk_dep ${_target_dep}_docbook)
105
106     IF(${_mode} STREQUAL "chunked")
107         SET(_basedir ${_dir_pfx}_html_chunked)
108         SET(_STYLESHEET "http://docbook.sourceforge.net/release/xsl/current/html/chunk.xsl")
109         SET(_modeparams --noout)
110     ELSE() # single-page
111         SET(_basedir ${_dir_pfx}_html)
112         SET(_STYLESHEET "http://docbook.sourceforge.net/release/xsl/current/html/docbook.xsl")
113         SET(_modeparams --output ${_basedir}/index.html)
114     ENDIF()
115
116     SET(_out_dir ${CMAKE_CURRENT_BINARY_DIR}/${_basedir})
117     SET(_output ${_basedir}/index.html)
118     get_docbook_xml_depends(_dbk_xml_deps "${_dbk_source}")
119
120     FOREACH(_tmpgfx ${${_gfx_sources}})
121         set(_gfx_deps ${CMAKE_CURRENT_SOURCE_DIR}/${_tmpgfx})
122     ENDFOREACH()
123
124 #    GET_FILENAME_COMPONENT(_GFXDIR ${_gfx} ABSOLUTE)
125 #    GET_FILENAME_COMPONENT(_GFXDIR ${_GFXDIR} PATH)
126 #    GET_FILENAME_COMPONENT(_OUTDIR ${_output} PATH)
127 #    SET(_OUTDIR ${CMAKE_CURRENT_BINARY_DIR}/${_OUTDIR})
128
129     SET(_gfx_dir ${_dir_pfx}_graphics)
130     ADD_CUSTOM_COMMAND(
131         OUTPUT
132             ${_output}
133         COMMAND ${CMAKE_COMMAND}
134             -E make_directory ${_out_dir}
135         COMMAND ${CMAKE_COMMAND}
136            -E make_directory ${_out_dir}/${_gfx_dir}/toolbar
137         COMMAND ${CMAKE_COMMAND}
138            -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/${_gfx_dir} ${_out_dir}/${_gfx_dir}
139         COMMAND ${CMAKE_COMMAND}
140            -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/common_graphics ${_out_dir}/${_gfx_dir}
141         COMMAND ${CMAKE_COMMAND}
142            -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/${_gfx_dir}/toolbar ${_out_dir}/${_gfx_dir}/toolbar
143         COMMAND ${CMAKE_COMMAND}
144             -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/ws.css ${_out_dir}
145         COMMAND ${XSLTPROC_EXECUTABLE}
146             --path "${_xsltproc_path}"
147             --stringparam base.dir ${_basedir}/
148             ${_common_xsltproc_args}
149             --stringparam admon.graphics.path ${_gfx_dir}/
150             ${_modeparams}
151             ${_STYLESHEET}
152             ${_dbk_source}
153         DEPENDS
154             ${_dbk_xml_deps}
155             ${_dbk_dep}
156             ${_gfx_deps}
157     )
158     IF(NOT WIN32)
159         ADD_CUSTOM_COMMAND(
160             OUTPUT
161                 ${_output}
162             COMMAND chmod
163                 -R og+rX ${_out_dir}
164             APPEND
165         )
166     ENDIF()
167 ENDMACRO(XML2HTML)
168
169 # Translate XML to FO to PDF
170 #XML2PDF(
171 #       user-guide-a4.fo or user-guide-us.fo
172 #       WSUG_SOURCE
173 #       custom_layer_pdf.xsl
174 #       A4 or letter
175 #)
176 MACRO(XML2PDF _target_dep _output _dbk_source _stylesheet)
177     # We depend on the docbook target to avoid parallel builds.
178     SET(_dbk_dep ${_target_dep}_docbook)
179     file(RELATIVE_PATH _img_relative_path ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR})
180     get_docbook_xml_depends(_dbk_xml_deps "${_dbk_source}")
181     ADD_CUSTOM_COMMAND(
182         OUTPUT
183             ${_output}
184             ${_output}.fo
185         COMMAND ${XSLTPROC_EXECUTABLE}
186             --path "${_xsltproc_path}"
187             --stringparam img.src.path ${_img_relative_path}/
188             --stringparam use.id.as.filename 1
189             --stringparam admon.graphics.path ${_img_relative_path}/common_graphics/
190             --nonet
191             --output ${_output}.fo
192             ${_stylesheet}
193             ${_dbk_source}
194         COMMAND ${FOP_EXECUTABLE}
195             ${_output}.fo
196             ${_output}
197         DEPENDS
198             ${_dbk_xml_deps}
199             ${_dbk_dep}
200             ${_stylesheet}
201     )
202 ENDMACRO(XML2PDF)
203
204 # Translate XML to HHP
205 #XML2HHP(
206 #       wsug or wsdg
207 #       user-guide.xml or developer-guide.xml
208 #)
209 MACRO(XML2HHP _target_dep _guide _dbk_source)
210     # We depend on the docbook target to avoid parallel builds.
211     SET(_dbk_dep ${_target_dep}_docbook)
212     GET_FILENAME_COMPONENT( _source_base_name ${_dbk_source} NAME_WE )
213     set( _output_chm ${_source_base_name}.chm )
214     set( _output_hhp ${_source_base_name}.hhp )
215     set( _output_toc_hhc ${_source_base_name}-toc.hhc )
216     set( _docbook_plain_title ${_source_base_name}-plain-title.xml )
217     get_docbook_xml_depends(_dbk_xml_deps "${_dbk_source}")
218
219     SET(_gfxdir ${_guide}_graphics)
220     SET(_basedir ${_guide}_chm)
221     ADD_CUSTOM_COMMAND(
222         OUTPUT
223             ${_output_hhp}
224             ${_output_toc_hhc}
225         COMMAND ${CMAKE_COMMAND} -E make_directory ${_basedir}
226         COMMAND ${CMAKE_COMMAND} -E make_directory ${_basedir}/${_gfxdir}
227         COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/${_gfxdir} ${_basedir}/${_gfxdir}
228         COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/common_graphics ${_basedir}/${_gfxdir}
229         # HTML Help doesn't render decimal character entities in the title.
230         COMMAND ${PERL_EXECUTABLE} -p
231             -e "s|er&#8217;s Guide</title>|er's Guide</title>|"
232             < ${_dbk_source}
233             > ${_docbook_plain_title}
234         COMMAND ${XSLTPROC_EXECUTABLE}
235             --path "${_xsltproc_path}"
236             --stringparam base.dir ${_basedir}/
237             --stringparam htmlhelp.chm ${_output_chm}
238             --stringparam htmlhelp.hhp ${_output_hhp}
239             --stringparam htmlhelp.hhc ${_output_toc_hhc}
240             ${_common_xsltproc_args}
241             --stringparam admon.graphics.path ${_gfxdir}/
242             --nonet custom_layer_chm.xsl
243             ${_docbook_plain_title}
244         DEPENDS
245             ${_dbk_xml_deps}
246             ${_dbk_dep}
247             # AsciiDoc uses UTF-8 by default, which is unsupported by HTML
248             # Help. We may want to render an ISO-8859-1 version, or get rid
249             # of HTML Help.
250             custom_layer_chm.xsl
251     )
252 ENDMACRO(XML2HHP)