# 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()
