project(SlicerRt_documentation)

#set(CMAKE_VERBOSE_MAKEFILE ON) # set to ON for debugging; or rather use --verbose when calling cmake
cmake_minimum_required(VERSION 3.10)
if(CMAKE_VERSION VERSION_LESS 3.21)
    get_directory_property(hasParent PARENT_DIRECTORY)
    if(hasParent)
        set(builtin_docu ON)
    else()
        set(builtin_docu OFF)
    endif()
else()
    if(PROJECT_IS_TOP_LEVEL)
      set(builtin_docu OFF)
    else()
      set(builtin_docu ON)
    endif()
endif()

if(builtin_docu)
  message(STATUS "SlicerRt HTML documentation will be built with doxygen as a step of the SlicerRt build.")
  # TODO: https://stackoverflow.com/questions/16408060/how-do-i-add-a-dependency-on-a-script-to-a-target-in-cmake
else()
  message(STATUS "SlicerRt HTML documentation will be built with doxygen as a standalone.")
  # A typical way is:
  # cd /tmp/ && mkdir builddocu && cd builddocu  cmake -B./ -S/opt/SlicerRt/Docs/ -DDOCU_LOCATION=/tmp/docoutput -DDOCU_THREADS=8 -DDOCU_LOGFILE=/tmp/warnings.txt -DDOXYGEN_EXECUTABLE=/opt/doxygen/build/bin/doxygen -DDOCU_QHG_LOCATION=qhelpgenerator-qt5
endif()

if(NOT DOXYGEN_EXECUTABLE)
    set(DOXYGEN_EXECUTABLE "doxygen")
endif()
set(DOXYGEN_EXECUTABLE ${DOXYGEN_EXECUTABLE} CACHE STRING "Path to custom doxygen executable") # Use e.g. -DDOXYGEN_EXECUTABLE=/opt/doxygen/build/bin/doxygen for a local built doxygen. Leave empty for system-wide doxygen.
#list(APPEND CMAKE_MODULE_PATH "/opt/doxygen") # Uncomment this if you have a custom installation of Doxygen in /opt/
find_package(Doxygen 1.9.1 REQUIRED dot) # OPTIONAL_COMPONENTS dot

if(builtin_docu)
    set (SLICERRT_GIT_VERSION ${SLICERRT_VERSION})
else()
if(GIT_DESCRIBE_ALL)
    set (SLICERRT_GIT_VERSION ${GIT_DESCRIBE_ALL})
else()
    message(STATUS "Cannot determine git tag.")
endif()
endif()

#execute_process(COMMAND find ../ -type d -name dictpch -prune -o -type d -name inc OUTPUT_VARIABLE INC_FOLDERS OUTPUT_STRIP_TRAILING_WHITESPACE WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
#string(REPLACE "\n" ";" INC_FOLDERS ${INC_FOLDERS})
#list(APPEND INC_FOLDERS ../xxx/include)#different pattern


set (DOCU_QHG_LOCATION qhelpgenerator CACHE STRING "Path to qhelpgenerator")
#Pass instead -DDOCU_QHG_LOCATION=/usr/lib/x86_64-linux-gnu/qt4/bin/qhelpgenerator if qt4dev-tools or qt5/ if qt5-assistant
#Pass instead -DDOCU_QHG_LOCATION=/opt/Qt/5.15.2/gcc_64/bin/qhelpgenerator e.g. if custom installation
#or qhelpgenerator-qt5
set (DOCU_LOCATION $ENV{HOME}/SlicerRT_doc CACHE STRING "Documentation output directory")
#Pass instead e.g. -DDOCU_LOCATION=/tmp/SlicerRT_doc if system-wide installation
set (DOCU_THREADS 0 CACHE STRING "Number of threads for building the documentation (use 0 for maximum threads, N for specific number)")
set (DOCU_LOGFILE "" CACHE STRING "File where to write warnings to (leave empty for printing into console)")

find_program(QHELPGENERATOR "qhelpgenerator")
if(QHELPGENERATOR)
    message(STATUS "Doxygen QCH file will be built with ${DOCU_QHG_LOCATION}")
else()
    message(WARNING "Doxygen QCH file cannot be generated, no valid qhelpgenerator was found")
endif()

# TODO run -x_noenv to see what's missing
set (DOCU_INPUT ../
     CACHE STRING "Doxyfile input files or folders")

set(DOXYGEN_OUTPUT_DIRECTORY       "${DOCU_LOCATION}")
set(DOXYGEN_PROJECT_NAME           "SlicerRT")
set(DOXYGEN_PROJECT_NUMBER         "${SLICERRT_GIT_VERSION}")
set(DOXYGEN_PROJECT_BRIEF          "Code Documentation")
#set(DOXYGEN_PROJECT_LOGO           "logo.gif")
set(DOXYGEN_ALWAYS_DETAILED_SEC    YES)
set(DOXYGEN_JAVADOC_AUTOBRIEF      YES)
set(DOXYGEN_QT_AUTOBRIEF           YES)
set(DOXYGEN_TAB_SIZE               2)
#set(DOXYGEN_EXTENSION_MAPPING      h=C++ icc=C++ def=C++ pyzdoc=C++ cu=C++ cuh=C++)
set(DOXYGEN_TOC_INCLUDE_HEADINGS   3)
set(DOXYGEN_BUILTIN_STL_SUPPORT    YES)
set(DOXYGEN_LOOKUP_CACHE_SIZE      4)
set(DOXYGEN_EXTRACT_ALL            YES)
set(DOXYGEN_EXTRACT_PRIVATE        YES)
set(DOXYGEN_EXTRACT_STATIC         YES)
#set(DOXYGEN_EXTRACT_ANON_NSPACES   YES)
set(DOXYGEN_HIDE_IN_BODY_DOCS      YES)
set(DOXYGEN_CASE_SENSE_NAMES       YES) # default value is system dependent, so need to set this !
set(DOXYGEN_WARN_NO_PARAMDOC       NO) # If you set this to yes for finding all missing documentation, you need to set EXTRACT_ALL to false, see https://github.com/doxygen/doxygen/issues/880
set(DOXYGEN_SORT_BRIEF_DOCS        YES)
set(DOXYGEN_SORT_MEMBERS_CTORS_1ST YES)
set(DOXYGEN_GENERATE_TODOLIST      NO)
set(DOXYGEN_GENERATE_BUGLIST       NO)
#set(DOXYGEN_LAYOUT_FILE            DoxygenLayout.xml)
set(DOXYGEN_WARN_LOGFILE           ${DOCU_LOGFILE})
set(DOXYGEN_WARN_LINE_FORMAT       "$file:$line")
#set(DOXYGEN_FILE_PATTERNS          *.c *.C *.cc *.cpp *.cxx *.def *.dox *.f *.h *.hh *.hpp *.hxx *.icc *.inc *.inl *.js *.m *.md *.mm *.py *.pyzdoc)
set(DOXYGEN_RECURSIVE YES)
#set(DOXYGEN_EXCLUDE_PATTERNS       )
set(DOXYGEN_SOURCE_BROWSER         YES)
set(DOXYGEN_STRIP_CODE_COMMENTS    NO)
set(DOXYGEN_HTML_TIMESTAMP         YES)
if(QHELPGENERATOR)
set(DOXYGEN_GENERATE_QHP           YES)
set(DOXYGEN_QCH_FILE               "SlicerRT.qch")
set(DOXYGEN_QHP_NAMESPACE          Slicer.SlicerRT)
set(DOXYGEN_QHG_LOCATION           "${DOCU_QHG_LOCATION}")
set(DOXYGEN_QHP_VIRTUAL_FOLDER     "SlicerRTdoc")
endif()
set(DOXYGEN_DISABLE_INDEX          YES)
set(DOXYGEN_GENERATE_TREEVIEW      YES)
set(DOXYGEN_USE_MATHJAX            YES)
#set(DOXYGEN_MATHJAX_RELPATH        ../mathjax)
#set(DOXYGEN_MATHJAX_VERSION        MathJax_3)
set(DOXYGEN_GENERATE_LATEX         NO)
#set(DOXYGEN_LATEX_CMD_NAME        latex)
set(DOXYGEN_MACRO_EXPANSION        YES)
set(DOXYGEN_SKIP_FUNCTION_MACROS   NO)
#set(DOXYGEN_EXPAND_ONLY_PREDEF    YES)
#set(DOXYGEN_SEARCH_INCLUDES       NO)
set(DOXYGEN_PREDEFINED             "")
#set(DOXYGEN_INCLUDE_PATH           "${INC_FOLDERS}")
set(DOXYGEN_STRIP_FROM_PATH        "${DOCU_LOCATION}" "../../")
#set(DOXYGEN_STRIP_FROM_INC_PATH    "${INC_FOLDERS}")
set(DOXYGEN_GENERATE_TAGFILE       "${DOCU_LOCATION}/html/SlicerRT.tag")
set(DOXYGEN_HIDE_UNDOC_RELATIONS   NO)
set(DOXYGEN_HAVE_DOT               YES) # set to NO for getting faster results when debugging
set(DOXYGEN_DOT_MULTI_TARGETS      YES)
set(DOXYGEN_DOT_NUM_THREADS        ${DOCU_THREADS})
set(DOXYGEN_NUM_PROC_THREADS       ${DOCU_THREADS})
set(DOXYGEN_GROUP_GRAPHS           NO)
set(DOXYGEN_DOT_IMAGE_FORMAT       svg)
set(DOXYGEN_INTERACTIVE_SVG        YES)
set(DOXYGEN_DOT_GRAPH_MAX_NODES    200)
#set(DOXYGEN_ENABLED_SECTIONS       HIDDEN_SYMBOLS) # uncomment this to also show in the HTML the internal documentation inteded only for SlicerRT developers
#set(DOXYGEN_CLANG_ASSISTED_PARSING YES)

#TODO: if(NOT GRAPHVIZ_FOUND) set(gvizveto...)

doxygen_add_docs(dox ALL
  ${DOCU_INPUT}
  #ALLOW_DUPLICATE_CUSTOM_TARGETS
  #USE_STAMP_FILE
  COMMENT "Generating doxygen documentation for ${PROJECT_NAME}"
)

if(COMMAND ${DOCU_QHG_LOCATION})
add_custom_target(Zipping ALL
    COMMAND gzip -f ${DOCU_LOCATION}/html/SlicerRT.tag
    COMMAND gzip -f ${DOCU_LOCATION}/html/SlicerRT.qch
)
add_dependencies(Zipping dox)
endif()

set_property(
  TARGET dox
  APPEND
  PROPERTY ADDITIONAL_CLEAN_FILES Doxyfile.dox filter
)

