diff options
-rw-r--r-- | cmake/modules/FindFFMPEG.cmake | 308 | ||||
-rw-r--r-- | cmake/modules/FindGnuTLS.cmake (renamed from tools/depends/target/ffmpeg/FindGnuTls.cmake) | 2 | ||||
-rw-r--r-- | cmake/modules/FindNASM.cmake | 30 | ||||
-rw-r--r-- | tools/depends/target/ffmpeg/CMakeLists.txt | 77 |
4 files changed, 236 insertions, 181 deletions
diff --git a/cmake/modules/FindFFMPEG.cmake b/cmake/modules/FindFFMPEG.cmake index b07adba153..341eb4a89c 100644 --- a/cmake/modules/FindFFMPEG.cmake +++ b/cmake/modules/FindFFMPEG.cmake @@ -32,15 +32,110 @@ # -------- # -# required ffmpeg library versions -set(REQUIRED_FFMPEG_VERSION 4.4.1) -set(_avcodec_ver ">=58.134.100") -set(_avfilter_ver ">=7.110.100") -set(_avformat_ver ">=58.76.100") -set(_avutil_ver ">=56.70.100") -set(_swscale_ver ">=5.9.100") -set(_swresample_ver ">=3.9.100") -set(_postproc_ver ">=55.9.100") +# Macro to build internal FFmpeg +# Refactoring to a macro allows simple fallthrough callback if system ffmpeg failure +macro(buildFFMPEG) + include(ExternalProject) + include(cmake/scripts/common/ModuleHelpers.cmake) + + get_archive_name(ffmpeg) + + # allow user to override the download URL with a local tarball + # needed for offline build envs + if(FFMPEG_URL) + get_filename_component(FFMPEG_URL "${FFMPEG_URL}" ABSOLUTE) + else() + # github tarball format is tagname.tar.gz (eg 4.4-N-Alpha1.tar.gz) + # tagname is our FFMPEG_VER from VERSION file. + set(FFMPEG_URL ${FFMPEG_BASE_URL}/archive/${FFMPEG_VER}.tar.gz) + endif() + if(VERBOSE) + message(STATUS "FFMPEG_URL: ${FFMPEG_URL}") + endif() + + if (NOT DAV1D_FOUND) + message(STATUS "dav1d not found, internal ffmpeg build will be missing AV1 support!") + endif() + + set(FFMPEG_OPTIONS -DENABLE_CCACHE=${ENABLE_CCACHE} + -DCCACHE_PROGRAM=${CCACHE_PROGRAM} + -DENABLE_VAAPI=${ENABLE_VAAPI} + -DENABLE_VDPAU=${ENABLE_VDPAU} + -DENABLE_DAV1D=${DAV1D_FOUND} + -DEXTRA_FLAGS=${FFMPEG_EXTRA_FLAGS}) + + if(KODI_DEPENDSBUILD) + set(CROSS_ARGS -DDEPENDS_PATH=${DEPENDS_PATH} + -DPKG_CONFIG_EXECUTABLE=${PKG_CONFIG_EXECUTABLE} + -DCROSSCOMPILING=${CMAKE_CROSSCOMPILING} + -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} + -DOS=${OS} + -DCMAKE_AR=${CMAKE_AR}) + endif() + set(LINKER_FLAGS ${CMAKE_EXE_LINKER_FLAGS}) + list(APPEND LINKER_FLAGS ${SYSTEM_LDFLAGS}) + + externalproject_add(ffmpeg + URL ${FFMPEG_URL} + URL_HASH ${FFMPEG_HASH} + DOWNLOAD_NAME ${FFMPEG_ARCHIVE} + DOWNLOAD_DIR ${TARBALL_DIR} + PREFIX ${CORE_BUILD_DIR}/ffmpeg + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR} + -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} + -DCMAKE_MODULE_PATH=${CMAKE_MODULE_PATH} + -DFFMPEG_VER=${FFMPEG_VER} + -DCORE_SYSTEM_NAME=${CORE_SYSTEM_NAME} + -DCORE_PLATFORM_NAME=${CORE_PLATFORM_NAME_LC} + -DCPU=${CPU} + -DENABLE_NEON=${ENABLE_NEON} + -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} + -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} + -DENABLE_CCACHE=${ENABLE_CCACHE} + -DCMAKE_C_FLAGS=${CMAKE_C_FLAGS} + -DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS} + -DCMAKE_EXE_LINKER_FLAGS=${LINKER_FLAGS} + ${CROSS_ARGS} + ${FFMPEG_OPTIONS} + -DPKG_CONFIG_PATH=${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/lib/pkgconfig + PATCH_COMMAND ${CMAKE_COMMAND} -E copy + ${CMAKE_SOURCE_DIR}/tools/depends/target/ffmpeg/CMakeLists.txt + <SOURCE_DIR>) + + if (ENABLE_INTERNAL_DAV1D) + add_dependencies(ffmpeg dav1d) + endif() + + find_program(BASH_COMMAND bash) + if(NOT BASH_COMMAND) + message(FATAL_ERROR "Internal FFmpeg requires bash.") + endif() + file(WRITE ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/ffmpeg/ffmpeg-link-wrapper +"#!${BASH_COMMAND} +if [[ $@ == *${APP_NAME_LC}.bin* || $@ == *${APP_NAME_LC}${APP_BINARY_SUFFIX}* || $@ == *${APP_NAME_LC}.so* || $@ == *${APP_NAME_LC}-test* ]] +then + avformat=`PKG_CONFIG_PATH=${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/lib/pkgconfig ${PKG_CONFIG_EXECUTABLE} --libs --static libavcodec` + avcodec=`PKG_CONFIG_PATH=${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/lib/pkgconfig ${PKG_CONFIG_EXECUTABLE} --libs --static libavformat` + avfilter=`PKG_CONFIG_PATH=${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/lib/pkgconfig ${PKG_CONFIG_EXECUTABLE} --libs --static libavfilter` + avutil=`PKG_CONFIG_PATH=${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/lib/pkgconfig ${PKG_CONFIG_EXECUTABLE} --libs --static libavutil` + swscale=`PKG_CONFIG_PATH=${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/lib/pkgconfig ${PKG_CONFIG_EXECUTABLE} --libs --static libswscale` + swresample=`PKG_CONFIG_PATH=${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/lib/pkgconfig ${PKG_CONFIG_EXECUTABLE} --libs --static libswresample` + gnutls=`PKG_CONFIG_PATH=${DEPENDS_PATH}/lib/pkgconfig/ ${PKG_CONFIG_EXECUTABLE} --libs-only-l --static --silence-errors gnutls` + $@ $avcodec $avformat $avcodec $avfilter $swscale $swresample -lpostproc $gnutls +else + $@ +fi") + file(COPY ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/ffmpeg/ffmpeg-link-wrapper + DESTINATION ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR} + FILE_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE) + set(FFMPEG_LINK_EXECUTABLE "${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/ffmpeg-link-wrapper <CMAKE_CXX_COMPILER> <FLAGS> <CMAKE_CXX_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>" PARENT_SCOPE) + set(FFMPEG_CREATE_SHARED_LIBRARY "${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/ffmpeg-link-wrapper <CMAKE_CXX_COMPILER> <CMAKE_SHARED_LIBRARY_CXX_FLAGS> <LANGUAGE_COMPILE_FLAGS> <LINK_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS> <SONAME_FLAG><TARGET_SONAME> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>" PARENT_SCOPE) + set(FFMPEG_INCLUDE_DIRS ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/include) + set(FFMPEG_DEFINITIONS -DUSE_STATIC_FFMPEG=1) + set(FFMPEG_FOUND 1) + set_target_properties(ffmpeg PROPERTIES FOLDER "External Projects") +endmacro() + # Allows building with external ffmpeg not found in system paths, # without library version checks @@ -48,13 +143,16 @@ if(WITH_FFMPEG) set(FFMPEG_PATH ${WITH_FFMPEG}) message(STATUS "Warning: FFmpeg version checking disabled") set(REQUIRED_FFMPEG_VERSION undef) - unset(_avcodec_ver) - unset(_avfilter_ver) - unset(_avformat_ver) - unset(_avutil_ver) - unset(_swscale_ver) - unset(_swresample_ver) - unset(_postproc_ver) +else() + # required ffmpeg library versions + set(REQUIRED_FFMPEG_VERSION 4.4.1) + set(_avcodec_ver ">=58.134.100") + set(_avfilter_ver ">=7.110.100") + set(_avformat_ver ">=58.76.100") + set(_avutil_ver ">=56.70.100") + set(_postproc_ver ">=55.9.100") + set(_swresample_ver ">=3.9.100") + set(_swscale_ver ">=5.9.100") endif() # Allows building with external ffmpeg not found in system paths, @@ -63,8 +161,10 @@ if(FFMPEG_PATH) set(ENABLE_INTERNAL_FFMPEG OFF) endif() -# external FFMPEG -if(NOT ENABLE_INTERNAL_FFMPEG OR KODI_DEPENDSBUILD) +if(ENABLE_INTERNAL_FFMPEG) + buildFFMPEG() +else() + # external FFMPEG if(FFMPEG_PATH) list(APPEND CMAKE_PREFIX_PATH ${FFMPEG_PATH}) endif() @@ -165,153 +265,49 @@ if(NOT ENABLE_INTERNAL_FFMPEG OR KODI_DEPENDSBUILD) FFMPEG_VERSION FAIL_MESSAGE "FFmpeg ${REQUIRED_FFMPEG_VERSION} not found, please consider using -DENABLE_INTERNAL_FFMPEG=ON") + if(FFMPEG_FOUND) + set(FFMPEG_LDFLAGS ${PC_FFMPEG_LDFLAGS} CACHE STRING "ffmpeg linker flags") + + set(FFMPEG_LIBRARIES ${FFMPEG_LIBAVCODEC} ${FFMPEG_LIBAVFILTER} + ${FFMPEG_LIBAVFORMAT} ${FFMPEG_LIBAVUTIL} + ${FFMPEG_LIBSWSCALE} ${FFMPEG_LIBSWRESAMPLE} + ${FFMPEG_LIBPOSTPROC} ${FFMPEG_LDFLAGS}) + + # check if ffmpeg libs are statically linked + set(FFMPEG_LIB_TYPE SHARED) + foreach(_fflib IN LISTS FFMPEG_LIBRARIES) + if(${_fflib} MATCHES ".+\.a$" AND PC_FFMPEG_STATIC_LDFLAGS) + set(FFMPEG_LDFLAGS ${PC_FFMPEG_STATIC_LDFLAGS} CACHE STRING "ffmpeg linker flags" FORCE) + set(FFMPEG_LIB_TYPE STATIC) + break() + endif() + endforeach() + endif() else() - message(STATUS "FFmpeg ${REQUIRED_FFMPEG_VERSION} not found, falling back to internal build") - unset(FFMPEG_INCLUDE_DIRS) - unset(FFMPEG_INCLUDE_DIRS CACHE) - unset(FFMPEG_LIBRARIES) - unset(FFMPEG_LIBRARIES CACHE) - unset(FFMPEG_DEFINITIONS) - unset(FFMPEG_DEFINITIONS CACHE) - endif() - - if(FFMPEG_FOUND) - set(FFMPEG_LDFLAGS ${PC_FFMPEG_LDFLAGS} CACHE STRING "ffmpeg linker flags") - - # check if ffmpeg libs are statically linked - set(FFMPEG_LIB_TYPE SHARED) - foreach(_fflib IN LISTS FFMPEG_LIBRARIES) - if(${_fflib} MATCHES ".+\.a$" AND PC_FFMPEG_STATIC_LDFLAGS) - set(FFMPEG_LDFLAGS ${PC_FFMPEG_STATIC_LDFLAGS} CACHE STRING "ffmpeg linker flags" FORCE) - set(FFMPEG_LIB_TYPE STATIC) - break() - endif() - endforeach() - - set(FFMPEG_LIBRARIES ${FFMPEG_LIBAVCODEC} ${FFMPEG_LIBAVFILTER} - ${FFMPEG_LIBAVFORMAT} ${FFMPEG_LIBAVUTIL} - ${FFMPEG_LIBSWSCALE} ${FFMPEG_LIBSWRESAMPLE} - ${FFMPEG_LIBPOSTPROC} ${FFMPEG_LDFLAGS}) - list(APPEND FFMPEG_DEFINITIONS -DFFMPEG_VER_SHA=\"${FFMPEG_VERSION}\") - - if(NOT TARGET ffmpeg) - add_library(ffmpeg ${FFMPEG_LIB_TYPE} IMPORTED) - set_target_properties(ffmpeg PROPERTIES - FOLDER "External Projects" - IMPORTED_LOCATION "${FFMPEG_LIBRARIES}" - INTERFACE_INCLUDE_DIRECTORIES "${FFMPEG_INCLUDE_DIRS}" - INTERFACE_LINK_LIBRARIES "${FFMPEG_LDFLAGS}" - INTERFACE_COMPILE_DEFINITIONS "${FFMPEG_DEFINITIONS}") + if(FFMPEG_PATH) + message(FATAL_ERROR "FFmpeg not found, please consider using -DENABLE_INTERNAL_FFMPEG=ON") + else() + message(STATUS "FFmpeg ${REQUIRED_FFMPEG_VERSION} not found, falling back to internal build") + buildFFMPEG() endif() endif() endif() -# Internal FFMPEG -if(NOT FFMPEG_FOUND) - include(ExternalProject) - include(cmake/scripts/common/ModuleHelpers.cmake) +if(FFMPEG_FOUND) - get_archive_name(ffmpeg) + list(APPEND FFMPEG_DEFINITIONS -DFFMPEG_VER_SHA=\"${FFMPEG_VERSION}\") - # allow user to override the download URL with a local tarball - # needed for offline build envs - if(FFMPEG_URL) - get_filename_component(FFMPEG_URL "${FFMPEG_URL}" ABSOLUTE) - else() - # github tarball format is tagname.tar.gz (eg 4.4-N-Alpha1.tar.gz) - # tagname is our FFMPEG_VER from VERSION file. - set(FFMPEG_URL ${FFMPEG_BASE_URL}/archive/${FFMPEG_VER}.tar.gz) - endif() - if(VERBOSE) - message(STATUS "FFMPEG_URL: ${FFMPEG_URL}") - endif() - - if (NOT DAV1D_FOUND) - message(STATUS "dav1d not found, internal ffmpeg build will be missing AV1 support!") + if(NOT TARGET ffmpeg) + add_library(ffmpeg ${FFMPEG_LIB_TYPE} IMPORTED) + set_target_properties(ffmpeg PROPERTIES + FOLDER "External Projects" + IMPORTED_LOCATION "${FFMPEG_LIBRARIES}" + INTERFACE_INCLUDE_DIRECTORIES "${FFMPEG_INCLUDE_DIRS}" + INTERFACE_LINK_LIBRARIES "${FFMPEG_LDFLAGS}" + INTERFACE_COMPILE_DEFINITIONS "${FFMPEG_DEFINITIONS}") endif() - set(FFMPEG_OPTIONS -DENABLE_CCACHE=${ENABLE_CCACHE} - -DCCACHE_PROGRAM=${CCACHE_PROGRAM} - -DENABLE_VAAPI=${ENABLE_VAAPI} - -DENABLE_VDPAU=${ENABLE_VDPAU} - -DENABLE_DAV1D=${DAV1D_FOUND} - -DEXTRA_FLAGS=${FFMPEG_EXTRA_FLAGS}) - - if(KODI_DEPENDSBUILD) - set(CROSS_ARGS -DDEPENDS_PATH=${DEPENDS_PATH} - -DPKG_CONFIG_EXECUTABLE=${PKG_CONFIG_EXECUTABLE} - -DCROSSCOMPILING=${CMAKE_CROSSCOMPILING} - -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} - -DOS=${OS} - -DCMAKE_AR=${CMAKE_AR}) - endif() - set(LINKER_FLAGS ${CMAKE_EXE_LINKER_FLAGS}) - list(APPEND LINKER_FLAGS ${SYSTEM_LDFLAGS}) - - externalproject_add(ffmpeg - URL ${FFMPEG_URL} - URL_HASH ${FFMPEG_HASH} - DOWNLOAD_NAME ${FFMPEG_ARCHIVE} - DOWNLOAD_DIR ${TARBALL_DIR} - PREFIX ${CORE_BUILD_DIR}/ffmpeg - CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR} - -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} - -DFFMPEG_VER=${FFMPEG_VER} - -DCORE_SYSTEM_NAME=${CORE_SYSTEM_NAME} - -DCORE_PLATFORM_NAME=${CORE_PLATFORM_NAME_LC} - -DCPU=${CPU} - -DENABLE_NEON=${ENABLE_NEON} - -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} - -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} - -DENABLE_CCACHE=${ENABLE_CCACHE} - -DCMAKE_C_FLAGS=${CMAKE_C_FLAGS} - -DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS} - -DCMAKE_EXE_LINKER_FLAGS=${LINKER_FLAGS} - ${CROSS_ARGS} - ${FFMPEG_OPTIONS} - -DPKG_CONFIG_PATH=${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/lib/pkgconfig - PATCH_COMMAND ${CMAKE_COMMAND} -E copy - ${CMAKE_SOURCE_DIR}/tools/depends/target/ffmpeg/CMakeLists.txt - <SOURCE_DIR> && - ${CMAKE_COMMAND} -E copy - ${CMAKE_SOURCE_DIR}/tools/depends/target/ffmpeg/FindGnuTls.cmake - <SOURCE_DIR>) - - if (ENABLE_INTERNAL_DAV1D) - add_dependencies(ffmpeg dav1d) - endif() - - find_program(BASH_COMMAND bash) - if(NOT BASH_COMMAND) - message(FATAL_ERROR "Internal FFmpeg requires bash.") - endif() - file(WRITE ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/ffmpeg/ffmpeg-link-wrapper -"#!${BASH_COMMAND} -if [[ $@ == *${APP_NAME_LC}.bin* || $@ == *${APP_NAME_LC}${APP_BINARY_SUFFIX}* || $@ == *${APP_NAME_LC}.so* || $@ == *${APP_NAME_LC}-test* ]] -then - avformat=`PKG_CONFIG_PATH=${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/lib/pkgconfig ${PKG_CONFIG_EXECUTABLE} --libs --static libavcodec` - avcodec=`PKG_CONFIG_PATH=${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/lib/pkgconfig ${PKG_CONFIG_EXECUTABLE} --libs --static libavformat` - avfilter=`PKG_CONFIG_PATH=${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/lib/pkgconfig ${PKG_CONFIG_EXECUTABLE} --libs --static libavfilter` - avutil=`PKG_CONFIG_PATH=${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/lib/pkgconfig ${PKG_CONFIG_EXECUTABLE} --libs --static libavutil` - swscale=`PKG_CONFIG_PATH=${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/lib/pkgconfig ${PKG_CONFIG_EXECUTABLE} --libs --static libswscale` - swresample=`PKG_CONFIG_PATH=${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/lib/pkgconfig ${PKG_CONFIG_EXECUTABLE} --libs --static libswresample` - gnutls=`PKG_CONFIG_PATH=${DEPENDS_PATH}/lib/pkgconfig/ ${PKG_CONFIG_EXECUTABLE} --libs-only-l --static --silence-errors gnutls` - $@ $avcodec $avformat $avcodec $avfilter $swscale $swresample -lpostproc $gnutls -else - $@ -fi") - file(COPY ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/ffmpeg/ffmpeg-link-wrapper - DESTINATION ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR} - FILE_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE) - set(FFMPEG_LINK_EXECUTABLE "${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/ffmpeg-link-wrapper <CMAKE_CXX_COMPILER> <FLAGS> <CMAKE_CXX_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>" PARENT_SCOPE) - set(FFMPEG_CREATE_SHARED_LIBRARY "${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/ffmpeg-link-wrapper <CMAKE_CXX_COMPILER> <CMAKE_SHARED_LIBRARY_CXX_FLAGS> <LANGUAGE_COMPILE_FLAGS> <LINK_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS> <SONAME_FLAG><TARGET_SONAME> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>" PARENT_SCOPE) - set(FFMPEG_INCLUDE_DIRS ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/include) - list(APPEND FFMPEG_DEFINITIONS -DFFMPEG_VER_SHA=\"${FFMPEG_VER}\" - -DUSE_STATIC_FFMPEG=1) - set(FFMPEG_FOUND 1) - set_target_properties(ffmpeg PROPERTIES FOLDER "External Projects") + set_property(GLOBAL APPEND PROPERTY INTERNAL_DEPS_PROP ffmpeg) endif() -set_property(GLOBAL APPEND PROPERTY INTERNAL_DEPS_PROP ffmpeg) - mark_as_advanced(FFMPEG_INCLUDE_DIRS FFMPEG_LIBRARIES FFMPEG_LDFLAGS FFMPEG_DEFINITIONS FFMPEG_FOUND) diff --git a/tools/depends/target/ffmpeg/FindGnuTls.cmake b/cmake/modules/FindGnuTLS.cmake index 68c35d6b7e..62e3ea7a88 100644 --- a/tools/depends/target/ffmpeg/FindGnuTls.cmake +++ b/cmake/modules/FindGnuTLS.cmake @@ -18,7 +18,7 @@ if(NOT GNUTLS_FOUND) endif() include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(GnuTls DEFAULT_MSG GNUTLS_INCLUDE_DIRS GNUTLS_LIBRARIES) +find_package_handle_standard_args(GnuTLS DEFAULT_MSG GNUTLS_INCLUDE_DIRS GNUTLS_LIBRARIES) if(GNUTLS_FOUND) list(APPEND GNUTLS_DEFINITIONS -DHAVE_GNUTLS=1) diff --git a/cmake/modules/FindNASM.cmake b/cmake/modules/FindNASM.cmake new file mode 100644 index 0000000000..fc9daa0768 --- /dev/null +++ b/cmake/modules/FindNASM.cmake @@ -0,0 +1,30 @@ +#.rst: +# FindNASM +# ---------- +# Finds nasm executable +# +# This will define the following variables:: +# +# NASM_EXECUTABLE - nasm executable + +include(FindPackageHandleStandardArgs) + +find_program(NASM_EXECUTABLE nasm) + +if(NASM_EXECUTABLE) + execute_process(COMMAND ${NASM_EXECUTABLE} -version + OUTPUT_VARIABLE nasm_version + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + if(nasm_version MATCHES "^NASM version ([0-9\\.]*)") + set(NASM_VERSION_STRING "${CMAKE_MATCH_1}") + endif() +endif() + +# Provide standardized success/failure messages +find_package_handle_standard_args(NASM + REQUIRED_VARS NASM_EXECUTABLE + VERSION_VAR NASM_VERSION_STRING) + +mark_as_advanced(NASM_EXECUTABLE) diff --git a/tools/depends/target/ffmpeg/CMakeLists.txt b/tools/depends/target/ffmpeg/CMakeLists.txt index f05c54a823..94689abb88 100644 --- a/tools/depends/target/ffmpeg/CMakeLists.txt +++ b/tools/depends/target/ffmpeg/CMakeLists.txt @@ -2,22 +2,41 @@ project(ffmpeg) cmake_minimum_required(VERSION 2.8) -list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}) - if(ENABLE_CCACHE AND CCACHE_PROGRAM) - set(ffmpeg_conf "--cc=${CCACHE_PROGRAM} ${CMAKE_C_COMPILER}" "--cxx=${CCACHE_PROGRAM} ${CMAKE_CXX_COMPILER}") + set(ffmpeg_conf "--cc=${CCACHE_PROGRAM} ${CMAKE_C_COMPILER}" + "--cxx=${CCACHE_PROGRAM} ${CMAKE_CXX_COMPILER}" + ) else() - set(ffmpeg_conf --cc=${CMAKE_C_COMPILER} --cxx=${CMAKE_CXX_COMPILER}) + set(ffmpeg_conf --cc=${CMAKE_C_COMPILER} + --cxx=${CMAKE_CXX_COMPILER} + ) endif() if(CROSSCOMPILING) set(pkgconf "PKG_CONFIG_LIBDIR=${DEPENDS_PATH}/lib/pkgconfig") - list(APPEND ffmpeg_conf --pkg-config=${PKG_CONFIG_EXECUTABLE} --pkg-config-flags=--static) - list(APPEND ffmpeg_conf --enable-cross-compile --cpu=${CPU} --arch=${CPU} --target-os=${OS}) - list(APPEND ffmpeg_conf --ar=${CMAKE_AR} --strip=${CMAKE_STRIP}) + list(APPEND ffmpeg_conf --pkg-config=${PKG_CONFIG_EXECUTABLE} + --pkg-config-flags=--static + --enable-cross-compile + --enable-pic + --ar=${CMAKE_AR} + --strip=${CMAKE_STRIP} + ) + message(STATUS "CROSS: ${ffmpeg_conf}") endif() +set(CONFIGARCH --arch=${CPU}) + +list(APPEND ffmpeg_conf --disable-doc + --disable-devices + --disable-programs + --disable-sdl2 + --enable-gpl + --enable-postproc + --enable-runtime-cpudetect + --enable-pthreads + ) + if(CMAKE_C_FLAGS) list(APPEND ffmpeg_conf --extra-cflags=${CMAKE_C_FLAGS}) endif() @@ -39,7 +58,9 @@ if(CMAKE_BUILD_TYPE STREQUAL Release) endif() if(CORE_SYSTEM_NAME STREQUAL linux OR CORE_SYSTEM_NAME STREQUAL freebsd) - list(APPEND ffmpeg_conf --enable-pic) + list(APPEND ffmpeg_conf --enable-pic + --target-os=linux + ) if(ENABLE_VAAPI) list(APPEND ffmpeg_conf --enable-vaapi) else() @@ -51,36 +72,49 @@ if(CORE_SYSTEM_NAME STREQUAL linux OR CORE_SYSTEM_NAME STREQUAL freebsd) list(APPEND ffmpeg_conf --disable-vdpau) endif() elseif(CORE_SYSTEM_NAME STREQUAL android) + list(APPEND ffmpeg_conf --target-os=android + --extra-libs=-liconv + --disable-linux-perf + ) if(CPU MATCHES arm64) - list(APPEND ffmpeg_conf --cpu=cortex-a53 --arch=aarch64) + set(CONFIGARCH --arch=aarch64) + list(APPEND ffmpeg_conf --cpu=cortex-a53) elseif(CPU MATCHES arm) list(APPEND ffmpeg_conf --cpu=cortex-a9) elseif(CPU MATCHES x86_64) - list(APPEND ffmpeg_conf --cpu=x86_64 --enable-pic) + list(APPEND ffmpeg_conf --cpu=x86_64) else() list(APPEND ffmpeg_conf --cpu=i686 --disable-mmx) endif() - list(APPEND ffmpeg_conf --target-os=linux --extra-libs=-liconv --disable-linux-perf) elseif(CORE_SYSTEM_NAME STREQUAL darwin_embedded) - list(APPEND ffmpeg_conf --disable-crystalhd --enable-videotoolbox - --target-os=darwin) + list(APPEND ffmpeg_conf --disable-crystalhd + --enable-videotoolbox + --target-os=darwin + --disable-securetransport + ) elseif(CORE_SYSTEM_NAME STREQUAL osx) - list(APPEND ffmpeg_conf --disable-crystalhd --enable-videotoolbox + list(APPEND ffmpeg_conf --disable-crystalhd + --enable-videotoolbox --target-os=darwin - --disable-securetransport) + ) endif() if(CPU MATCHES arm) - list(APPEND ffmpeg_conf --enable-pic --disable-armv5te --disable-armv6t2) + list(APPEND ffmpeg_conf --disable-armv5te --disable-armv6t2) elseif(CPU MATCHES mips) list(APPEND ffmpeg_conf --disable-mips32r2 --disable-mipsdsp --disable-mipsdspr2) endif() -find_package(GnuTls) +find_package(GnuTLS) if(GNUTLS_FOUND) list(APPEND ffmpeg_conf --enable-gnutls) endif() +if(CPU MATCHES x86 OR CPU MATCHES x86_64) + find_package(NASM REQUIRED) + list(APPEND ffmpeg_conf --x86asmexe=${NASM_EXECUTABLE}) +endif() + if(ENABLE_DAV1D) list(APPEND ffmpeg_conf --enable-libdav1d) set(pkgconf_path "PKG_CONFIG_PATH=${PKG_CONFIG_PATH}") @@ -92,6 +126,8 @@ if(EXTRA_FLAGS) list(APPEND ffmpeg_conf ${EXTRA_FLAGS}) endif() +list(APPEND ffmpeg_conf ${CONFIGARCH}) + message(STATUS "FFMPEG_CONF: ${ffmpeg_conf}") set(MAKE_COMMAND $(MAKE)) @@ -110,13 +146,6 @@ externalproject_add(ffmpeg CONFIGURE_COMMAND ${pkgconf} ${pkgconf_path} <SOURCE_DIR>/configure --prefix=${CMAKE_INSTALL_PREFIX} --extra-version="kodi-${FFMPEG_VER}" - --disable-devices - --disable-doc - --disable-programs - --enable-gpl - --enable-runtime-cpudetect - --enable-postproc - --enable-pthreads ${ffmpeg_conf} BUILD_COMMAND ${MAKE_COMMAND}) |