if(DOXYGEN_FOUND)
  set(abs_top_srcdir ${CMAKE_CURRENT_SOURCE_DIR}/..)
  set(DOT dot)
  set(PACKAGE_VERSION mainline)
  set(abs_top_builddir ..)
  llvm_configure_doxygen()

  add_custom_target(lldb-cpp-doc
    ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/doxygen.cfg
    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
    COMMENT "Generating LLDB C++ API reference with Doxygen" VERBATIM
  )
  set_target_properties(lldb-cpp-doc PROPERTIES FOLDER "LLDB/Docs")
endif()

if (LLVM_ENABLE_SPHINX)
  include(AddSphinxTarget)
endif()

if (LLDB_ENABLE_PYTHON AND SPHINX_FOUND)
  if (${SPHINX_OUTPUT_HTML})
    # Pretend that the SWIG generated API is a Python package.
    file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/lldb)
    get_target_property(lldb_bindings_dir swig_wrapper_python BINARY_DIR)
    add_custom_target(lldb-python-doc-package
      COMMAND "${CMAKE_COMMAND}" -E copy "${lldb_bindings_dir}/lldb.py" "${CMAKE_CURRENT_BINARY_DIR}/lldb/__init__.py"
      COMMAND "${CMAKE_COMMAND}" -E make_directory "${CMAKE_CURRENT_BINARY_DIR}/lldb/plugins"
      COMMAND "${CMAKE_COMMAND}" -E copy "${LLDB_SOURCE_DIR}/examples/python/templates/scripted_frame_provider.py" "${CMAKE_CURRENT_BINARY_DIR}/lldb/plugins/"
      COMMAND "${CMAKE_COMMAND}" -E copy "${LLDB_SOURCE_DIR}/examples/python/templates/scripted_process.py" "${CMAKE_CURRENT_BINARY_DIR}/lldb/plugins/"
      COMMAND "${CMAKE_COMMAND}" -E copy "${LLDB_SOURCE_DIR}/examples/python/templates/scripted_platform.py" "${CMAKE_CURRENT_BINARY_DIR}/lldb/plugins/"
      COMMAND "${CMAKE_COMMAND}" -E copy "${LLDB_SOURCE_DIR}/examples/python/templates/operating_system.py" "${CMAKE_CURRENT_BINARY_DIR}/lldb/plugins/"
      COMMAND "${CMAKE_COMMAND}" -E copy "${LLDB_SOURCE_DIR}/examples/python/templates/scripted_thread_plan.py" "${CMAKE_CURRENT_BINARY_DIR}/lldb/plugins/"
      COMMAND "${CMAKE_COMMAND}" -E copy "${LLDB_SOURCE_DIR}/examples/python/templates/scripted_breakpoint.py" "${CMAKE_CURRENT_BINARY_DIR}/lldb/plugins/"
      COMMAND "${CMAKE_COMMAND}" -E copy "${LLDB_SOURCE_DIR}/examples/python/templates/scripted_hook.py" "${CMAKE_CURRENT_BINARY_DIR}/lldb/plugins/"
      COMMENT "Copying lldb.py to pretend its a Python package.")

    add_dependencies(lldb-python-doc-package swig_wrapper_python)

    get_property(LLDB_ALL_DOC_JSON_FILES GLOBAL PROPERTY LLDB_DOCS_JSON_OUTPUTS)
    add_custom_command(
      OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/generated-settings.md"
      COMMAND 
        "${Python3_EXECUTABLE}"
        "${LLDB_SOURCE_DIR}/scripts/gen-property-docs-from-json.py"
        -o
        "${CMAKE_CURRENT_BINARY_DIR}/generated-settings.md"
        --
        ${LLDB_ALL_DOC_JSON_FILES}
      DEPENDS
        ${LLDB_ALL_DOC_JSON_FILES}
        "${LLDB_SOURCE_DIR}/scripts/gen-property-docs-from-json.py"
    )
    add_custom_target(LLDBDocsSettingsMd DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/generated-settings.md")

    add_custom_command(
      OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/generated-python-api-enums.md"
      COMMAND
        "${Python3_EXECUTABLE}"
        "${LLDB_SOURCE_DIR}/scripts/gen-python-api-enums.py"
        --enumerations
        "${LLDB_SOURCE_DIR}/include/lldb/lldb-enumerations.h"
        --defines
        "${LLDB_SOURCE_DIR}/include/lldb/lldb-defines.h"
        -o
        "${CMAKE_CURRENT_BINARY_DIR}/generated-python-api-enums.md"
      DEPENDS
        "${LLDB_SOURCE_DIR}/include/lldb/lldb-enumerations.h"
        "${LLDB_SOURCE_DIR}/include/lldb/lldb-defines.h"
        "${LLDB_SOURCE_DIR}/scripts/gen-python-api-enums.py"
    )
    add_custom_target(LLDBDocsEnumsMd DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/generated-python-api-enums.md")

    # FIXME: Don't treat Sphinx warnings as errors. The files generated by
    # automodapi are full of warnings (partly caused by SWIG, our documentation
    # and probably also automodapi itself), so those warnings need to be fixed
    # first before we can turn this on.
    set(SPHINX_WARNINGS_AS_ERRORS Off)

    # The sphinx config needs to know where the generated LLDB Python module is.
    # There is no way to pass a variable into our sphinx config, so just pass
    # the path to the module via the LLDB_SWIG_MODULE environment variable.
    add_sphinx_target(html lldb
      ENV_VARS
        "LLDB_SWIG_MODULE=${CMAKE_CURRENT_BINARY_DIR}"
        "LLDB_BUILD_DIR=${CMAKE_CURRENT_BINARY_DIR}"
      )
    # Sphinx does not reliably update the custom CSS files, so force
    # a clean rebuild of the documentation every time.
    add_custom_target(clean-lldb-html COMMAND "${CMAKE_COMMAND}" -E
      remove_directory ${CMAKE_CURRENT_BINARY_DIR}/html)
    add_dependencies(docs-lldb-html swig_wrapper_python
                     lldb-python-doc-package clean-lldb-html LLDBDocsSettingsMd
                     LLDBDocsEnumsMd)
  endif()

  if (${SPHINX_OUTPUT_MAN})
    add_sphinx_target(man lldb)
  endif()
endif()
