option(CLANG_INSTALL_SCANBUILD "Install the scan-build tool" ON)

if (WIN32 AND NOT CYGWIN)
  set(BinFiles
        scan-build.bat)
  set(LibexecFiles
        ccc-analyzer.bat
        c++-analyzer.bat)
else()
  set(BinFiles
        scan-build)
  set(LibexecFiles
        ccc-analyzer
        c++-analyzer)
  if (APPLE)
    list(APPEND BinFiles
           set-xcode-analyzer)
  endif()
endif()

set(ManPages
      scan-build.1)

set(ResourceFiles
      scanview.css
      sorttable.js)


if(CLANG_INSTALL_SCANBUILD)
  foreach(BinFile ${BinFiles})
    add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/bin/${BinFile}
                       COMMAND ${CMAKE_COMMAND} -E make_directory
                         ${CMAKE_BINARY_DIR}/bin
                       COMMAND ${CMAKE_COMMAND} -E copy
                         ${CMAKE_CURRENT_SOURCE_DIR}/${BinFile}
                         ${CMAKE_BINARY_DIR}/bin/
                       DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${BinFile})
    list(APPEND Depends ${CMAKE_BINARY_DIR}/bin/${BinFile})
    install(PROGRAMS ${BinFile} DESTINATION bin)
  endforeach()

  foreach(LibexecFile ${LibexecFiles})
    add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/libexec/${LibexecFile}
                       COMMAND ${CMAKE_COMMAND} -E make_directory
                         ${CMAKE_BINARY_DIR}/libexec
                       COMMAND ${CMAKE_COMMAND} -E copy
                         ${CMAKE_CURRENT_SOURCE_DIR}/${LibexecFile}
                         ${CMAKE_BINARY_DIR}/libexec/
                       DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${LibexecFile})
    list(APPEND Depends ${CMAKE_BINARY_DIR}/libexec/${LibexecFile})
    install(PROGRAMS ${LibexecFile} DESTINATION libexec)
  endforeach()

  foreach(ManPage ${ManPages})
    add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/share/man/man1/${ManPage}
                       COMMAND ${CMAKE_COMMAND} -E make_directory
                         ${CMAKE_BINARY_DIR}/share/man/man1
                       COMMAND ${CMAKE_COMMAND} -E copy
                         ${CMAKE_CURRENT_SOURCE_DIR}/${ManPage}
                         ${CMAKE_BINARY_DIR}/share/man/man1/
                       DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${ManPage})
    list(APPEND Depends ${CMAKE_BINARY_DIR}/share/man/man1/${ManPage})
    install(PROGRAMS ${ManPage} DESTINATION share/man/man1)
  endforeach()

  foreach(ResourceFile ${ResourceFiles})
    add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/bin/${ResourceFile}
                       COMMAND ${CMAKE_COMMAND} -E make_directory
                         ${CMAKE_BINARY_DIR}/bin
                       COMMAND ${CMAKE_COMMAND} -E copy
                         ${CMAKE_CURRENT_SOURCE_DIR}/${ResourceFile}
                         ${CMAKE_BINARY_DIR}/bin/
                       DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${ResourceFile})
    list(APPEND Depends ${CMAKE_BINARY_DIR}/bin/${ResourceFile})
    install(FILES ${ResourceFile} DESTINATION bin)
  endforeach()

  add_custom_target(scan-build ALL DEPENDS ${Depends})
endif()

