mirror of https://github.com/stenzek/duckstation
				
				
				
			
			You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			216 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			CMake
		
	
			
		
		
	
	
			216 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			CMake
		
	
#[==[
 | 
						|
Provides the following variables:
 | 
						|
 | 
						|
  * `FFMPEG_INCLUDE_DIRS`: Include directories necessary to use FFMPEG.
 | 
						|
  * `FFMPEG_LIBRARIES`: Libraries necessary to use FFMPEG. Note that this only
 | 
						|
    includes libraries for the components requested.
 | 
						|
  * `FFMPEG_VERSION`: The version of FFMPEG found.
 | 
						|
 | 
						|
The following components are supported:
 | 
						|
 | 
						|
  * `avcodec`
 | 
						|
  * `avdevice`
 | 
						|
  * `avfilter`
 | 
						|
  * `avformat`
 | 
						|
  * `avresample`
 | 
						|
  * `avutil`
 | 
						|
  * `swresample`
 | 
						|
  * `swscale`
 | 
						|
 | 
						|
For each component, the following are provided:
 | 
						|
 | 
						|
  * `FFMPEG_<component>_FOUND`: Libraries for the component.
 | 
						|
  * `FFMPEG_<component>_INCLUDE_DIRS`: Include directories for
 | 
						|
    the component.
 | 
						|
  * `FFMPEG_<component>_LIBRARIES`: Libraries for the component.
 | 
						|
  * `FFMPEG::<component>`: A target to use with `target_link_libraries`.
 | 
						|
 | 
						|
Note that only components requested with `COMPONENTS` or `OPTIONAL_COMPONENTS`
 | 
						|
are guaranteed to set these variables or provide targets.
 | 
						|
#]==]
 | 
						|
 | 
						|
function (_ffmpeg_find component headername)
 | 
						|
  find_path("FFMPEG_${component}_INCLUDE_DIR"
 | 
						|
    NAMES
 | 
						|
      "lib${component}/${headername}"
 | 
						|
    PATHS
 | 
						|
      "${FFMPEG_ROOT}/include"
 | 
						|
      "${CMAKE_PREFIX_PATH}/include"
 | 
						|
      ~/Library/Frameworks
 | 
						|
      /Library/Frameworks
 | 
						|
      /usr/local/include
 | 
						|
      /usr/include
 | 
						|
      /sw/include # Fink
 | 
						|
      /opt/local/include # DarwinPorts
 | 
						|
      /opt/csw/include # Blastwave
 | 
						|
      /opt/include
 | 
						|
      /usr/freeware/include
 | 
						|
    PATH_SUFFIXES
 | 
						|
      ffmpeg
 | 
						|
    DOC "FFMPEG's ${component} include directory")
 | 
						|
  mark_as_advanced("FFMPEG_${component}_INCLUDE_DIR")
 | 
						|
 | 
						|
  # On Windows, static FFMPEG is sometimes built as `lib<name>.a`.
 | 
						|
  if (WIN32)
 | 
						|
    list(APPEND CMAKE_FIND_LIBRARY_SUFFIXES ".a" ".lib")
 | 
						|
    list(APPEND CMAKE_FIND_LIBRARY_PREFIXES "" "lib")
 | 
						|
  endif ()
 | 
						|
 | 
						|
  find_library("FFMPEG_${component}_LIBRARY"
 | 
						|
    NAMES
 | 
						|
      "${component}"
 | 
						|
    PATHS
 | 
						|
      "${FFMPEG_ROOT}/lib"
 | 
						|
      "${CMAKE_PREFIX_PATH}/lib"
 | 
						|
      "${CMAKE_PREFIX_PATH}/lib64"
 | 
						|
      ~/Library/Frameworks
 | 
						|
      /Library/Frameworks
 | 
						|
      /usr/local/lib
 | 
						|
      /usr/local/lib64
 | 
						|
      /usr/lib
 | 
						|
      /usr/lib64
 | 
						|
      /sw/lib
 | 
						|
      /opt/local/lib
 | 
						|
      /opt/csw/lib
 | 
						|
      /opt/lib
 | 
						|
      /usr/freeware/lib64
 | 
						|
      "${FFMPEG_ROOT}/bin"
 | 
						|
    DOC "FFMPEG's ${component} library")
 | 
						|
  mark_as_advanced("FFMPEG_${component}_LIBRARY")
 | 
						|
 | 
						|
  if (FFMPEG_${component}_LIBRARY AND FFMPEG_${component}_INCLUDE_DIR)
 | 
						|
    set(_deps_found TRUE)
 | 
						|
    set(_deps_link)
 | 
						|
    foreach (_ffmpeg_dep IN LISTS ARGN)
 | 
						|
      if (TARGET "FFMPEG::${_ffmpeg_dep}")
 | 
						|
        list(APPEND _deps_link "FFMPEG::${_ffmpeg_dep}")
 | 
						|
      else ()
 | 
						|
        set(_deps_found FALSE)
 | 
						|
      endif ()
 | 
						|
    endforeach ()
 | 
						|
    if (_deps_found)
 | 
						|
      if (NOT TARGET "FFMPEG::${component}")
 | 
						|
        add_library("FFMPEG::${component}" UNKNOWN IMPORTED)
 | 
						|
        set_target_properties("FFMPEG::${component}" PROPERTIES
 | 
						|
          IMPORTED_LOCATION "${FFMPEG_${component}_LIBRARY}"
 | 
						|
          INTERFACE_INCLUDE_DIRECTORIES "${FFMPEG_${component}_INCLUDE_DIR}"
 | 
						|
          IMPORTED_LINK_INTERFACE_LIBRARIES "${_deps_link}")
 | 
						|
      endif ()
 | 
						|
      set("FFMPEG_${component}_FOUND" 1
 | 
						|
        PARENT_SCOPE)
 | 
						|
 | 
						|
      set(version_header_path "${FFMPEG_${component}_INCLUDE_DIR}/lib${component}/version.h")
 | 
						|
      set(major_version_header_path "${FFMPEG_${component}_INCLUDE_DIR}/lib${component}/version_major.h")
 | 
						|
      if (EXISTS "${major_version_header_path}")
 | 
						|
        string(TOUPPER "${component}" component_upper)
 | 
						|
        file(STRINGS "${major_version_header_path}" major_version
 | 
						|
          REGEX "#define  *LIB${component_upper}_VERSION_MAJOR ")
 | 
						|
        file(STRINGS "${version_header_path}" version
 | 
						|
          REGEX "#define  *LIB${component_upper}_VERSION_(MINOR|MICRO) ")
 | 
						|
        string(REGEX REPLACE ".*_MAJOR *\([0-9]*\).*" "\\1" major "${major_version}")
 | 
						|
        string(REGEX REPLACE ".*_MINOR *\([0-9]*\).*" "\\1" minor "${version}")
 | 
						|
        string(REGEX REPLACE ".*_MICRO *\([0-9]*\).*" "\\1" micro "${version}")
 | 
						|
        if (NOT major STREQUAL "" AND
 | 
						|
            NOT minor STREQUAL "" AND
 | 
						|
            NOT micro STREQUAL "")
 | 
						|
          set("FFMPEG_${component}_VERSION" "${major}.${minor}.${micro}"
 | 
						|
            PARENT_SCOPE)
 | 
						|
        endif ()
 | 
						|
      elseif (EXISTS "${version_header_path}")
 | 
						|
        string(TOUPPER "${component}" component_upper)
 | 
						|
        file(STRINGS "${version_header_path}" version
 | 
						|
          REGEX "#define  *LIB${component_upper}_VERSION_(MAJOR|MINOR|MICRO) ")
 | 
						|
        string(REGEX REPLACE ".*_MAJOR *\([0-9]*\).*" "\\1" major "${version}")
 | 
						|
        string(REGEX REPLACE ".*_MINOR *\([0-9]*\).*" "\\1" minor "${version}")
 | 
						|
        string(REGEX REPLACE ".*_MICRO *\([0-9]*\).*" "\\1" micro "${version}")
 | 
						|
        if (NOT major STREQUAL "" AND
 | 
						|
            NOT minor STREQUAL "" AND
 | 
						|
            NOT micro STREQUAL "")
 | 
						|
          set("FFMPEG_${component}_VERSION" "${major}.${minor}.${micro}"
 | 
						|
            PARENT_SCOPE)
 | 
						|
        endif ()
 | 
						|
      endif ()
 | 
						|
    else ()
 | 
						|
      set("FFMPEG_${component}_FOUND" 0
 | 
						|
        PARENT_SCOPE)
 | 
						|
      set(what)
 | 
						|
      if (NOT FFMPEG_${component}_LIBRARY)
 | 
						|
        set(what "library")
 | 
						|
      endif ()
 | 
						|
      if (NOT FFMPEG_${component}_INCLUDE_DIR)
 | 
						|
        if (what)
 | 
						|
          string(APPEND what " or headers")
 | 
						|
        else ()
 | 
						|
          set(what "headers")
 | 
						|
        endif ()
 | 
						|
      endif ()
 | 
						|
      set("FFMPEG_${component}_NOT_FOUND_MESSAGE"
 | 
						|
        "Could not find the ${what} for ${component}."
 | 
						|
        PARENT_SCOPE)
 | 
						|
    endif ()
 | 
						|
  endif ()
 | 
						|
endfunction ()
 | 
						|
 | 
						|
_ffmpeg_find(avutil     avutil.h)
 | 
						|
_ffmpeg_find(avresample avresample.h
 | 
						|
  avutil)
 | 
						|
_ffmpeg_find(swresample swresample.h
 | 
						|
  avutil)
 | 
						|
_ffmpeg_find(swscale    swscale.h
 | 
						|
  avutil)
 | 
						|
_ffmpeg_find(avcodec    avcodec.h
 | 
						|
  avutil)
 | 
						|
_ffmpeg_find(avformat   avformat.h
 | 
						|
  avcodec avutil)
 | 
						|
_ffmpeg_find(avfilter   avfilter.h
 | 
						|
  avutil)
 | 
						|
_ffmpeg_find(avdevice   avdevice.h
 | 
						|
  avformat avutil)
 | 
						|
 | 
						|
if (TARGET FFMPEG::avutil)
 | 
						|
  set(_ffmpeg_version_header_path "${FFMPEG_avutil_INCLUDE_DIR}/libavutil/ffversion.h")
 | 
						|
  if (EXISTS "${_ffmpeg_version_header_path}")
 | 
						|
    file(STRINGS "${_ffmpeg_version_header_path}" _ffmpeg_version
 | 
						|
      REGEX "FFMPEG_VERSION")
 | 
						|
    string(REGEX REPLACE ".*\"n?\(.*\)\"" "\\1" FFMPEG_VERSION "${_ffmpeg_version}")
 | 
						|
    unset(_ffmpeg_version)
 | 
						|
  else ()
 | 
						|
    set(FFMPEG_VERSION FFMPEG_VERSION-NOTFOUND)
 | 
						|
  endif ()
 | 
						|
  unset(_ffmpeg_version_header_path)
 | 
						|
endif ()
 | 
						|
 | 
						|
set(FFMPEG_INCLUDE_DIRS)
 | 
						|
set(FFMPEG_LIBRARIES)
 | 
						|
set(_ffmpeg_required_vars)
 | 
						|
foreach (_ffmpeg_component IN LISTS FFMPEG_FIND_COMPONENTS)
 | 
						|
  if (TARGET "FFMPEG::${_ffmpeg_component}")
 | 
						|
    set(FFMPEG_${_ffmpeg_component}_INCLUDE_DIRS
 | 
						|
      "${FFMPEG_${_ffmpeg_component}_INCLUDE_DIR}")
 | 
						|
    set(FFMPEG_${_ffmpeg_component}_LIBRARIES
 | 
						|
      "${FFMPEG_${_ffmpeg_component}_LIBRARY}")
 | 
						|
    list(APPEND FFMPEG_INCLUDE_DIRS
 | 
						|
      "${FFMPEG_${_ffmpeg_component}_INCLUDE_DIRS}")
 | 
						|
    list(APPEND FFMPEG_LIBRARIES
 | 
						|
      "${FFMPEG_${_ffmpeg_component}_LIBRARIES}")
 | 
						|
    if (FFMEG_FIND_REQUIRED_${_ffmpeg_component})
 | 
						|
      list(APPEND _ffmpeg_required_vars
 | 
						|
        "FFMPEG_${_ffmpeg_required_vars}_INCLUDE_DIRS"
 | 
						|
        "FFMPEG_${_ffmpeg_required_vars}_LIBRARIES")
 | 
						|
    endif ()
 | 
						|
  endif ()
 | 
						|
endforeach ()
 | 
						|
unset(_ffmpeg_component)
 | 
						|
 | 
						|
if (FFMPEG_INCLUDE_DIRS)
 | 
						|
  list(REMOVE_DUPLICATES FFMPEG_INCLUDE_DIRS)
 | 
						|
endif ()
 | 
						|
 | 
						|
include(FindPackageHandleStandardArgs)
 | 
						|
find_package_handle_standard_args(FFMPEG
 | 
						|
  REQUIRED_VARS FFMPEG_INCLUDE_DIRS FFMPEG_LIBRARIES ${_ffmpeg_required_vars}
 | 
						|
  VERSION_VAR FFMPEG_VERSION
 | 
						|
  HANDLE_COMPONENTS)
 | 
						|
unset(_ffmpeg_required_vars)
 | 
						|
 |