# - Run Doxygen
#
# Adds a doxygen target that runs doxygen to generate the html
# and optionally the LaTeX API documentation.
# The doxygen target is added to the doc target as dependency.
# i.e.: the API documentation is built with:
#  make doc
#
# USAGE: INCLUDE IN PROJECT
#
#  set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR})
#  include(UseDoxygen)
# Add the Doxyfile.in and UseDoxygen.cmake files to the projects source directory.
#
#
# Variables you may define are:
#  DOXYFILE_OUTPUT_DIR - Path where the Doxygen output is stored. Defaults to "doc".
#
#  DOXYFILE_LATEX_DIR - Directory where the Doxygen LaTeX output is stored. Defaults to "latex".
#
#  DOXYFILE_HTML_DIR - Directory where the Doxygen html output is stored. Defaults to "html".
#

#
#  Copyright (c) 2009-2010 Tobias Rautenkranz <tobias@rautenkranz.ch>
#  Copyright (c) 2010      Andreas Schneider <mail@cynapses.org>
#
#  Redistribution and use is allowed according to the terms of the New
#  BSD license.
#  For details see the accompanying COPYING-CMAKE-SCRIPTS file.
#

macro(usedoxygen_set_default name value)
    if(NOT DEFINED "${name}")
        set("${name}" "${value}")
    endif()
endmacro()

find_package(Doxygen)

if(DOXYGEN_FOUND)
    find_file(DOXYFILE_IN
        NAMES
            doxy.config.in
        PATHS
            ${CMAKE_CURRENT_SOURCE_DIR}
            ${CMAKE_ROOT}/Modules/
        NO_DEFAULT_PATH)
    include(FindPackageHandleStandardArgs)
    find_package_handle_standard_args(DOXYFILE_IN DEFAULT_MSG "DOXYFILE_IN")
endif()

if(DOXYGEN_FOUND AND DOXYFILE_IN_FOUND)
    add_custom_target(doxygen ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/doxy.config)

    usedoxygen_set_default(DOXYFILE_OUTPUT_DIR "${CMAKE_CURRENT_BINARY_DIR}")
    usedoxygen_set_default(DOXYFILE_HTML_DIR "html")

    set_property(DIRECTORY APPEND PROPERTY
            ADDITIONAL_MAKE_CLEAN_FILES "${DOXYFILE_OUTPUT_DIR}/${DOXYFILE_HTML_DIR}")

    set(DOXYFILE_LATEX FALSE)
    set(DOXYFILE_PDFLATEX FALSE)
    set(DOXYFILE_DOT FALSE)

    #find_package(LATEX)
    #if(LATEX_COMPILER AND MAKEINDEX_COMPILER)
    #    set(DOXYFILE_LATEX TRUE)
    #    usedoxygen_set_default(DOXYFILE_LATEX_DIR "latex")

    #    set_property(DIRECTORY APPEND PROPERTY
    #            ADDITIONAL_MAKE_CLEAN_FILES
    #            "${DOXYFILE_OUTPUT_DIR}/${DOXYFILE_LATEX_DIR}")

    #    if(PDFLATEX_COMPILER)
    #        set(DOXYFILE_PDFLATEX TRUE)
    #    endif()
    #    if(DOXYGEN_DOT_EXECUTABLE)
    #        set(DOXYFILE_DOT TRUE)
    #    endif()

    #    add_custom_command(TARGET doxygen
    #        POST_BUILD
    #        COMMAND ${CMAKE_MAKE_PROGRAM}
    #        WORKING_DIRECTORY "${DOXYFILE_OUTPUT_DIR}/${DOXYFILE_LATEX_DIR}")
    #endif()

    configure_file(${DOXYFILE_IN} ${CMAKE_CURRENT_BINARY_DIR}/doxy.config ESCAPE_QUOTES IMMEDIATE @ONLY)
    if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/doxy.trac.in)
        configure_file(${CMAKE_CURRENT_SOURCE_DIR}/doxy.trac.in ${CMAKE_CURRENT_BINARY_DIR}/doxy.trac ESCAPE_QUOTES IMMEDIATE @ONLY)
        add_custom_target(doxygen-trac ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/doxy.trac)
    endif()

    get_target_property(DOC_TARGET doc TYPE)
    if(NOT DOC_TARGET)
        add_custom_target(doc)
    endif()

    add_dependencies(doc doxygen)
endif()
