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

#.rst:
# FindAVIFile
# -----------
#
# Locate AVIFILE library and include paths
#
# AVIFILE (http://avifile.sourceforge.net/)is a set of libraries for
# i386 machines to use various AVI codecs.  Support is limited beyond
# Linux.  Windows provides native AVI support, and so doesn't need this
# library.  This module defines
#
# ::
#
#   AVIFILE_INCLUDE_DIR, where to find avifile.h , etc.
#   AVIFILE_LIBRARIES, the libraries to link against
#   AVIFILE_DEFINITIONS, definitions to use when compiling
#   AVIFILE_FOUND, If false, don't try to use AVIFILE

if (UNIX)

  find_path(AVIFILE_INCLUDE_DIR avifile.h
    /usr/local/avifile/include
    /usr/local/include/avifile
  )

  find_library(AVIFILE_AVIPLAY_LIBRARY aviplay
    /usr/local/avifile/lib
  )

endif ()

# handle the QUIETLY and REQUIRED arguments and set AVIFILE_FOUND to TRUE if
# all listed variables are TRUE
include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(AVIFile DEFAULT_MSG AVIFILE_INCLUDE_DIR AVIFILE_AVIPLAY_LIBRARY)

if (AVIFILE_FOUND)
    set(AVIFILE_LIBRARIES ${AVIFILE_AVIPLAY_LIBRARY})
    set(AVIFILE_DEFINITIONS "")
endif()

mark_as_advanced(AVIFILE_INCLUDE_DIR AVIFILE_AVIPLAY_LIBRARY)
