
find_package(Doxygen)
if (DOXYGEN_FOUND)
if (LLVM_ENABLE_DOXYGEN)
  set(abs_top_srcdir ${CMAKE_CURRENT_SOURCE_DIR})
  set(abs_top_builddir ${CMAKE_CURRENT_BINARY_DIR})

  if (HAVE_DOT)
    set(DOT ${LLVM_PATH_DOT})
  endif()

  if (LLVM_DOXYGEN_EXTERNAL_SEARCH)
    set(enable_searchengine "YES")
    set(searchengine_url "${LLVM_DOXYGEN_SEARCHENGINE_URL}")
    set(enable_server_based_search "YES")
    set(enable_external_search "YES")
    set(extra_search_mappings "${LLVM_DOXYGEN_SEARCH_MAPPINGS}")
  else()
    set(enable_searchengine "NO")
    set(searchengine_url "")
    set(enable_server_based_search "NO")
    set(enable_external_search "NO")
    set(extra_search_mappings "")
  endif()

  # If asked, configure doxygen for the creation of a Qt Compressed Help file.
  if (LLVM_ENABLE_DOXYGEN_QT_HELP)
    set(FLANG_DOXYGEN_QCH_FILENAME "org.llvm.flang.qch" CACHE STRING
      "Filename of the Qt Compressed help file")
    set(FLANG_DOXYGEN_QHP_NAMESPACE "org.llvm.flang" CACHE STRING
      "Namespace under which the intermediate Qt Help Project file lives")
    set(FLANG_DOXYGEN_QHP_CUST_FILTER_NAME "FLANG ${FLANG_VERSION}" CACHE STRING
      "See http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-filters")
    set(FLANG_DOXYGEN_QHP_CUST_FILTER_ATTRS "FLANG,${FLANG_VERSION}" CACHE STRING
      "See http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes")
    set(flang_doxygen_generate_qhp "YES")
    set(flang_doxygen_qch_filename "${FLANG_DOXYGEN_QCH_FILENAME}")
    set(flang_doxygen_qhp_namespace "${FLANG_DOXYGEN_QHP_NAMESPACE}")
    set(flang_doxygen_qhelpgenerator_path "${LLVM_DOXYGEN_QHELPGENERATOR_PATH}")
    set(flang_doxygen_qhp_cust_filter_name "${FLANG_DOXYGEN_QHP_CUST_FILTER_NAME}")
    set(flang_doxygen_qhp_cust_filter_attrs "${FLANG_DOXYGEN_QHP_CUST_FILTER_ATTRS}")
  else()
    set(flang_doxygen_generate_qhp "NO")
    set(flang_doxygen_qch_filename "")
    set(flang_doxygen_qhp_namespace "")
    set(flang_doxygen_qhelpgenerator_path "")
    set(flang_doxygen_qhp_cust_filter_name "")
    set(flang_doxygen_qhp_cust_filter_attrs "")
  endif()

  configure_file(${CMAKE_CURRENT_SOURCE_DIR}/doxygen.cfg.in
    ${CMAKE_CURRENT_BINARY_DIR}/doxygen.cfg @ONLY)

  set(abs_top_srcdir)
  set(abs_top_builddir)
  set(DOT)
  set(enable_searchengine)
  set(searchengine_url)
  set(enable_server_based_search)
  set(enable_external_search)
  set(extra_search_mappings)
  set(flang_doxygen_generate_qhp)
  set(flang_doxygen_qch_filename)
  set(flang_doxygen_qhp_namespace)
  set(flang_doxygen_qhelpgenerator_path)
  set(flang_doxygen_qhp_cust_filter_name)
  set(flang_doxygen_qhp_cust_filter_attrs)

  add_custom_target(doxygen-flang
    COMMAND ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/doxygen.cfg
    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
    COMMENT "Generating flang doxygen documentation." VERBATIM)
  set_target_properties(doxygen-flang PROPERTIES FOLDER "Flang/Docs")
  if (LLVM_BUILD_DOCS)
   add_dependencies(doxygen doxygen-flang)
  endif()

  if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY AND LLVM_BUILD_DOCS)
    install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/doxygen/html
      DESTINATION docs/html)
  endif()
endif()
endif()

function (gen_rst_file_from_td output_file td_option source target)
  if (NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${source}")
    message(FATAL_ERROR "Cannot find source file: ${source} in ${CMAKE_CURRENT_SOURCE_DIR}")
  endif()
  get_filename_component(TABLEGEN_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/${source}" DIRECTORY)
  list(APPEND LLVM_TABLEGEN_FLAGS "-I${TABLEGEN_INCLUDE_DIR}")
  list(APPEND LLVM_TABLEGEN_FLAGS "-I${CMAKE_CURRENT_SOURCE_DIR}/../../clang/include/clang/Driver/")
  clang_tablegen(Source/${output_file} ${td_option} SOURCE ${source} TARGET ${target})
endfunction()

if (LLVM_ENABLE_SPHINX)
  set (FLANG_DOCS_HTML_DIR "${CMAKE_CURRENT_BINARY_DIR}/SourceHtml")
  set (FLANG_DOCS_MAN_DIR "${CMAKE_CURRENT_BINARY_DIR}/SourceMan")
  include(AddSphinxTarget)
  if (SPHINX_FOUND)

    # CLANG_TABLEGEN_EXE variable needs to be set for clang_tablegen to run without error
    find_program(CLANG_TABLEGEN_EXE "clang-tblgen" ${LLVM_TOOLS_BINARY_DIR} NO_DEFAULT_PATH)

    # Generate the RST file from TableGen (for both HTML and MAN builds)
    gen_rst_file_from_td(FlangCommandLineReference.rst -gen-opt-docs FlangOptionsDocs.td "gen-FlangCommandLineReference.rst")
    gen_rst_file_from_td(FlangCommandLineOptions.rst -gen-opt-docs FlangOptionsMan.td "gen-FlangCommandLineOptions.rst")
    # clang_tablegen() (called from gen_rst_file_from_td()) does not create the
    # output directory automatically, so we have to create it explicitly.
    add_custom_target(create-flang-rst-output-dir
      COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/Source
    )
    add_dependencies("gen-FlangCommandLineReference.rst" create-flang-rst-output-dir)
    add_dependencies("gen-FlangCommandLineOptions.rst" create-flang-rst-output-dir)

    if (${SPHINX_OUTPUT_HTML})
      message(STATUS "Using index.md for html build")

      # Copy the entire flang/docs directory to the build Source dir,
      # then remove the index.rst file, to avoid clash with index.md
      # which is used for the HTML build.
      add_custom_target(copy-flang-src-docs-html
        COMMAND "${CMAKE_COMMAND}" -E copy_directory
              "${CMAKE_CURRENT_SOURCE_DIR}"
              "${FLANG_DOCS_HTML_DIR}"
        COMMAND "${CMAKE_COMMAND}" -E remove
          "${FLANG_DOCS_HTML_DIR}/CommandGuide/index.rst"
        COMMAND "${CMAKE_COMMAND}" -E copy
          "${CMAKE_CURRENT_BINARY_DIR}/Source/FlangCommandLineReference.rst"
          "${FLANG_DOCS_HTML_DIR}/FlangCommandLineReference.rst"
        DEPENDS flang-doc gen-FlangCommandLineReference.rst)

      # Run Python preprocessing ONLY for HTML build
      # This script prepends headers to FIRLangRef.md for proper formatting
      add_custom_command(TARGET copy-flang-src-docs-html
        COMMAND "${Python3_EXECUTABLE}"
        ARGS "${FLANG_DOCS_HTML_DIR}/FIR/CreateFIRLangRef.py")

      add_sphinx_target(html flang SOURCE_DIR "${FLANG_DOCS_HTML_DIR}")
      add_dependencies(docs-flang-html copy-flang-src-docs-html)
    endif()

    # ----------------------------
    # MAN BUILD SETUP
    # ----------------------------
    if (${SPHINX_OUTPUT_MAN})
      message(STATUS "Using CommandGuide/index.rst for man build")

      # Create minimal Source dir with ONLY the files needed for man build:
      # - conf.py (Sphinx config)
      # - index.rst (top-level man page)
      # - FlangCommandLineOptions.rst (generated reference)
      add_custom_target(copy-flang-src-docs-man
        COMMAND "${CMAKE_COMMAND}" -E make_directory
                "${FLANG_DOCS_MAN_DIR}"
        COMMAND "${CMAKE_COMMAND}" -E copy
          "${CMAKE_CURRENT_SOURCE_DIR}/conf.py"
          "${FLANG_DOCS_MAN_DIR}/conf.py"
        COMMAND "${CMAKE_COMMAND}" -E copy
          "${CMAKE_CURRENT_BINARY_DIR}/Source/FlangCommandLineOptions.rst"
          "${FLANG_DOCS_MAN_DIR}/FlangCommandLineOptions.rst"
        COMMAND "${CMAKE_COMMAND}" -E copy
                "${CMAKE_CURRENT_SOURCE_DIR}/CommandGuide/index.rst"
                "${FLANG_DOCS_MAN_DIR}/index.rst"
        DEPENDS flang-doc gen-FlangCommandLineOptions.rst)

      add_sphinx_target(man flang SOURCE_DIR "${FLANG_DOCS_MAN_DIR}")
      add_dependencies(docs-flang-man copy-flang-src-docs-man)
    endif()
  endif()
endif()

