add_subdirectory(tools)

find_program(SPHINX_EXECUTABLE
  NAMES sphinx-build
  HINTS $ENV{SPHINX_DIR}
  PATH_SUFFIXES bin
  DOC "Sphinx documentation generator")

SET(SWIFT_SPHINX_PAPER_SIZE "letter"
  CACHE STRING "Paper size for generated documentation")

SET(SPHINX_ARGS
  -W
  -D latex_elements.papersize=${SWIFT_SPHINX_PAPER_SIZE}
  -d ${CMAKE_BINARY_DIR}/doctrees)

if(SPHINX_EXECUTABLE)
  add_custom_target(docs_html ALL
    ${SPHINX_EXECUTABLE} ${SPHINX_ARGS} -b html
      . ${CMAKE_BINARY_DIR}/docs/html
    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
    COMMENT "Building HTML documentation")
else()
  message(WARNING "Unable to find sphinx-build program. Not building docs")
endif()

## Example testing

find_program(LITRE_EXECUTABLE
  NAMES litre
  DOC "LitRe literate programming tool for docutils")

find_program(SPHINX_EXECUTABLE
  NAMES sphinx-build
  HINTS $ENV{SPHINX_DIR}
  PATH_SUFFIXES bin
  DOC "Sphinx documentation generator")

if(LITRE_EXECUTABLE)
  # Find all the .rst files
  file(GLOB_RECURSE rst_files RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.rst)
  set(subdir_CMakeLists)

  foreach(rst ${rst_files})
    # Prepare a testing directory containing a CMakeLists.txt
    # and example files extracted from the .rst
    set(test_dir "litre-tests/${rst}.litre-tests")

    add_custom_command(
      OUTPUT
        ${test_dir}/CMakeLists.txt
      COMMAND
        ${LITRE_EXECUTABLE}
        --default_compiler=${CMAKE_BINARY_DIR}/bin/swift
        "--dump_dir=${test_dir}"
        --traceback
        --report=severe  # suppress most .rst errors.  We have lots of them.
        ${CMAKE_CURRENT_SOURCE_DIR}/${rst}
      DEPENDS
        ${CMAKE_CURRENT_SOURCE_DIR}/${rst}
      COMMENT
        "Generating/Updating LitRe tests for ${rst}"
      VERBATIM
      )

    list(APPEND subdir_CMakeLists ${test_dir}/CMakeLists.txt)
  endforeach()

  # Create a top-level CMakeLists.txt in a temporary file
  add_custom_command(
    OUTPUT
      litre-top-CMakeLists.cmake
    COMMAND
      ${CMAKE_COMMAND} -DOUTPUT=litre-top-CMakeLists.cmake
                      -DSOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR}
          -P ${CMAKE_CURRENT_SOURCE_DIR}/GenerateTopLevelLitreCMakeLists.cmake
          ${rst_files}
    DEPENDS
      ${rst_files}
    COMMENT
      "Generating top-level LitRe CMakeLists.txt content"
    VERBATIM
    )

  # Only update the real top-level CMakeLists.txt if something changed
  add_custom_command(
    OUTPUT
      "litre-tests/CMakeLists.txt"
    COMMAND
      "${CMAKE_COMMAND}" "-E" "copy_if_different"
      "litre-top-CMakeLists.cmake" "litre-tests/CMakeLists.txt"
    DEPENDS
      "litre-top-CMakeLists.cmake"
    COMMENT
      "Updating top-level LitRe CMakeLists.txt"
    VERBATIM)

  # Create a build directory
  add_custom_command(
    OUTPUT "litre-tests/build"
    COMMAND "${CMAKE_COMMAND}" "-E" "make_directory" "litre-tests/build")

  # Run CMake itself to configure/build the tests
  add_custom_command(
    OUTPUT
      litre-tests/results
    COMMAND
      ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" "${CMAKE_CURRENT_BINARY_DIR}/litre-tests"
    COMMAND
      ${CMAKE_COMMAND} --build .
    COMMAND
      ${CMAKE_COMMAND} -E touch "${CMAKE_CURRENT_BINARY_DIR}/litre-tests/results"
    WORKING_DIRECTORY
      litre-tests/build
    DEPENDS
      ${CMAKE_BINARY_DIR}/bin/swift
      litre-tests/CMakeLists.txt litre-tests/build ${subdir_CMakeLists}
    COMMENT
      "Running LitRe tests"
    VERBATIM
      )

  # Add a target so these tests show up in the Xcode project.
  add_custom_target(
    LiterateTests SOURCES ${rst_files}
    DEPENDS litre-tests/results
    )
  set_target_properties(LiterateTests PROPERTIES FOLDER "Tests")
else()
  message(WARNING "LitRe not found; code examples won't be tested.")
endif()

if (LLVM_ENABLE_DOXYGEN)
if (DOXYGEN_FOUND)
  set(abs_srcdir ${CMAKE_CURRENT_SOURCE_DIR})
  set(abs_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()

  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)

  add_custom_target(doxygen-swift
    ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/doxygen.cfg
    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
    COMMENT "Generating swift doxygen documentation." VERBATIM)

  if(LLVM_BUILD_DOCS)
    add_dependencies(doxygen doxygen-swift)
  endif()

  swift_install_in_component(dev
      DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/doxygen/html"
      DESTINATION "docs/html")
endif()
endif()
