# ------------------------------------------------------------------------------
# MADlib Documentation
# ------------------------------------------------------------------------------

set(_DOXYGEN_INPUT_USER
    "\"${CMAKE_SOURCE_DIR}/doc/mainpage.dox\""
    "\"${CMAKE_SOURCE_DIR}/src/modules\""
    "\"${CMAKE_SOURCE_DIR}/src/ports\""
    "\"${CMAKE_SOURCE_DIR}/src/utils\""
    "\"${CMAKE_SOURCE_DIR}/methods\""
)
join_strings(DOXYGEN_INPUT_USER " " "${_DOXYGEN_INPUT_USER}")

set(_DOXYGEN_INPUT_DEVELOPER
    "\"${CMAKE_SOURCE_DIR}/src/dbal/dbal.hpp\""
    ${_DOXYGEN_INPUT_USER}
)
join_strings(DOXYGEN_INPUT_DEVELOPER " " "${_DOXYGEN_INPUT_DEVELOPER}")

set(DOXYGEN_USE_MATHJAX NO CACHE BOOL "In user documentation, render LaTeX formulas using MathJax")
set(DOXYGEN_INCLUDE_PATH "\"${CMAKE_SOURCE_DIR}/src\" \"${CMAKE_SOURCE_DIR}/src/ports/linux\"")

# Note: Type PATH implies that the value is either a relative path to
# ${CMAKE_CURRENT_BINARY_DIR} (and CMake generates the full path) or as an
# absolute path. Therefore, paths not relative to ${CMAKE_CURRENT_BINARY_DIR}
# must be of type STRING!

set(MATHJAX_INSTALLATION "../third_party/downloads/mathjax" CACHE PATH
    "Path to MathJax installation (used to clone MathJax repository; absolute or relative to \${CMAKE_BINARY_DIR}/doc)"
)
set(DOXYGEN_MATHJAX_RELPATH "../../../third_party/downloads/mathjax" CACHE STRING
    "Path to MathJax installation (used by Doxygen; absolute or relative to \${DOXYGEN_HTML_OUTPUT})"
)
set(DOXYGEN_OUTPUT_DEVELOPER developer CACHE PATH
    "Base path where the documentation generated by Doxygen will be put (abolsute or relative to \${CMAKE_BINARY_DIR}/doc)"
)
set(DOXYGEN_OUTPUT_USER user CACHE PATH
    "Base path where the documentation generated by Doxygen will be put (abolsute or relative to \${CMAKE_BINARY_DIR}/doc)"
)
set(DOXYGEN_HTML_OUTPUT html CACHE STRING
    "Path (relative to \${DOXYGEN_OUTPUT_<config>} where HTML docs will be put."
)


# -- Build doxysql (the SQL parser) using flex and bison -----------------------

find_package(FLEX 2.5.33)
find_package(BISON 2.4)
find_package(Doxygen)

if(FLEX_FOUND AND BISON_FOUND AND DOXYGEN_FOUND)
    # The FindFLEX module by cmake unfortunately does not cover the
    # case when FlexLexer.h is in a non-standard location.
    get_dir_name(_FLEX_BASE "${FLEX_EXECUTABLE}")
    get_dir_name(_FLEX_BASE "${_FLEX_BASE}")
    find_path(_FLEX_INCLUDE_DIR
        NAMES "FlexLexer.h"
        HINTS "${_FLEX_BASE}/include"
    )
    if(_FLEX_INCLUDE_DIR)
        include_directories(BEFORE "${_FLEX_INCLUDE_DIR}")
    endif(_FLEX_INCLUDE_DIR)

    BISON_TARGET(doxysqlParser src/sql.yy ${CMAKE_CURRENT_BINARY_DIR}/sql.parser.cc)
    FLEX_TARGET(doxysqlScanner src/sql.ll ${CMAKE_CURRENT_BINARY_DIR}/sql.scanner.cc)
    ADD_FLEX_BISON_DEPENDENCY(doxysqlScanner doxysqlParser)

    include_directories(${CMAKE_CURRENT_BINARY_DIR})
    add_executable(doxysql ${BISON_doxysqlParser_OUTPUTS}
        ${FLEX_doxysqlScanner_OUTPUTS})
    set_target_properties(doxysql PROPERTIES
        RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/bin")


# -- Copy executable and configuration files -----------------------------------

    add_subdirectory(bin)
    add_subdirectory(etc)



# -- Update MathJax ------------------------------------------------------------

    add_custom_target(update_mathjax
        COMMAND bin/update_mathjax.sh
        WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
    )
    if(USE_MATHJAX)
        set(_MATHJAX_DEPENDENCY_USER update_mathjax)
    endif(USE_MATHJAX)
    
    
# -- Run doxygen ---------------------------------------------------------------

    set(_DOXYGEN_UNNEEDED_WARNINGS_FILTER egrep -v
        "warning:.*\\(@param is not found in the argument list.*kwargs\\)\$|The following parameters.*kwargs\\) are not documented\\)|parameter 'kwargs'\$")

    add_custom_target(doc
        COMMAND ${DOXYGEN_EXECUTABLE} etc/user.doxyfile | ${_DOXYGEN_UNNEEDED_WARNINGS_FILTER}
        WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
        DEPENDS doxysql doxyBinFiles doxygen_css ${_MATHJAX_DEPENDENCY_USER}
        COMMENT "Generating user-level documentation..."
        VERBATIM
    )
    
    add_custom_target(devdoc
        COMMAND ${DOXYGEN_EXECUTABLE} etc/developer.doxyfile | ${_DOXYGEN_UNNEEDED_WARNINGS_FILTER}
        WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
        DEPENDS doxysql doxyBinFiles doxygen_css update_mathjax
        COMMENT "Generating developer documentation..."
        VERBATIM
    )
    
# -- Install doc/user/html output directory to doc/html ------------------------

    # We specify OPTIONAL, which means it will not be an error if the user
    # documentation does not exist
    install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/user/html
        DESTINATION doc
        OPTIONAL
        COMPONENT doc
        PATTERN ".DS_Store" EXCLUDE 
    )


# -- Notify user if we could not run doxygen

else(FLEX_FOUND AND BISON_FOUND AND DOXYGEN_FOUND)
    message(STATUS "Could not find recent versions of at least one of flex, "
        "bison, doxygen, or dot (part of graphviz, needed for doxygen). "
        "Documentation will not be built.")
endif(FLEX_FOUND AND BISON_FOUND AND DOXYGEN_FOUND)
