363 lines
12 KiB
CMake
363 lines
12 KiB
CMake
# Specify the list of .xml files that are used as-is
|
|
set(
|
|
DOCBOOK_SOURCES
|
|
fdl.xml
|
|
gpl.xml
|
|
igraph-docs.xml
|
|
installation.xml
|
|
introduction.xml
|
|
licenses.xml
|
|
glossary.xml
|
|
pmt.xml
|
|
tutorial.xml
|
|
)
|
|
|
|
# Specify the list of .xxml files that have to be piped through doxrox to
|
|
# obtain the final set of .xml files that serve as an input to DocBook
|
|
set(
|
|
DOXROX_SOURCES
|
|
adjlist.xxml
|
|
attributes.xxml
|
|
basicigraph.xxml
|
|
bipartite.xxml
|
|
bitset.xxml
|
|
cliques.xxml
|
|
coloring.xxml
|
|
community.xxml
|
|
cycles.xxml
|
|
dqueue.xxml
|
|
embedding.xxml
|
|
error.xxml
|
|
flows.xxml
|
|
foreign.xxml
|
|
games.xxml
|
|
generators.xxml
|
|
graphlets.xxml
|
|
heap.xxml
|
|
hrg.xxml
|
|
isomorphism.xxml
|
|
iterators.xxml
|
|
layout.xxml
|
|
linalg.xxml
|
|
matrix.xxml
|
|
memory.xxml
|
|
motifs.xxml
|
|
nongraph.xxml
|
|
operators.xxml
|
|
progress.xxml
|
|
processes.xxml
|
|
psumtree.xxml
|
|
random.xxml
|
|
separators.xxml
|
|
sparsemat.xxml
|
|
spatial.xxml
|
|
stack.xxml
|
|
status.xxml
|
|
structural.xxml
|
|
strvector.xxml
|
|
threading.xxml
|
|
vector.xxml
|
|
vectorlist.xxml
|
|
visitors.xxml
|
|
)
|
|
|
|
# Specify the igraph source files that may contain documentation chunks
|
|
file(
|
|
GLOB_RECURSE IGRAPH_SOURCES_FOR_DOXROX
|
|
LIST_DIRECTORIES FALSE
|
|
${CMAKE_SOURCE_DIR}/include/*.h
|
|
${CMAKE_BINARY_DIR}/include/*.h
|
|
${CMAKE_SOURCE_DIR}/src/*.c
|
|
${CMAKE_SOURCE_DIR}/src/*.cc
|
|
${CMAKE_SOURCE_DIR}/src/*.cpp
|
|
${CMAKE_SOURCE_DIR}/src/*.h
|
|
${CMAKE_SOURCE_DIR}/src/*.pmt
|
|
)
|
|
|
|
# Specify the igraph source files that are used as examples in the
|
|
# documentation
|
|
file(
|
|
GLOB DOCBOOK_EXAMPLES
|
|
LIST_DIRECTORIES FALSE
|
|
RELATIVE ${CMAKE_SOURCE_DIR}
|
|
${CMAKE_SOURCE_DIR}/examples/simple/*.c
|
|
${CMAKE_SOURCE_DIR}/examples/tutorial/*.c
|
|
)
|
|
|
|
# You should not need to change anything below this line if you are simply
|
|
# trying to add new files to produce documentation from
|
|
|
|
# Documentation build requires Python and source-highlight
|
|
find_package(Python3)
|
|
find_program(SOURCE_HIGHLIGHT_COMMAND source-highlight)
|
|
|
|
# HTML documentation additionally requires xmlto from DocBook
|
|
find_program(XMLTO_COMMAND xmlto)
|
|
|
|
# PDF documentation additionally requires xsltproc, xmllint and Apache FOP
|
|
find_program(FOP_COMMAND fop)
|
|
find_program(XMLLINT_COMMAND xmllint)
|
|
find_program(XSLTPROC_COMMAND xsltproc)
|
|
|
|
# GNU Texinfo documentation additionally requires the docbook2X package,
|
|
# makeinfo (and xmllint as well). The docbook2texi command from docbook2X
|
|
# is renamed to docbook2x-texi by many Linux distros to avoid conflict with
|
|
# a command of the same name from the incompatible docbook-tools package.
|
|
# We look for both command names, and prefer docbook2x-texi if found.
|
|
# At the moment we do not validate that docbook2texi is from docbook2X
|
|
# instead of docbook-tools. Such validation will be possible with CMake >= 3.25.
|
|
find_program(DOCBOOK2XTEXI_COMMAND NAMES docbook2x-texi docbook2texi)
|
|
find_program(MAKEINFO_COMMAND makeinfo)
|
|
|
|
if(Python3_FOUND AND SOURCE_HIGHLIGHT_COMMAND)
|
|
set(DOC_BUILD_SUPPORTED TRUE)
|
|
else()
|
|
set(DOC_BUILD_SUPPORTED FALSE)
|
|
endif()
|
|
|
|
if(DOC_BUILD_SUPPORTED AND XMLTO_COMMAND)
|
|
set(HTML_DOC_BUILD_SUPPORTED TRUE)
|
|
else()
|
|
set(HTML_DOC_BUILD_SUPPORTED FALSE)
|
|
endif()
|
|
|
|
if(DOC_BUILD_SUPPORTED AND XMLLINT_COMMAND AND XSLTPROC_COMMAND AND FOP_COMMAND)
|
|
set(PDF_DOC_BUILD_SUPPORTED TRUE)
|
|
else()
|
|
set(PDF_DOC_BUILD_SUPPORTED FALSE)
|
|
endif()
|
|
|
|
if(DOC_BUILD_SUPPORTED AND XMLLINT_COMMAND AND DOCBOOK2XTEXI_COMMAND AND MAKEINFO_COMMAND)
|
|
set(INFO_DOC_BUILD_SUPPORTED TRUE)
|
|
else()
|
|
set(INFO_DOC_BUILD_SUPPORTED FALSE)
|
|
endif()
|
|
|
|
if(DOC_BUILD_SUPPORTED)
|
|
set(DOXROX_COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/doxrox.py)
|
|
set(DOXROX_RULES ${CMAKE_CURRENT_SOURCE_DIR}/c-docbook.re)
|
|
set(DOXROX_CHUNKS ${CMAKE_CURRENT_BINARY_DIR}/chunks.pickle)
|
|
set(DOXROX_CACHE ${CMAKE_CURRENT_BINARY_DIR}/doxrox.cache)
|
|
|
|
set(DOCBOOK_INPUTS "")
|
|
set(DOCBOOK_GENERATED_INPUTS "")
|
|
|
|
# Specify that each DocBook .xml file is to be copied to the build folder
|
|
# TODO(ntamas): currently this works with out-of-tree builds only
|
|
set(IGRAPH_VERSION ${PACKAGE_VERSION}) # for replacement in igraph-docs.xml
|
|
foreach(DOCBOOK_SOURCE ${DOCBOOK_SOURCES})
|
|
set(DOCBOOK_INPUT "${CMAKE_CURRENT_BINARY_DIR}/${DOCBOOK_SOURCE}")
|
|
list(APPEND DOCBOOK_INPUTS "${DOCBOOK_INPUT}")
|
|
configure_file(${DOCBOOK_SOURCE} ${DOCBOOK_INPUT})
|
|
endforeach()
|
|
|
|
# Specify that .xxml files should be piped through doxrox.py to get a
|
|
# DocBook-compatible .xml file. This step inserts the documentation chunks
|
|
# extracted from the igraph source to the DocBook sources
|
|
foreach(DOXROX_SOURCE ${DOXROX_SOURCES})
|
|
string(REGEX REPLACE "[.]xxml$" ".xml" DOXROX_OUTPUT ${DOXROX_SOURCE})
|
|
set(COMMENT "Generating ${DOXROX_OUTPUT} from ${DOXROX_SOURCE}")
|
|
|
|
string(PREPEND DOXROX_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/")
|
|
list(APPEND DOCBOOK_INPUTS "${DOXROX_OUTPUT}")
|
|
list(APPEND DOCBOOK_GENERATED_INPUTS "${DOXROX_OUTPUT}")
|
|
|
|
add_custom_command(
|
|
OUTPUT ${DOXROX_OUTPUT}
|
|
COMMAND ${DOXROX_COMMAND}
|
|
ARGS
|
|
-t ${CMAKE_CURRENT_SOURCE_DIR}/${DOXROX_SOURCE}
|
|
--chunks ${DOXROX_CHUNKS}
|
|
-o ${DOXROX_OUTPUT}
|
|
MAIN_DEPENDENCY ${CMAKE_CURRENT_SOURCE_DIR}/${DOXROX_SOURCE}
|
|
DEPENDS ${DOXROX_CHUNKS}
|
|
COMMENT ${COMMENT}
|
|
)
|
|
endforeach()
|
|
|
|
# When all .xxml and .xml files have been processed, we have to send them
|
|
# through a custom Python script that extracts the ID references and produces
|
|
# a ctags-compatible "tags" file. This will then be used later by
|
|
# source-highlight to cross-reference the known tokens from the source code
|
|
# of the examples
|
|
list(JOIN DOCBOOK_GENERATED_INPUTS ";" DOCBOOK_GENERATED_INPUTS_AS_STRING)
|
|
add_custom_command(
|
|
OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/tags"
|
|
COMMAND ${CMAKE_COMMAND}
|
|
ARGS
|
|
-DINPUT_FILES="${DOCBOOK_GENERATED_INPUTS_AS_STRING}"
|
|
-DOUTPUT_FILE=${CMAKE_CURRENT_BINARY_DIR}/tags
|
|
-P ${CMAKE_SOURCE_DIR}/etc/cmake/generate_tags_file.cmake
|
|
DEPENDS ${DOCBOOK_GENERATED_INPUTS}
|
|
COMMENT "Creating tags file from DocBook xmls"
|
|
)
|
|
|
|
# Specify that each example source file is to be piped through source-higlight
|
|
# to produce an .xml representation that can be used in the DocBook
|
|
# documentation
|
|
foreach(DOCBOOK_EXAMPLE_SOURCE ${DOCBOOK_EXAMPLES})
|
|
string(REGEX REPLACE "[.]c$" ".c.xml" DOCBOOK_EXAMPLE_OUTPUT ${DOCBOOK_EXAMPLE_SOURCE})
|
|
set(COMMENT "Highlighting source code in ${DOCBOOK_EXAMPLE_SOURCE}")
|
|
|
|
set(DOCBOOK_EXAMPLE_OUTPUT "${CMAKE_BINARY_DIR}/${DOCBOOK_EXAMPLE_SOURCE}.xml")
|
|
list(APPEND DOCBOOK_INPUTS "${DOCBOOK_EXAMPLE_OUTPUT}")
|
|
|
|
get_filename_component(DOCBOOK_EXAMPLE_OUTPUT_DIR "${DOCBOOK_EXAMPLE_OUTPUT}" DIRECTORY)
|
|
|
|
add_custom_command(
|
|
OUTPUT ${DOCBOOK_EXAMPLE_OUTPUT}
|
|
COMMAND ${CMAKE_COMMAND} -E make_directory ${DOCBOOK_EXAMPLE_OUTPUT_DIR}
|
|
COMMAND ${Python3_EXECUTABLE}
|
|
ARGS
|
|
${CMAKE_SOURCE_DIR}/tools/strip_licenses_from_examples.py
|
|
${CMAKE_SOURCE_DIR}/${DOCBOOK_EXAMPLE_SOURCE}
|
|
${CMAKE_BINARY_DIR}/${DOCBOOK_EXAMPLE_SOURCE}
|
|
COMMAND ${SOURCE_HIGHLIGHT_COMMAND}
|
|
ARGS
|
|
--src-lang c
|
|
--out-format docbook
|
|
--input ${CMAKE_BINARY_DIR}/${DOCBOOK_EXAMPLE_SOURCE}
|
|
--output ${DOCBOOK_EXAMPLE_OUTPUT}
|
|
--gen-references inline
|
|
--ctags=""
|
|
--outlang-def ${CMAKE_SOURCE_DIR}/doc/docbook.outlang
|
|
MAIN_DEPENDENCY ${CMAKE_SOURCE_DIR}/${DOCBOOK_EXAMPLE_SOURCE}
|
|
DEPENDS tags
|
|
COMMENT ${COMMENT}
|
|
)
|
|
endforeach()
|
|
|
|
add_custom_command(
|
|
OUTPUT ${DOXROX_CHUNKS} ${DOXROX_CACHE}
|
|
COMMAND ${DOXROX_COMMAND}
|
|
ARGS
|
|
-e ${DOXROX_RULES}
|
|
-o ${DOXROX_CHUNKS}
|
|
--cache ${DOXROX_CACHE}
|
|
${IGRAPH_SOURCES_FOR_DOXROX}
|
|
MAIN_DEPENDENCY ${DOXROX_RULES}
|
|
DEPENDS ${IGRAPH_SOURCES_FOR_DOXROX}
|
|
COMMENT "Parsing documentation chunks from source code"
|
|
)
|
|
|
|
set(DOCXML_STAMP ${CMAKE_CURRENT_BINARY_DIR}/xmlstamp)
|
|
add_custom_command(
|
|
OUTPUT ${DOCXML_STAMP}
|
|
COMMAND ${CMAKE_COMMAND} -E touch ${DOCXML_STAMP}
|
|
MAIN_DEPENDENCY igraph-docs.xml
|
|
DEPENDS ${DOCBOOK_INPUTS}
|
|
)
|
|
add_custom_target(docxml DEPENDS ${DOCXML_STAMP})
|
|
|
|
if(HTML_DOC_BUILD_SUPPORTED)
|
|
set(HTML_STAMP ${CMAKE_CURRENT_BINARY_DIR}/html/stamp)
|
|
|
|
add_custom_command(
|
|
OUTPUT ${HTML_STAMP}
|
|
COMMAND ${XMLTO_COMMAND} -x ${CMAKE_CURRENT_SOURCE_DIR}/gtk-doc.xsl -o html xhtml igraph-docs.xml
|
|
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/html/*.css ${CMAKE_CURRENT_BINARY_DIR}/html
|
|
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/html/*.js ${CMAKE_CURRENT_BINARY_DIR}/html
|
|
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/html/*.png ${CMAKE_CURRENT_BINARY_DIR}/html
|
|
COMMAND ${CMAKE_COMMAND} -E touch ${HTML_STAMP}
|
|
MAIN_DEPENDENCY igraph-docs.xml
|
|
# The DEPENDS clause below needs to list both the xmlstamp file and the
|
|
# target that creates it. The former is needed to make Ninja rebuild the
|
|
# HTML files if the source is modified. The latter is needed to make the
|
|
# XCode build system happy.
|
|
DEPENDS ${DOCXML_STAMP} docxml
|
|
COMMENT "Generating HTML documentation with xmlto"
|
|
)
|
|
|
|
add_custom_target(html DEPENDS ${HTML_STAMP})
|
|
set(HTML_TARGET html)
|
|
endif()
|
|
|
|
add_custom_command(
|
|
OUTPUT igraph-docs-with-resolved-includes.xml
|
|
COMMAND ${XMLLINT_COMMAND}
|
|
ARGS
|
|
--xinclude
|
|
--output igraph-docs-with-resolved-includes-tmp.xml
|
|
igraph-docs.xml
|
|
COMMAND ${Python3_EXECUTABLE}
|
|
ARGS
|
|
${CMAKE_SOURCE_DIR}/tools/removeexamples.py
|
|
igraph-docs-with-resolved-includes-tmp.xml
|
|
igraph-docs-with-resolved-includes.xml
|
|
COMMAND ${CMAKE_COMMAND}
|
|
ARGS
|
|
-E remove igraph-docs-with-resolved-includes-tmp.xml
|
|
MAIN_DEPENDENCY igraph-docs.xml
|
|
# The DEPENDS clause below needs to list both the xmlstamp file and the
|
|
# target that creates it. The former is needed to make Ninja rebuild the
|
|
# PDF file if the source is modified. The latter is needed to make the
|
|
# XCode build system happy.
|
|
DEPENDS ${DOCXML_STAMP} docxml
|
|
)
|
|
|
|
# Intermediate custom target because Xcode projects cannot have commands that
|
|
# depend on intermediate files from other commands
|
|
add_custom_target(
|
|
_generate-resolved-docbook-xml DEPENDS igraph-docs-with-resolved-includes.xml
|
|
COMMENT "Resolving includes in DocBook XML source"
|
|
)
|
|
|
|
if(PDF_DOC_BUILD_SUPPORTED)
|
|
add_custom_command(
|
|
OUTPUT igraph-docs.fo
|
|
COMMAND ${XSLTPROC_COMMAND}
|
|
ARGS
|
|
--output igraph-docs.fo
|
|
--stringparam paper.type A4
|
|
http://docbook.sourceforge.net/release/xsl/current/fo/docbook.xsl
|
|
igraph-docs-with-resolved-includes.xml
|
|
DEPENDS _generate-resolved-docbook-xml
|
|
COMMENT "Converting DocBook XML to Apache FOP format"
|
|
)
|
|
|
|
add_custom_command(
|
|
OUTPUT igraph-docs.pdf
|
|
COMMAND ${FOP_COMMAND}
|
|
ARGS -fo igraph-docs.fo -pdf igraph-docs.pdf
|
|
MAIN_DEPENDENCY igraph-docs.fo
|
|
COMMENT "Generating PDF documentation with Apache FOP"
|
|
)
|
|
|
|
add_custom_target(pdf DEPENDS igraph-docs.pdf)
|
|
set(PDF_TARGET pdf)
|
|
endif()
|
|
|
|
if(INFO_DOC_BUILD_SUPPORTED)
|
|
add_custom_command(
|
|
OUTPUT igraph-docs.texi
|
|
COMMAND ${DOCBOOK2XTEXI_COMMAND}
|
|
ARGS
|
|
--encoding=utf-8//TRANSLIT
|
|
--string-param output-file=igraph-docs
|
|
--string-param directory-category=Libraries
|
|
--string-param directory-description='A fast graph library \(C\)'
|
|
igraph-docs-with-resolved-includes.xml
|
|
DEPENDS _generate-resolved-docbook-xml
|
|
COMMENT "Converting DocBook XML to GNU Texinfo format"
|
|
)
|
|
|
|
add_custom_command(
|
|
OUTPUT igraph-docs.info
|
|
COMMAND ${MAKEINFO_COMMAND}
|
|
ARGS --no-split igraph-docs.texi
|
|
MAIN_DEPENDENCY igraph-docs.texi
|
|
COMMENT "Generating info documentation with GNU Makeinfo"
|
|
)
|
|
|
|
add_custom_target(info DEPENDS igraph-docs.info)
|
|
set(INFO_TARGET info)
|
|
endif()
|
|
|
|
|
|
add_custom_target(doc DEPENDS ${HTML_TARGET} ${PDF_TARGET} ${INFO_TARGET})
|
|
endif()
|
|
|
|
set(HTML_DOC_BUILD_SUPPORTED ${HTML_DOC_BUILD_SUPPORTED} PARENT_SCOPE)
|
|
set(PDF_DOC_BUILD_SUPPORTED ${PDF_DOC_BUILD_SUPPORTED} PARENT_SCOPE)
|
|
set(INFO_DOC_BUILD_SUPPORTED ${INFO_DOC_BUILD_SUPPORTED} PARENT_SCOPE)
|