Spaces:
Sleeping
Sleeping
# From | |
# https://github.com/snikulov/cmake-modules/blob/master/FindFFmpeg.cmake | |
# | |
# vim: ts=2 sw=2 | |
# - Try to find the required ffmpeg components(default: AVFORMAT, AVUTIL, AVCODEC) | |
# | |
# Once done this will define | |
# FFMPEG_FOUND - System has the all required components. | |
# FFMPEG_INCLUDE_DIRS - Include directory necessary for using the required components headers. | |
# FFMPEG_LIBRARIES - Link these to use the required ffmpeg components. | |
# FFMPEG_DEFINITIONS - Compiler switches required for using the required ffmpeg components. | |
# | |
# For each of the components it will additionally set. | |
# - AVCODEC | |
# - AVDEVICE | |
# - AVFORMAT | |
# - AVFILTER | |
# - AVUTIL | |
# - POSTPROC | |
# - SWSCALE | |
# the following variables will be defined | |
# <component>_FOUND - System has <component> | |
# <component>_INCLUDE_DIRS - Include directory necessary for using the <component> headers | |
# <component>_LIBRARIES - Link these to use <component> | |
# <component>_DEFINITIONS - Compiler switches required for using <component> | |
# <component>_VERSION - The components version | |
# | |
# Copyright (c) 2006, Matthias Kretz, <[email protected]> | |
# Copyright (c) 2008, Alexander Neundorf, <[email protected]> | |
# Copyright (c) 2011, Michael Jansen, <[email protected]> | |
# | |
# Redistribution and use is allowed according to the terms of the BSD license. | |
# For details see the accompanying COPYING-CMAKE-SCRIPTS file. | |
include(FindPackageHandleStandardArgs) | |
# The default components were taken from a survey over other FindFFMPEG.cmake files | |
if (NOT FFmpeg_FIND_COMPONENTS) | |
set(FFmpeg_FIND_COMPONENTS AVFORMAT AVCODEC AVUTIL SWRESAMPLE) | |
endif() | |
# | |
### Macro: set_component_found | |
# | |
# Marks the given component as found if both *_LIBRARIES AND *_INCLUDE_DIRS is present. | |
# | |
macro(set_component_found _component ) | |
if (${_component}_LIBRARIES AND ${_component}_INCLUDE_DIRS) | |
message(DEBUG " - ${_component} found.") | |
set(${_component}_FOUND TRUE) | |
else () | |
message(DEBUG " - ${_component} not found.") | |
endif () | |
endmacro() | |
# | |
### Macro: find_component | |
# | |
# Checks for the given component by invoking pkgconfig and then looking up the libraries and | |
# include directories. | |
# | |
macro(find_component _component _pkgconfig _library _header) | |
if (NOT WIN32) | |
# use pkg-config to get the directories and then use these values | |
# in the FIND_PATH() and FIND_LIBRARY() calls | |
find_package(PkgConfig) | |
if (PKG_CONFIG_FOUND) | |
pkg_check_modules(PC_${_component} ${_pkgconfig}) | |
message(STATUS "Pkgconfig found: ${PC_${_component}_INCLUDEDIR}") | |
message(STATUS "Pkgconfig found: ${PC_${_component}_INCLUDE_DIRS}") | |
message(STATUS "${PC_${_component}_CFLAGS}") | |
endif () | |
endif (NOT WIN32) | |
find_path(${_component}_INCLUDE_DIRS ${_header} | |
HINTS | |
${PC_${_component}_INCLUDEDIR} | |
${PC_${_component}_INCLUDE_DIRS} | |
PATH_SUFFIXES | |
ffmpeg | |
) | |
# CMake's default is to search first for shared libraries and then for static libraries. | |
# Todo later: add option to prefer static libs over dynamic: | |
find_library(${_component}_LIBRARIES NAMES ${_library} lib${_library}.a | |
HINTS | |
${PC_${_component}_LIBDIR} | |
${PC_${_component}_LIBRARY_DIRS} | |
) | |
set(${_component}_DEFINITIONS ${PC_${_component}_CFLAGS_OTHER} CACHE STRING "The ${_component} CFLAGS.") | |
set(${_component}_VERSION ${PC_${_component}_VERSION} CACHE STRING "The ${_component} version number.") | |
set_component_found(${_component}) | |
mark_as_advanced( | |
${_component}_INCLUDE_DIRS | |
${_component}_LIBRARIES | |
${_component}_DEFINITIONS | |
${_component}_VERSION) | |
endmacro() | |
# Check for cached results. If there are skip the costly part. | |
if (NOT FFMPEG_LIBRARIES) | |
# Check for all possible component. | |
find_component(AVCODEC libavcodec avcodec libavcodec/avcodec.h) | |
find_component(AVFORMAT libavformat avformat libavformat/avformat.h) | |
find_component(AVDEVICE libavdevice avdevice libavdevice/avdevice.h) | |
#find_component(AVRESAMPLE libavresample avresample libavresample/avresample.h) # old name for swresample | |
find_component(AVUTIL libavutil avutil libavutil/avutil.h) | |
find_component(AVFILTER libavfilter avfilter libavfilter/avfilter.h) | |
find_component(SWSCALE libswscale swscale libswscale/swscale.h) | |
find_component(POSTPROC libpostproc postproc libpostproc/postprocess.h) | |
find_component(SWRESAMPLE libswresample swresample libswresample/swresample.h) | |
# Check if the required components were found and add their stuff to the FFMPEG_* vars. | |
foreach (_component ${FFmpeg_FIND_COMPONENTS}) | |
if (${_component}_FOUND) | |
# message(STATUS "Required component ${_component} present.") | |
set(FFMPEG_LIBRARIES ${FFMPEG_LIBRARIES} ${${_component}_LIBRARIES}) | |
set(FFMPEG_DEFINITIONS ${FFMPEG_DEFINITIONS} ${${_component}_DEFINITIONS}) | |
list(APPEND FFMPEG_INCLUDE_DIRS ${${_component}_INCLUDE_DIRS}) | |
else () | |
# message(STATUS "Required component ${_component} missing.") | |
endif () | |
endforeach () | |
# Build the include path with duplicates removed. | |
if (FFMPEG_INCLUDE_DIRS) | |
list(REMOVE_DUPLICATES FFMPEG_INCLUDE_DIRS) | |
endif () | |
# cache the vars. | |
set(FFMPEG_INCLUDE_DIRS ${FFMPEG_INCLUDE_DIRS} CACHE STRING "The FFmpeg include directories." FORCE) | |
set(FFMPEG_LIBRARIES ${FFMPEG_LIBRARIES} CACHE STRING "The FFmpeg libraries." FORCE) | |
set(FFMPEG_DEFINITIONS ${FFMPEG_DEFINITIONS} CACHE STRING "The FFmpeg cflags." FORCE) | |
mark_as_advanced(FFMPEG_INCLUDE_DIRS | |
FFMPEG_LIBRARIES | |
FFMPEG_DEFINITIONS) | |
endif () | |
# Now set the noncached _FOUND vars for the components. | |
# whisper.cpp does not need SWSCALE | |
foreach (_component AVCODEC AVDEVICE AVFORMAT AVRESAMPLE AVUTIL POSTPROCESS) | |
set_component_found(${_component}) | |
endforeach () | |
# Compile the list of required vars | |
set(_FFmpeg_REQUIRED_VARS FFMPEG_LIBRARIES FFMPEG_INCLUDE_DIRS) | |
foreach (_component ${FFmpeg_FIND_COMPONENTS}) | |
list(APPEND _FFmpeg_REQUIRED_VARS ${_component}_LIBRARIES ${_component}_INCLUDE_DIRS) | |
endforeach () | |
# Give a nice error message if some of the required vars are missing. | |
find_package_handle_standard_args(FFmpeg DEFAULT_MSG ${_FFmpeg_REQUIRED_VARS}) | |