blob: e44cba05e1f32ac991d53f26304d50e6f40ceddb [file] [log] [blame]
# Copyright (c) 2021, Alliance for Open Media. All rights reserved
#
# This source code is subject to the terms of the BSD 2 Clause License and the
# Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License was
# not distributed with this source code in the LICENSE file, you can obtain it
# at www.aomedia.org/license/software. If the Alliance for Open Media Patent
# License 1.0 was not distributed with this source code in the PATENTS file, you
# can obtain it at www.aomedia.org/license/patent.
cmake_minimum_required(VERSION 3.6)
project(avifinfo C CXX)
set(CMAKE_C_STANDARD 11)
option(AVIFINFO_BUILD_TESTS
"Build and enable tests (GoogleTest must be installed)" OFF)
option(AVIFINFO_BUILD_TOOLS "Build tools" OFF)
# C library
add_library(avifinfo avifinfo.c)
target_include_directories(avifinfo PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
# C++ tests
if(AVIFINFO_BUILD_TESTS)
find_package(Threads REQUIRED) # Needed by GoogleTest
find_package(GTest REQUIRED)
enable_testing()
add_executable(avifinfo_test tests/avifinfo_test.cc)
target_include_directories(avifinfo_test PRIVATE ${GTEST_INCLUDE_DIRS})
target_link_libraries(avifinfo_test PRIVATE ${GTEST_BOTH_LIBRARIES} avifinfo)
add_test(
NAME avifinfo_test
COMMAND ${CMAKE_CURRENT_BINARY_DIR}/avifinfo_test
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/tests)
endif()
# C++ tools
if(AVIFINFO_BUILD_TOOLS)
find_package(Threads REQUIRED) # For aom
# Clone and build libavif and its dependency aom.
include(ExternalProject)
set(EXTERNAL_INSTALL_LOCATION ${CMAKE_BINARY_DIR}/external)
ExternalProject_Add(
libavif
GIT_REPOSITORY https://github.com/AOMediaCodec/libavif
PATCH_COMMAND cd ${CMAKE_BINARY_DIR}/libavif-prefix/src/libavif/ext &&
./aom.cmd
UPDATE_DISCONNECTED 1 # Avoid building aom everytime.
# aom.cmd builds aom as static so libavif should be built as static too.
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${EXTERNAL_INSTALL_LOCATION}
-DAVIF_CODEC_AOM=ON -DAVIF_LOCAL_AOM=ON -DBUILD_SHARED_LIBS=OFF)
add_executable(avifinfo_tool tools/avifinfo_tool.cc tests/avifinfo_fuzz.cc)
set_property(TARGET avifinfo_tool PROPERTY CXX_STANDARD 17) # for filesystem
target_include_directories(avifinfo_tool SYSTEM
PRIVATE ${EXTERNAL_INSTALL_LOCATION}/include)
# libavif's CMakeLists.txt uses a PRIVATE target_link_libraries() so
# avifinfo_tool must be linked to aom too (and thus also to pthread).
target_link_directories(
avifinfo_tool PRIVATE ${EXTERNAL_INSTALL_LOCATION}/lib
${CMAKE_BINARY_DIR}/libavif-prefix/src/libavif/ext/aom/build.libavif)
target_link_libraries(avifinfo_tool PRIVATE avifinfo avif aom
Threads::Threads)
add_dependencies(avifinfo_tool libavif)
endif()