# Copyright 2015-2020 The Khronos Group Inc. # SPDX-License-Identifier: Apache-2.0 # dot is optional as missing include dependency graphs and # inheritance graphs is not a big enough deal to justify # forcing people to install Graphviz. find_package(Doxygen REQUIRED OPTIONAL_COMPONENTS dot) if(NOT DOXYGEN_DOT_EXECUTABLE) message(NOTICE "dot executable not found so Doxygen will not generate\n" "include dependency or inheritance graphs in the documentation.\n" "If you want these graphs, install Graphviz.") endif() set(docdest "${CMAKE_CURRENT_BINARY_DIR}/docs") # The torturous Doxygen output settings are a hack # to workaround a doxygen limitation where it will # only create the trailing directory of the path # given in, e.g DOXYGEN_HTML_OUTPUT while enabling # us to put each sub-document in its own directory of # the html output. # Global set( DOXYGEN_PROJECT_LOGO icons/ktx_logo_200.png ) set( DOXYGEN_OUTPUT_DIRECTORY ${docdest}/html) set( DOXYGEN_OPTIMIZE_OUTPUT_FOR_C YES ) set( DOXYGEN_EXTRACT_LOCAL_CLASSES NO ) set( DOXYGEN_HIDE_UNDOC_MEMBERS YES ) set( DOXYGEN_CASE_SENSE_NAMES YES ) set( DOXYGEN_SHOW_USED_FILES NO ) set( DOXYGEN_VERBATIM_HEADERS NO ) set( DOXYGEN_CLANG_ASSISTED_PARSING NO ) set( DOXYGEN_ALPHABETICAL_INDEX NO ) set( DOXYGEN_DISABLE_INDEX YES ) set( DOXYGEN_DISABLE_INDEX NO ) set( DOXYGEN_GENERATE_TREEVIEW YES ) set( DOXYGEN_GENERATE_LATEX NO ) set( DOXYGEN_GENERATE_HTML YES ) set( DOXYGEN_GENERATE_MAN YES ) set( DOXYGEN_MAN_OUTPUT ../man ) # This is to get timestamps with older versions of doxygen. # older set( DOXYGEN_HTML_TIMESTAMP YES ) set( DOXYGEN_TIMESTAMP YES ) function( add_sources target sources ) # Make ${sources} show up in IDE/project get_target_property( doc_sources ${target} SOURCES ) if( NOT doc_sources ) set( doc_sources "" ) # Clear doc_sources-NOTFOUND value. endif() set_target_properties( ${target} PROPERTIES SOURCES "${doc_sources};${sources}" ) endfunction() function( add_docs_cmake target ) # Make `docs.cmake` show up in IDE/project add_sources( ${target} "cmake/docs.cmake" ) endfunction() function( add_docs_cmake_plus target sources ) # Make `docs.cmake` plus ${sources} show up in IDE/project add_sources( ${target} "cmake/docs.cmake;${sources}" ) endfunction() # Note very well # # These projects and accompanying DOXYGEN_LAYOUT_FILES are carefully crafted # to provide the illusion of a consistent GUI across all the projects. # Likely this will be fragile in the face of Doxygen changes. # ktx.doc function( CreateDocLibKTX ) set( DOXYGEN_PROJECT_NAME "libktx Reference" ) set( DOXYGEN_ALIASES error=\"\\par Errors\\n\" ) set( DOXYGEN_LAYOUT_FILE pkgdoc/libktxDoxyLayout.xml ) set( DOXYGEN_TYPEDEF_HIDES_STRUCT NO ) set( DOXYGEN_EXCLUDE lib/uthash.h ) set( DOXYGEN_EXCLUDE_PATTERNS ktxint.h ) set( DOXYGEN_EXAMPLE_PATH examples lib/src ) # This does not hide the scope (class) names in the Modules list # in the ToC. See https://github.com/doxygen/doxygen/issues/9921. set( DOXYGEN_HIDE_SCOPE_NAMES YES ) set( DOXYGEN_HTML_OUTPUT libktx ) # Order is important here. '_' suffixed prefices must come first # otherwise the non-suffixed is stripped first leaving just '_'. set( DOXYGEN_IGNORE_PREFIX KTX_;ktx_;KTX;ktx ) set( DOXYGEN_MAN_LINKS YES ) set( DOXYGEN_MACRO_EXPANSION YES ) set( DOXYGEN_EXPAND_ONLY_PREDEF YES ) set( DOXYGEN_PREDEFINED KTX_DOXYGEN_SKIP KTX_FEATURE_WRITE "KTXTEXTURECLASSDEFN=class_id classId\; \\ struct ktxTexture_vtbl* vtbl\; \\ struct ktxTexture_vvtbl* vvtbl\; \\ struct ktxTexture_protected* _protected\; \\ ktx_bool_t isArray\; \\ ktx_bool_t isCubemap\; \\ ktx_bool_t isCompressed\; \\ ktx_bool_t generateMipmaps\; \\ ktx_uint32_t baseWidth\; \\ ktx_uint32_t baseHeight\; \\ ktx_uint32_t baseDepth\; \\ ktx_uint32_t numDimensions\; \\ ktx_uint32_t numLevels\; \\ ktx_uint32_t numLayers\; \\ ktx_uint32_t numFaces\; \\ struct { \\ ktxOrientationX x\; \\ ktxOrientationY y\; \\ ktxOrientationZ z\; \\ } orientation\; \\ ktxHashList kvDataHead\; \\ ktx_uint32_t kvDataLen\; \\ ktx_uint8_t* kvData\; \\ ktx_size_t dataSize\; \\ ktx_uint8_t* pData\;" ) #set( DOXYGEN_GENERATE_TAGFILE ${docdest}/libktx.tag ) doxygen_add_docs( libktx.doc lib/libktx_mainpage.md lib/include lib/src/astc_codec.cpp lib/src/basis_encode.cpp lib/src/basis_transcode.cpp lib/src/miniz_wrapper.cpp lib/src/strings.c lib/src/gl_funcs.c lib/src/glloader.c lib/src/hashlist.c lib/src/filestream.c lib/src/memstream.c lib/src/texture.c lib/src/texture1.c lib/src/texture2.c lib/src/vkloader.c lib/src/writer1.c lib/src/writer2.c ) add_docs_cmake_plus( libktx.doc pkgdoc/libktxDoxyLayout.xml ) endfunction() # ktxtools.doc function( CreateDocTools ) set( DOXYGEN_PROJECT_NAME "KTX Tools Reference" ) set( DOXYGEN_FULL_PATH_NAMES NO ) set( DOXYGEN_ALIASES author=\"\\section AUTHOR\\n\" ) set( DOXYGEN_LAYOUT_FILE pkgdoc/toolsDoxyLayout.xml ) set( DOXYGEN_SHOW_FILES NO ) set( DOXYGEN_FILE_PATTERNS *.cpp ) set( DOXYGEN_RECURSIVE YES ) set( DOXYGEN_EXAMPLE_PATH utils tools ) set( DOXYGEN_HTML_OUTPUT ktxtools ) set( DOXYGEN_MAN_EXTENSION .1 ) #set( DOXYGEN_GENERATE_TAGFILE ${docdest}/ktxtools.tag ) set( DOXYGEN_TAGFILES ${docdest}/ktxpkg.tag=.. ) doxygen_add_docs( tools.doc tools/ktx/ktx_main.cpp tools/ktx/command_compare.cpp tools/ktx/command_convert.cpp tools/ktx/command_create.cpp tools/ktx/command_deflate.cpp tools/ktx/command_encode.cpp tools/ktx/command_extract.cpp tools/ktx/command_help.cpp tools/ktx/command_info.cpp tools/ktx/command_transcode.cpp tools/ktx/command_validate.cpp ) add_docs_cmake_plus( tools.doc pkgdoc/toolsDoxyLayout.xml ) endfunction() # ktxjswrappers.doc function( CreateDocJSWrappers ) set( DOXYGEN_PROJECT_NAME "KTX Javascript Wrappers Reference" ) set( DOXYGEN_FULL_PATH_NAMES NO ) set( DOXYGEN_ALIASES author=\"\\section AUTHOR\\n\" ) set( DOXYGEN_LAYOUT_FILE pkgdoc/jswrappersDoxyLayout.xml ) set( DOXYGEN_SHOW_FILES NO ) set( DOXYGEN_HTML_OUTPUT ktxjswrappers ) #set( DOXYGEN_GENERATE_TAGFILE ${docdest}/ktxjswrappers.tag ) set( DOXYGEN_TAGFILES ${docdest}/ktxpkg.tag=.. ) doxygen_add_docs( jswrappers.doc interface/js_binding ) add_docs_cmake_plus( jswrappers.doc pkgdoc/jswrappersDoxyLayout.xml ) endfunction() # pyktxwrappers.doc function( CreateDocPyktxWrappers ) add_custom_command( TARGET libktx.doc POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_directory ${KTX_BUILD_DIR}/interface/python_binding/docs/html/pyktx/html ${KTX_BUILD_DIR}/docs/html/pyktx ) add_dependencies( libktx.doc pyktx.doc ) endfunction() # ktxpkg.doc function( CreateDocKTX ) set( DOXYGEN_PROJECT_NAME "Khronos Texture Software" ) set( DOXYGEN_ALIASES pversion=\"\\par Package Version\\n\" ) set( DOXYGEN_LAYOUT_FILE pkgdoc/packageDoxyLayout.xml ) set( DOXYGEN_EXCLUDE lib/uthash.h ) set( DOXYGEN_EXCLUDE_PATTERNS ktxint.h ) set( DOXYGEN_EXAMPLE_PATH lib/src ) set( DOXYGEN_GENERATE_TAGFILE ${docdest}/ktxpkg.tag ) set( DOXYGEN_HTML_HEADER pkgdoc/header.html ) set( DOXYGEN_HTML_OUTPUT . ) set( DOXYGEN_MAN_LINKS YES ) #set( DOXYGEN_TAGFILES ${docdest}/libktx.tag=libktx ${docdest}/ktxtools.tag=ktxtools ) doxygen_add_docs( ktxpkg.doc pkgdoc/pages.md LICENSE.md #RELEASE_NOTES.md ) add_docs_cmake_plus( ktxpkg.doc pkgdoc/packageDoxyLayout.xml ) endfunction() CreateDocLibKTX() CreateDocTools() CreateDocJSWrappers() if (KTX_FEATURE_PY) CreateDocPyktxWrappers() endif() CreateDocKTX() add_dependencies( libktx.doc ktxpkg.doc ktx_version ) add_dependencies( jswrappers.doc ktxpkg.doc ) add_dependencies( tools.doc ktxpkg.doc ) # I want to add a dependency on the "package" built-in target. # Unfortunately CMake does not support adding dependencies to # built-in targets. See https://gitlab.kitware.com/cmake/cmake/-/issues/8438. # # There also seems to be no way to add a dependency for the install commands # below. Presumably "install(TARGETS ...)" adds a dependency on each target # but the rest of that command is simply not appropriate for this case. add_custom_target( all.doc ALL DEPENDS tools.doc libktx.doc jswrappers.doc ) install( DIRECTORY ${docdest}/html DESTINATION "${CMAKE_INSTALL_DOCDIR}" COMPONENT tools ) install( DIRECTORY ${docdest}/man/man1 ## Omit those, since at the moment they contain a lot of undesired files generated by Doxygen # ${docdest}/man/man3 # ${docdest}/man/ktx/man3 DESTINATION "${CMAKE_INSTALL_MANDIR}" COMPONENT tools )