summaryrefslogtreecommitdiff
path: root/doc/CMakeLists.txt
blob: db93daecebd45e1ab7873f0f4921e5e4f48a27bb (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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
#
# api documentation
#
find_package(Doxygen)

# always check doc target
add_custom_target(doc ALL)

if(DOXYGEN_EXECUTABLE)
    option(DBUS_ENABLE_DOXYGEN_DOCS "build DOXYGEN documentation (requires Doxygen)" ON)
    add_auto_option(ENABLE_QT_HELP "build qt help documentation (requires qhelpgenerator(-qt5)); set INSTALL_QCH_DIR for custom qch installation path" AUTO)
endif()

if(DBUS_ENABLE_DOXYGEN_DOCS)
    set(top_srcdir ${PROJECT_SOURCE_DIR})
    set(top_builddir ${PROJECT_BINARY_DIR})
    if(WIN32)
        set(DBUS_GENERATE_MAN NO)
    else()
        set(DBUS_GENERATE_MAN YES)
    endif()
    if(NOT DEFINED INSTALL_QCH_DIR)
        set(INSTALL_QCH_DIR ${CMAKE_INSTALL_DATADIR}/doc/dbus)
    endif()
    find_program(QHELPGENERATOR_EXECUTABLE NAMES qhelpgenerator qhelpgenerator-qt5)
    check_auto_option(ENABLE_QT_HELP "Qt help" QHELPGENERATOR_EXECUTABLE "qhelpgenerator")
    if(ENABLE_QT_HELP AND QHELPGENERATOR_EXECUTABLE)
        message(STATUS "${QHELPGENERATOR_EXECUTABLE} found")
        set(DOXYGEN_GENERATE_QHP YES)
        set(DOXYGEN_QHG_LOCATION ${QHELPGENERATOR_EXECUTABLE})
        set(DOXYGEN_QCH_FILE ${CMAKE_CURRENT_BINARY_DIR}/api/qch/dbus-${VERSION}.qch)
        set(DBUS_ENABLE_QTHELP_DOCS ON PARENT_SCOPE)
        install(FILES ${DOXYGEN_QCH_FILE} DESTINATION ${INSTALL_QCH_DIR})
    else()
        set(DOXYGEN_GENERATE_QHP NO)
        set(DBUS_ENABLE_QTHELP_DOCS OFF PARENT_SCOPE)
    endif()
    configure_file(../Doxyfile.in ${PROJECT_BINARY_DIR}/Doxyfile )
    file(GLOB dbus_files "${PROJECT_SOURCE_DIR}/dbus/*.[ch]*")
    add_custom_command(
        OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/doxygen.stamp
        DEPENDS ${PROJECT_SOURCE_DIR}/Doxyfile.in  ${PROJECT_BINARY_DIR}/Doxyfile ${dbus_files}
        COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/api/html
        COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/api/man
        COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/api/xml
        COMMAND ${DOXYGEN_EXECUTABLE} ${PROJECT_BINARY_DIR}/Doxyfile
        COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_BINARY_DIR}/doxygen.stamp
        WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
        COMMENT "Generating API documentation with Doxygen"
    )
    add_custom_target(apidoc
        DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/doxygen.stamp
    )
    add_dependencies(doc apidoc)
    install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/api/html/ DESTINATION ${CMAKE_INSTALL_DATADIR}/doc/dbus/api)
endif()

find_program(XSLTPROC_EXECUTABLE xsltproc)
if(XSLTPROC_EXECUTABLE)
    message(STATUS "${XSLTPROC_EXECUTABLE} found")
    set(DBUS_HAVE_XSLTPROC 1)
endif()

if(DBUS_HAVE_XSLTPROC AND DBUS_ENABLE_DOXYGEN_DOCS)
    add_custom_command(
        OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/dbus.devhelp2
        COMMAND ${XSLTPROC_EXECUTABLE}
            -o ${CMAKE_CURRENT_BINARY_DIR}/dbus.devhelp2
            ${CMAKE_CURRENT_SOURCE_DIR}/doxygen_to_devhelp.xsl
            ${CMAKE_CURRENT_BINARY_DIR}/api/xml/index.xml
        DEPENDS
            ${CMAKE_CURRENT_SOURCE_DIR}/doxygen_to_devhelp.xsl
            ${CMAKE_CURRENT_BINARY_DIR}/doxygen.stamp
    )
    add_custom_target(devhelp2
        DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/dbus.devhelp2
    )
    add_dependencies(doc devhelp2)
    install(FILES ${CMAKE_CURRENT_BINARY_DIR}/dbus.devhelp2 DESTINATION ${CMAKE_INSTALL_DATADIR}/doc/dbus)
endif()

#
# docbook based documentation
# 
find_package(DocBookXSL)

if(DOCBOOKXSL_DIR AND XSLTPROC_EXECUTABLE)
    option(DBUS_ENABLE_XML_DOCS "build XML documentation" ON)
    set(DBUS_XML_DOCS_ENABLED 1)
    message(STATUS "xsltproc docbook generator found")
    add_custom_target(xmldoc)
    add_dependencies(doc xmldoc)
endif()

if(DBUS_ENABLE_XML_DOCS)

#
# generate output file from docbook xml source template or file
#
# @param _target            base name for the generated file
# @param TEMPLATE <file>    docbook xml template file to generated the output from
#                           (with '@var@' variable substitution)
# @param SOURCE <file>      alternative docbook xml file to generated the output from
#                           (without variable substitution)
# @param MAN_CATEGORY <cat> category for creating man pages (also used for html output)
# @param FORMATS <formats>  list with output formats to generate ('html' and/or 'man')
#
macro(add_docbook _target)
    set(options)
    set(oneValueArgs SOURCE TEMPLATE MAN_CATEGORY)
    set(multiValueArgs FORMATS)
    cmake_parse_arguments(ARGS "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})

    foreach(_format ${ARGS_FORMATS})
        if(ARGS_TEMPLATE)
            set(_xmlfile "${CMAKE_CURRENT_BINARY_DIR}/${_target}-${_format}.xml")
            get_filename_component(_infile ${ARGS_TEMPLATE} ABSOLUTE)
            configure_file(${_infile} ${_xmlfile})
        else()
            get_filename_component(_infile ${ARGS_SOURCE} ABSOLUTE)
            set(_xmlfile ${_infile})
        endif()
        if(${_format} STREQUAL "man")
            set(_outname "${_target}.${ARGS_MAN_CATEGORY}")
            set(STYLESHEET "${DOCBOOKXSL_DIR}/manpages/docbook.xsl")
            set(INSTALL_DIR ${CMAKE_INSTALL_DATADIR}/man/man${ARGS_MAN_CATEGORY})
        else()
            set(_outname "${_target}.${ARGS_MAN_CATEGORY}.html")
            set(STYLESHEET "${DOCBOOKXSL_DIR}/html/docbook.xsl")
            set(INSTALL_DIR ${CMAKE_INSTALL_DATADIR}/doc/dbus)
        endif()
        set(_outfile ${CMAKE_CURRENT_BINARY_DIR}/${_outname})
        add_custom_command(
            OUTPUT ${_outfile}
            COMMAND ${XSLTPROC_EXECUTABLE} --output ${_outfile} --nonet --xinclude  --param passivetex.extensions '1' --param generate.consistent.ids '1' ${STYLESHEET} ${_xmlfile}
            DEPENDS ${XSLTPROC_EXECUTABLE} ${_xmlfile}
            WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
        )
        add_custom_target(xmldoc-${_outname} DEPENDS ${_outfile})
        add_dependencies(xmldoc xmldoc-${_outname})
        install(FILES ${_outfile} DESTINATION ${INSTALL_DIR})
    endforeach()
endmacro()

### copy tests to builddir so that generated tests and static tests 
### are all in one place.
### todo how to add more filetypes 
macro(COPYDIR _src _type)
    foreach(FILE_TYPE ${_type})
        foreach(DIR ${_src})
            file(GLOB FILES "${DIR}/${FILE_TYPE}" )
            file(MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/${DIR})
            foreach(FILE ${FILES})
                get_filename_component(FILENAME ${FILE} NAME)
                set(TARGET ${PROJECT_BINARY_DIR}/${DIR}/${FILENAME})
                configure_file(${FILE} ${TARGET} COPYONLY)
                if(CONFIG_VERBOSE)
                    message("FROM: ${FILE}\nTO: ${TARGET}\n")
                endif()
            endforeach()
        endforeach()
    endforeach()
endmacro()

# copy source files from doc directory into associated binary directory
# which is required to run generated xml docs from build directory
COPYDIR(doc *.png)
COPYDIR(doc *.svg)

# setup variables used in docbook templates
set(EXPANDED_SYSCONFDIR ${CMAKE_INSTALL_FULL_SYSCONFDIR})
set(EXPANDED_DATADIR ${CMAKE_INSTALL_FULL_DATADIR})

set(formats html)
if(UNIX)
    list(APPEND formats man)
endif()
# generate docbook output
add_docbook(dbus-cleanup-sockets TEMPLATE dbus-cleanup-sockets.1.xml.in MAN_CATEGORY 1 FORMATS ${formats})
add_docbook(dbus-daemon TEMPLATE dbus-daemon.1.xml.in MAN_CATEGORY 1 FORMATS ${formats})
add_docbook(dbus-launch TEMPLATE dbus-launch.1.xml.in MAN_CATEGORY 1 FORMATS ${formats})
add_docbook(dbus-monitor TEMPLATE dbus-monitor.1.xml.in MAN_CATEGORY 1 FORMATS ${formats})
add_docbook(dbus-run-session TEMPLATE dbus-run-session.1.xml.in MAN_CATEGORY 1 FORMATS ${formats})
add_docbook(dbus-send TEMPLATE dbus-send.1.xml.in MAN_CATEGORY 1 FORMATS ${formats})
add_docbook(dbus-test-tool TEMPLATE dbus-test-tool.1.xml.in MAN_CATEGORY 1 FORMATS ${formats})
add_docbook(dbus-uuidgen TEMPLATE dbus-uuidgen.1.xml.in MAN_CATEGORY 1 FORMATS ${formats})
add_docbook(dbus-update-activation-environment TEMPLATE dbus-update-activation-environment.1.xml.in MAN_CATEGORY 1 FORMATS ${formats})

#
# handle html index file
#
configure_file(index.html.in ${CMAKE_CURRENT_BINARY_DIR}/index.html)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/index.html DESTINATION ${CMAKE_INSTALL_DATADIR}/doc/dbus)

#
# misc files
#
set(DTD_DATA
    diagram.png
    diagram.svg
)

install(FILES ${DTD_DATA} DESTINATION ${CMAKE_INSTALL_DATADIR}/doc/dbus)

set(DOC_DATA
    system-activation.txt
)

install(FILES ${DOC_DATA} DESTINATION ${CMAKE_INSTALL_DATADIR}/doc/dbus)

set(DBUS_DTD_DIR "${CMAKE_INSTALL_DATADIR}/xml/dbus-1" CACHE STRING  "Directory for installing DTD files")
set(DBUS_XML_CATALOG_DIR "${DBUS_DTD_DIR}" CACHE STRING  "Directory for installing XML catalog file")

set(EXTRA_DIST
    busconfig.dtd
    introspect.dtd
    introspect.xsl
)

install(FILES ${EXTRA_DIST} DESTINATION ${DBUS_DTD_DIR})

configure_file(
  "${CMAKE_CURRENT_SOURCE_DIR}/catalog.xml.in"
  "${CMAKE_CURRENT_BINARY_DIR}/catalog.xml"
  @ONLY)

install(FILES "${CMAKE_CURRENT_BINARY_DIR}/catalog.xml" DESTINATION ${DBUS_XML_CATALOG_DIR})

endif()