blob: c7304d4de9b9e21cd02dba5f01eeee99ca6b456a [file] [log] [blame]
set(AVIF_LOCAL_DAV1D_TAG "1.5.0")
function(avif_build_local_dav1d)
set(download_step_args)
if(EXISTS "${AVIF_SOURCE_DIR}/ext/dav1d")
message(STATUS "libavif(AVIF_CODEC_DAV1D=LOCAL): ext/dav1d found, using as SOURCE_DIR")
set(source_dir "${AVIF_SOURCE_DIR}/ext/dav1d")
else()
message(STATUS "libavif(AVIF_CODEC_DAV1D=LOCAL): ext/dav1d not found, fetching")
set(source_dir "${FETCHCONTENT_BASE_DIR}/dav1d-src")
list(APPEND download_step_args GIT_REPOSITORY https://code.videolan.org/videolan/dav1d.git GIT_TAG
${AVIF_LOCAL_DAV1D_TAG} GIT_SHALLOW ON
)
endif()
find_program(NINJA_EXECUTABLE NAMES ninja ninja-build REQUIRED)
find_program(MESON_EXECUTABLE meson REQUIRED)
set(PATH $ENV{PATH})
if(WIN32)
string(REPLACE ";" "\$<SEMICOLON>" PATH "${PATH}")
endif()
if(ANDROID_TOOLCHAIN_ROOT)
set(PATH "${ANDROID_TOOLCHAIN_ROOT}/bin$<IF:$<BOOL:${WIN32}>,$<SEMICOLON>,:>${PATH}")
endif()
if(ANDROID)
list(APPEND CMAKE_PROGRAM_PATH "${ANDROID_TOOLCHAIN_ROOT}/bin")
if(CMAKE_SYSTEM_PROCESSOR STREQUAL "armv7-a")
set(android_arch "arm")
elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64")
set(android_arch "aarch64")
elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
set(android_arch "x86_64")
else()
set(android_arch "x86")
endif()
set(CROSS_FILE "${source_dir}/package/crossfiles/${android_arch}-android.meson")
elseif(APPLE)
# If we are cross compiling generate the corresponding file to use with meson
if(NOT CMAKE_SYSTEM_PROCESSOR STREQUAL CMAKE_HOST_SYSTEM_PROCESSOR)
string(TOLOWER "${CMAKE_SYSTEM_NAME}" cross_system_name)
if(CMAKE_C_BYTE_ORDER STREQUAL "BIG_ENDIAN")
set(cross_system_endian "big")
else()
set(cross_system_endian "little")
endif()
if(CMAKE_SYSTEM_PROCESSOR STREQUAL "arm64")
set(cross_system_processor "aarch64")
else()
set(cross_system_processor "${CMAKE_SYSTEM_PROCESSOR}")
endif()
if(CMAKE_OSX_DEPLOYMENT_TARGET)
set(cross_osx_deployment_target "-mmacosx-version-min=${CMAKE_OSX_DEPLOYMENT_TARGET}")
endif()
set(CROSS_FILE "${PROJECT_BINARY_DIR}/crossfile-apple.meson")
configure_file("cmake/Meson/crossfile-apple.meson.in" "${CROSS_FILE}")
endif()
endif()
if(CROSS_FILE)
set(EXTRA_ARGS "--cross-file=${CROSS_FILE}")
endif()
set(build_dir "${FETCHCONTENT_BASE_DIR}/dav1d-build")
set(install_dir "${FETCHCONTENT_BASE_DIR}/dav1d-install")
if(ANDROID_ABI)
set(build_dir "${build_dir}/${ANDROID_ABI}")
set(install_dir "${install_dir}/${ANDROID_ABI}")
endif()
file(MAKE_DIRECTORY ${install_dir}/include)
ExternalProject_Add(
dav1d
${download_step_args}
DOWNLOAD_DIR "${source_dir}"
LOG_DIR "${build_dir}"
STAMP_DIR "${build_dir}"
TMP_DIR "${build_dir}"
SOURCE_DIR "${source_dir}"
BINARY_DIR "${build_dir}"
INSTALL_DIR "${install_dir}"
LIST_SEPARATOR |
UPDATE_COMMAND ""
CONFIGURE_COMMAND
${CMAKE_COMMAND} -E env "PATH=${PATH}" ${MESON_EXECUTABLE} setup --buildtype=release --default-library=static
--prefix=<INSTALL_DIR> --libdir=lib -Denable_asm=true -Denable_tools=false -Denable_examples=false
-Denable_tests=false ${EXTRA_ARGS} <SOURCE_DIR>
BUILD_COMMAND ${CMAKE_COMMAND} -E env "PATH=${PATH}" ${NINJA_EXECUTABLE} -C <BINARY_DIR>
INSTALL_COMMAND ${CMAKE_COMMAND} -E env "PATH=${PATH}" ${NINJA_EXECUTABLE} -C <BINARY_DIR> install
BUILD_BYPRODUCTS <INSTALL_DIR>/lib/libdav1d.a
)
add_library(dav1d::dav1d STATIC IMPORTED)
set_target_properties(dav1d::dav1d PROPERTIES IMPORTED_LOCATION ${install_dir}/lib/libdav1d.a AVIF_LOCAL ON)
target_include_directories(dav1d::dav1d INTERFACE "${install_dir}/include")
target_link_directories(dav1d::dav1d INTERFACE ${install_dir}/lib)
add_dependencies(dav1d::dav1d dav1d)
endfunction()
set(AVIF_DAV1D_BUILD_DIR "${AVIF_SOURCE_DIR}/ext/dav1d/build")
# If ${ANDROID_ABI} is set, look for the library under that subdirectory.
if(DEFINED ANDROID_ABI)
set(AVIF_DAV1D_BUILD_DIR "${AVIF_DAV1D_BUILD_DIR}/${ANDROID_ABI}")
endif()
set(LIB_FILENAME "${AVIF_DAV1D_BUILD_DIR}/src/libdav1d${CMAKE_STATIC_LIBRARY_SUFFIX}")
if(NOT EXISTS "${LIB_FILENAME}" AND NOT "${CMAKE_STATIC_LIBRARY_SUFFIX}" STREQUAL ".a")
# On windows, meson will produce a libdav1d.a instead of the expected libdav1d.dll/.lib.
# See https://github.com/mesonbuild/meson/issues/8153.
set(LIB_FILENAME "${AVIF_DAV1D_BUILD_DIR}/src/libdav1d.a")
endif()
if(EXISTS "${LIB_FILENAME}")
message(STATUS "libavif(AVIF_CODEC_DAV1D=LOCAL): compiled library found at ${LIB_FILENAME}")
add_library(dav1d::dav1d STATIC IMPORTED)
set_target_properties(dav1d::dav1d PROPERTIES IMPORTED_LOCATION ${LIB_FILENAME} AVIF_LOCAL ON)
target_include_directories(
dav1d::dav1d INTERFACE "${AVIF_DAV1D_BUILD_DIR}" "${AVIF_DAV1D_BUILD_DIR}/include"
"${AVIF_DAV1D_BUILD_DIR}/include/dav1d" "${AVIF_SOURCE_DIR}/ext/dav1d/include"
)
else()
message(STATUS "libavif(AVIF_CODEC_DAV1D=LOCAL): compiled library not found at ${LIB_FILENAME}; using ExternalProject")
avif_build_local_dav1d()
endif()
if(EXISTS "${AVIF_SOURCE_DIR}/ext/dav1d")
set_target_properties(dav1d::dav1d PROPERTIES FOLDER "ext/dav1d")
endif()