# Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
# file Copyright.txt or https://cmake.org/licensing for details.

if(NOT CMake_SOURCE_DIR)
  set(CMakeDeveloperReference_STANDALONE 1)
  cmake_minimum_required(VERSION 3.1...3.15 FATAL_ERROR)
  get_filename_component(tmp "${CMAKE_CURRENT_SOURCE_DIR}" PATH)
  get_filename_component(CMake_SOURCE_DIR "${tmp}" PATH)
  include(${CMake_SOURCE_DIR}/Modules/CTestUseLaunchers.cmake)
  include(${CMake_SOURCE_DIR}/Source/CMakeVersion.cmake)
  include(${CMake_SOURCE_DIR}/Source/CMakeInstallDestinations.cmake)
  unset(CMAKE_DATA_DIR)
  unset(CMAKE_DATA_DIR CACHE)
  macro(CMake_OPTIONAL_COMPONENT)
    set(COMPONENT "")
  endmacro()
endif()

project(CMakeDeveloperReference NONE)

#
# Build the reference
#

if (CMake_BUILD_DEVELOPER_REFERENCE OR CMakeDeveloperReference_STANDALONE)

  find_package(Doxygen REQUIRED)

  #
  ## Output formats
  #

  option(CMake_BUILD_DEVELOPER_REFERENCE_HTML "Build CMake Developer Reference - HTML format" ON)
  mark_as_advanced(CMake_BUILD_DEVELOPER_REFERENCE_HTML)
  if(CMake_BUILD_DEVELOPER_REFERENCE_HTML)
    set(GENERATE_HTML YES)
  else()
    set(GENERATE_HTML NO)
  endif()

  option(CMake_BUILD_DEVELOPER_REFERENCE_QTHELP "Build CMake Developer Reference - QtHelp format" OFF)
  mark_as_advanced(CMake_BUILD_DEVELOPER_REFERENCE_QTHELP)
  if(CMake_BUILD_DEVELOPER_REFERENCE_QTHELP)
    set(GENERATE_QHP YES)
    find_program(QHELPGENERATOR_EXECUTABLE
      NAMES qhelpgenerator
      DOC "qhelpgenerator tool"
      )
    if(NOT QHELPGENERATOR_EXECUTABLE)
      message(FATAL_ERROR "QHELPGENERATOR_EXECUTABLE (qhelpgenerator) not found!")
    endif()
  else()
    set(GENERATE_QHP NO)
  endif()

  #
  # Configure the script and the doxyfile, then add target
  #

  if(DOXYGEN_DOT_FOUND)
    set(HAVE_DOT YES)
  else()
    set(HAVE_DOT NO)
  endif()

  if(NOT DOT_PATH)
    get_filename_component(DOT_PATH ${DOXYGEN_DOT_EXECUTABLE} PATH)
  endif()

  configure_file(doxyfile.in doxyfile @ONLY)

  add_custom_target(cmake-developer-reference-all
    ${DOXYGEN_EXECUTABLE} doxyfile
    WORKING_DIRECTORY ${CMakeDeveloperReference_BINARY_DIR})

  add_custom_target(cmake-developer-reference ALL DEPENDS cmake-developer-reference-all)

  #
  # Installation
  #

  if(CMake_BUILD_DEVELOPER_REFERENCE_HTML)
    CMake_OPTIONAL_COMPONENT(cmake-developer-reference-html)
    install(DIRECTORY "${CMakeDeveloperReference_BINARY_DIR}/developer-reference/html"
      DESTINATION ${CMAKE_DOC_DIR}/developer-reference
      ${COMPONENT})
  endif()

  if(CMake_BUILD_DEVELOPER_REFERENCE_QTHELP)
    CMake_OPTIONAL_COMPONENT(cmake-developer-reference-qthelp)
    install(FILES "${CMakeDeveloperReference_BINARY_DIR}/developer-reference/CMakeDeveloperReference-${CMake_VERSION_MAJOR}${CMake_VERSION_MINOR}${CMake_VERSION_PATCH}.qch"
      DESTINATION ${CMAKE_DOC_DIR}/developer-reference
      ${COMPONENT})
  endif()

endif ()
