Contents

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

set(DOXYGEN_README_FILE "../ReadMe.txt" CACHE STRING
    "Path to ReadMe file relative to the doc directory after installation")
set(DOXYGEN_LICENSE_DIR "../../license" CACHE STRING
    "Path to license directory relative to the doc directory after installation")
configure_file(
    mainpage.dox.in
    "${CMAKE_CURRENT_BINARY_DIR}/mainpage.dox"
    @ONLY
)
set(_DOXYGEN_INPUT_USER
    "\"${CMAKE_CURRENT_BINARY_DIR}/mainpage.dox\""
    "\"${CMAKE_SOURCE_DIR}/src/dbal\""
    "\"${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/ports/postgres/dbconnector/main.cpp\""
    ${_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/postgres\"")

# 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/etc)"
)
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/etc)"
)
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} user.doxyfile | ${_DOXYGEN_UNNEEDED_WARNINGS_FILTER}
        WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/etc"
        DEPENDS doxysql doxyBinFiles doxygen_css ${_MATHJAX_DEPENDENCY_USER}
        COMMENT "Generating user-level documentation..."
        VERBATIM
    )
    
    add_custom_target(devdoc
        COMMAND ${DOXYGEN_EXECUTABLE} developer.doxyfile | ${_DOXYGEN_UNNEEDED_WARNINGS_FILTER}
        WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/etc"
        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)