1#
2# - Find XSLTPROC
3# This module looks for some usual Unix commands.
4#
5
6include(FindChocolatey)
7
8# Strawberry Perl ships with xsltproc but no DocBook XML files, which
9# is detrimental to our interests. Search for the Chocolatey
10# versions first, and un-find xsltproc if needed.
11find_program(XSLTPROC_EXECUTABLE
12  NAMES
13    xsltproc
14  HINTS
15    ${CHOCOLATEY_BIN_PATH}
16  PATHS
17    /usr/local/bin
18    /sbin
19)
20
21string(TOLOWER ${XSLTPROC_EXECUTABLE} _xe_lower)
22if(${_xe_lower} MATCHES "strawberry")
23	set(_ignore_reason "Strawberry xsltproc found at ${XSLTPROC_EXECUTABLE}. Ignoring.")
24	message(STATUS ${_ignore_reason})
25	set(XSLTPROC_EXECUTABLE XSLTPROC_EXECUTABLE-NOTFOUND CACHE FILEPATH ${_ignore_reason} FORCE)
26endif()
27
28# Handle the QUIETLY and REQUIRED arguments and set XSLTPROC_FOUND to TRUE if
29# all listed variables are TRUE
30INCLUDE(FindPackageHandleStandardArgs)
31FIND_PACKAGE_HANDLE_STANDARD_ARGS(XSLTPROC DEFAULT_MSG XSLTPROC_EXECUTABLE)
32
33MARK_AS_ADVANCED(XSLTPROC_EXECUTABLE)
34
35set (_common_xsltproc_args
36    --stringparam use.id.as.filename 1
37    --stringparam admon.graphics 1
38    --stringparam admon.graphics.extension .svg
39    --stringparam section.autolabel 1
40    --stringparam section.label.includes.component.label 1
41    --stringparam html.stylesheet ws.css
42    )
43
44set(_xsltproc_path "${CMAKE_CURRENT_SOURCE_DIR}:${CMAKE_CURRENT_BINARY_DIR}:${CMAKE_CURRENT_BINARY_DIR}/wsluarm_src")
45
46# Workaround for parallel build issue with msbuild.
47# https://gitlab.kitware.com/cmake/cmake/issues/16767
48if(CMAKE_GENERATOR MATCHES "Visual Studio")
49  # msbuild (as used by the Visual Studio generators) must not depend on the XML
50  # file (otherwise the XML file will be generated multiple times, possibly in
51  # parallel, breaking the build). Workaround: add one dependency to generate
52  # the XML file when outdated, depend on the -stamp file to ensure that the
53  # target is rebuilt when the XML file is regenerated.
54  function(get_docbook_xml_depends varname _dbk_source)
55    set(${varname}
56      "generate_${_dbk_source}"
57      "${CMAKE_CURRENT_BINARY_DIR}/${_dbk_source}-stamp"
58      PARENT_SCOPE
59    )
60  endfunction()
61else()
62  # Unix Makefiles, Ninja, etc: first dependency enforces that the XML file is
63  # rebuilt when outdated, the second dependency ensures that the target is
64  # rebuilt when the XML file has changed.
65  function(get_docbook_xml_depends varname _dbk_source)
66    set(${varname}
67      "generate_${_dbk_source}"
68      "${_dbk_source}"
69      PARENT_SCOPE
70    )
71  endfunction()
72endif()
73
74# Translate XML to HTML
75#XML2HTML(
76#        wsug or wsdg
77#        single-page or chunked
78#        WSUG_FILES
79#        WSUG_GRAPHICS
80#)
81MACRO(XML2HTML _target_dep _dir_pfx _mode _dbk_source _gfx_sources)
82    # We depend on the docbook target to avoid parallel builds.
83    SET(_dbk_dep ${_target_dep}_docbook)
84
85    # We can pass chunker.xxx parameters to customize the chunked output.
86    # We have to use a custom layer to customize the single-page output.
87    # Set the output encoding for both to UTF-8. Indent the single-page
88    # output because we sometimes need to copy and paste the release
89    # note contents.
90    IF(${_mode} STREQUAL "chunked")
91        SET(_basedir ${_dir_pfx}_html_chunked)
92        SET(_stylesheet "http://docbook.sourceforge.net/release/xsl/current/html/chunk.xsl")
93        SET(_modeparams --stringparam chunker.output.encoding UTF-8)
94    ELSE() # single-page
95        SET(_basedir ${_dir_pfx}_html)
96        SET(_stylesheet custom_layer_single_html.xsl)
97        SET(_modeparams --output ${_basedir}/index.html)
98    ENDIF()
99
100    SET(_out_dir ${CMAKE_CURRENT_BINARY_DIR}/${_basedir})
101    SET(_output ${_basedir}/index.html)
102    get_docbook_xml_depends(_dbk_xml_deps "${_dbk_source}")
103
104    FOREACH(_tmpgfx ${${_gfx_sources}})
105        set(_gfx_deps ${CMAKE_CURRENT_SOURCE_DIR}/${_tmpgfx})
106    ENDFOREACH()
107
108    SET(_gfx_dir ${_dir_pfx}_graphics)
109    ADD_CUSTOM_COMMAND(
110        OUTPUT
111            ${_output}
112        COMMAND ${CMAKE_COMMAND}
113            -E make_directory ${_out_dir}
114        COMMAND ${CMAKE_COMMAND}
115           -E make_directory ${_out_dir}/${_gfx_dir}/toolbar
116        COMMAND ${CMAKE_COMMAND}
117           -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/${_gfx_dir} ${_out_dir}/${_gfx_dir}
118        COMMAND ${CMAKE_COMMAND}
119           -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/common_graphics ${_out_dir}/${_gfx_dir}
120        COMMAND ${CMAKE_COMMAND}
121           -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/${_gfx_dir}/toolbar ${_out_dir}/${_gfx_dir}/toolbar
122        COMMAND ${CMAKE_COMMAND}
123            -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/ws.css ${_out_dir}
124        COMMAND ${XSLTPROC_EXECUTABLE}
125            --path "${_xsltproc_path}"
126            --stringparam base.dir ${_basedir}/
127            ${_common_xsltproc_args}
128            --stringparam admon.graphics.path ${_gfx_dir}/
129            ${_modeparams}
130            --noout ${_stylesheet}
131            ${_dbk_source}
132        DEPENDS
133            ${_dbk_xml_deps}
134            ${_dbk_dep}
135            ${_gfx_deps}
136            custom_layer_single_html.xsl
137    )
138    IF(NOT WIN32)
139        ADD_CUSTOM_COMMAND(
140            OUTPUT
141                ${_output}
142            COMMAND chmod
143                -R og+rX ${_out_dir}
144            APPEND
145        )
146    ENDIF()
147ENDMACRO(XML2HTML)
148