#
# Copyright (c) 2021, Alliance for Open Media. All rights reserved
#
# This source code is subject to the terms of the BSD 3-Clause Clear License and
# the Alliance for Open Media Patent License 1.0. If the BSD 3-Clause Clear
# License was not distributed with this source code in the LICENSE file, you can
# obtain it at aomedia.org/license/software-license/bsd-3-c-c/.  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 aomedia.org/license/patent-license/.
#
cmake_minimum_required(VERSION 3.16)

set(AOM_ROOT "${CMAKE_CURRENT_SOURCE_DIR}")
set(AOM_CONFIG_DIR "${CMAKE_CURRENT_BINARY_DIR}")
if("${AOM_ROOT}" STREQUAL "${AOM_CONFIG_DIR}")
  message(
    FATAL_ERROR
      "Building from within the aom source tree is not supported.\n"
      "Hint: Run these commands\n"
      "$ rm -rf CMakeCache.txt CMakeFiles\n"
      "$ mkdir -p ../aom_build\n"
      "$ cd ../aom_build\n"
      "And re-run CMake from the aom_build directory.")
endif()

project(AVM C CXX ASM)

# GENERATED source property global visibility.
if(POLICY CMP0118)
  cmake_policy(SET CMP0118 NEW)
endif()

if(NOT EMSCRIPTEN)
  if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
    set(CMAKE_BUILD_TYPE
        "Release"
        CACHE STRING "Build type: Debug, Release, RelWithDebInfo or MinSizeRel"
              FORCE)
  endif()
endif()

# Updating version info.
# https://www.gnu.org/software/libtool/manual/libtool.html#Updating-version-info
set(SO_VERSION 2)
set(SO_FILE_VERSION 2.0.0)

# Enable generators like Xcode and Visual Studio to place projects in folders.
set_property(GLOBAL PROPERTY USE_FOLDERS TRUE)

include("${AOM_ROOT}/build/cmake/aom_configure.cmake")
include("${AOM_ROOT}/aom_dsp/aom_dsp.cmake")
include("${AOM_ROOT}/aom_mem/aom_mem.cmake")
include("${AOM_ROOT}/aom_ports/aom_ports.cmake")
include("${AOM_ROOT}/aom_scale/aom_scale.cmake")
include("${AOM_ROOT}/aom_util/aom_util.cmake")
include("${AOM_ROOT}/av1/av1.cmake")
include("${AOM_ROOT}/build/cmake/aom_install.cmake")
include("${AOM_ROOT}/build/cmake/sanitizers.cmake")
include("${AOM_ROOT}/build/cmake/util.cmake")
include("${AOM_ROOT}/test/test.cmake")

list(
  APPEND
  AOM_RTCD_SOURCES
  "${AOM_CONFIG_DIR}/config/aom_dsp_rtcd.h"
  "${AOM_CONFIG_DIR}/config/aom_scale_rtcd.h"
  "${AOM_CONFIG_DIR}/config/av1_rtcd.h"
  "${AOM_ROOT}/aom_dsp/aom_dsp_rtcd_defs.pl"
  "${AOM_ROOT}/aom_dsp/aom_dsp_rtcd.c"
  "${AOM_ROOT}/aom_scale/aom_scale_rtcd.pl"
  "${AOM_ROOT}/aom_scale/aom_scale_rtcd.c"
  "${AOM_ROOT}/av1/common/av1_rtcd_defs.pl"
  "${AOM_ROOT}/av1/common/av1_rtcd.c"
  "${AOM_ROOT}/build/cmake/rtcd.pl")

list(
  APPEND
  AOM_LIBWEBM_SOURCES
  "${AOM_ROOT}/third_party/libwebm/common/hdr_util.cc"
  "${AOM_ROOT}/third_party/libwebm/common/hdr_util.h"
  "${AOM_ROOT}/third_party/libwebm/common/webmids.h"
  "${AOM_ROOT}/third_party/libwebm/mkvmuxer/mkvmuxer.cc"
  "${AOM_ROOT}/third_party/libwebm/mkvmuxer/mkvmuxer.h"
  "${AOM_ROOT}/third_party/libwebm/mkvmuxer/mkvmuxertypes.h"
  "${AOM_ROOT}/third_party/libwebm/mkvmuxer/mkvmuxerutil.cc"
  "${AOM_ROOT}/third_party/libwebm/mkvmuxer/mkvmuxerutil.h"
  "${AOM_ROOT}/third_party/libwebm/mkvmuxer/mkvwriter.cc"
  "${AOM_ROOT}/third_party/libwebm/mkvmuxer/mkvwriter.h"
  "${AOM_ROOT}/third_party/libwebm/mkvparser/mkvparser.cc"
  "${AOM_ROOT}/third_party/libwebm/mkvparser/mkvparser.h"
  "${AOM_ROOT}/third_party/libwebm/mkvparser/mkvreader.cc"
  "${AOM_ROOT}/third_party/libwebm/mkvparser/mkvreader.h")

list(
  APPEND
  AOM_LIBYUV_SOURCES
  "${AOM_ROOT}/third_party/libyuv/include/libyuv/basic_types.h"
  "${AOM_ROOT}/third_party/libyuv/include/libyuv/convert.h"
  "${AOM_ROOT}/third_party/libyuv/include/libyuv/convert_argb.h"
  "${AOM_ROOT}/third_party/libyuv/include/libyuv/convert_from.h"
  "${AOM_ROOT}/third_party/libyuv/include/libyuv/cpu_id.h"
  "${AOM_ROOT}/third_party/libyuv/include/libyuv/planar_functions.h"
  "${AOM_ROOT}/third_party/libyuv/include/libyuv/rotate.h"
  "${AOM_ROOT}/third_party/libyuv/include/libyuv/row.h"
  "${AOM_ROOT}/third_party/libyuv/include/libyuv/scale.h"
  "${AOM_ROOT}/third_party/libyuv/include/libyuv/scale_row.h"
  "${AOM_ROOT}/third_party/libyuv/source/cpu_id.cc"
  "${AOM_ROOT}/third_party/libyuv/source/planar_functions.cc"
  "${AOM_ROOT}/third_party/libyuv/source/row_any.cc"
  "${AOM_ROOT}/third_party/libyuv/source/row_common.cc"
  "${AOM_ROOT}/third_party/libyuv/source/row_gcc.cc"
  "${AOM_ROOT}/third_party/libyuv/source/row_mips.cc"
  "${AOM_ROOT}/third_party/libyuv/source/row_neon.cc"
  "${AOM_ROOT}/third_party/libyuv/source/row_neon64.cc"
  "${AOM_ROOT}/third_party/libyuv/source/row_win.cc"
  "${AOM_ROOT}/third_party/libyuv/source/scale.cc"
  "${AOM_ROOT}/third_party/libyuv/source/scale_any.cc"
  "${AOM_ROOT}/third_party/libyuv/source/scale_common.cc"
  "${AOM_ROOT}/third_party/libyuv/source/scale_gcc.cc"
  "${AOM_ROOT}/third_party/libyuv/source/scale_mips.cc"
  "${AOM_ROOT}/third_party/libyuv/source/scale_neon.cc"
  "${AOM_ROOT}/third_party/libyuv/source/scale_neon64.cc"
  "${AOM_ROOT}/third_party/libyuv/source/scale_win.cc")

list(
  APPEND
  AOM_SOURCES
  "${AOM_CONFIG_DIR}/config/aom_config.c"
  "${AOM_CONFIG_DIR}/config/aom_config.h"
  "${AOM_ROOT}/aom/aom.h"
  "${AOM_ROOT}/aom/aom_codec.h"
  "${AOM_ROOT}/aom/aom_decoder.h"
  "${AOM_ROOT}/aom/aom_encoder.h"
  "${AOM_ROOT}/aom/aom_frame_buffer.h"
  "${AOM_ROOT}/aom/aom_image.h"
  "${AOM_ROOT}/aom/aom_integer.h"
  "${AOM_ROOT}/aom/aomcx.h"
  "${AOM_ROOT}/aom/aomdx.h"
  "${AOM_ROOT}/aom/internal/aom_codec_internal.h"
  "${AOM_ROOT}/aom/internal/aom_image_internal.h"
  "${AOM_ROOT}/aom/src/aom_codec.c"
  "${AOM_ROOT}/aom/src/aom_decoder.c"
  "${AOM_ROOT}/aom/src/aom_encoder.c"
  "${AOM_ROOT}/aom/src/aom_image.c"
  "${AOM_ROOT}/aom/src/aom_integer.c")

list(
  APPEND
  AOM_COMMON_APP_UTIL_SOURCES
  "${AOM_ROOT}/av1/arg_defs.h"
  "${AOM_ROOT}/av1/arg_defs.c"
  "${AOM_ROOT}/common/args_helper.c"
  "${AOM_ROOT}/common/args_helper.h"
  "${AOM_ROOT}/common/args.c"
  "${AOM_ROOT}/common/args.h"
  "${AOM_ROOT}/common/av1_config.c"
  "${AOM_ROOT}/common/av1_config.h"
  "${AOM_ROOT}/common/lanczos_resample.h"
  "${AOM_ROOT}/common/lanczos_resample.c"
  "${AOM_ROOT}/common/md5_utils.c"
  "${AOM_ROOT}/common/md5_utils.h"
  "${AOM_ROOT}/common/tools_common.c"
  "${AOM_ROOT}/common/tools_common.h"
  "${AOM_ROOT}/common/video_common.h"
  "${AOM_ROOT}/common/rawenc.c"
  "${AOM_ROOT}/common/rawenc.h"
  "${AOM_ROOT}/common/y4menc.c"
  "${AOM_ROOT}/common/y4menc.h")

list(
  APPEND
  AOM_DECODER_APP_UTIL_SOURCES
  "${AOM_ROOT}/common/ivfdec.c"
  "${AOM_ROOT}/common/ivfdec.h"
  "${AOM_ROOT}/common/obudec.c"
  "${AOM_ROOT}/common/obudec.h"
  "${AOM_ROOT}/common/video_reader.c"
  "${AOM_ROOT}/common/video_reader.h")

list(
  APPEND
  AOM_ENCODER_APP_UTIL_SOURCES
  "${AOM_ROOT}/common/ivfenc.c"
  "${AOM_ROOT}/common/ivfenc.h"
  "${AOM_ROOT}/common/video_writer.c"
  "${AOM_ROOT}/common/video_writer.h"
  "${AOM_ROOT}/common/warnings.c"
  "${AOM_ROOT}/common/warnings.h"
  "${AOM_ROOT}/common/y4minput.c"
  "${AOM_ROOT}/common/y4minput.h"
  "${AOM_ROOT}/common/stream_iter.c"
  "${AOM_ROOT}/examples/encoder_util.h"
  "${AOM_ROOT}/examples/encoder_util.c")

list(APPEND AOM_ENCODER_STATS_SOURCES "${AOM_ROOT}/stats/rate_hist.c"
     "${AOM_ROOT}/stats/rate_hist.h")

list(APPEND AOM_VERSION_SOURCES "${AOM_CONFIG_DIR}/config/aom_version.h")

list(APPEND AOM_WEBM_DECODER_SOURCES "${AOM_ROOT}/common/webmdec.cc"
     "${AOM_ROOT}/common/webmdec.h")

list(APPEND AOM_WEBM_ENCODER_SOURCES "${AOM_ROOT}/common/webmenc.cc"
     "${AOM_ROOT}/common/webmenc.h")

include_directories(
  ${AOM_ROOT}
  ${AOM_CONFIG_DIR}
  ${AOM_ROOT}/apps
  ${AOM_ROOT}/common
  ${AOM_ROOT}/examples
  ${AOM_ROOT}/stats
  ${AOM_ROOT}/third_party/abseil-cpp)

# Targets
add_library(aom_version ${AOM_VERSION_SOURCES})
add_dummy_source_file_to_target(aom_version c)
add_custom_command(
  OUTPUT "${AOM_CONFIG_DIR}/config/aom_version.h"
  COMMAND
    ${CMAKE_COMMAND} ARGS -DAOM_CONFIG_DIR=${AOM_CONFIG_DIR}
    -DAOM_ROOT=${AOM_ROOT} -DGIT_EXECUTABLE=${GIT_EXECUTABLE}
    -DPERL_EXECUTABLE=${PERL_EXECUTABLE} -P
    "${AOM_ROOT}/build/cmake/version.cmake"
  COMMENT "Writing aom_version.h"
  VERBATIM)

add_custom_target(
  aom_version_check
  COMMAND
    ${CMAKE_COMMAND} -DAOM_CONFIG_DIR=${AOM_CONFIG_DIR} -DAOM_ROOT=${AOM_ROOT}
    -DGIT_EXECUTABLE=${GIT_EXECUTABLE} -DPERL_EXECUTABLE=${PERL_EXECUTABLE} -P
    "${AOM_ROOT}/build/cmake/version.cmake"
  COMMENT "Updating version info if necessary."
  VERBATIM)

if(BUILD_SHARED_LIBS AND NOT MSVC)
  # Generate version file immediately for non-MSVC shared builds: The version
  # string is needed for the aom target.
  execute_process(
    COMMAND
      ${CMAKE_COMMAND} -DAOM_CONFIG_DIR=${AOM_CONFIG_DIR}
      -DAOM_ROOT=${AOM_ROOT} -DGIT_EXECUTABLE=${GIT_EXECUTABLE}
      -DPERL_EXECUTABLE=${PERL_EXECUTABLE} -P
      "${AOM_ROOT}/build/cmake/version.cmake")
endif()

add_dependencies(aom_version aom_version_check)

# TODO(tomfinegan): Move rtcd target setup where it belongs for each rtcd
# source.
add_rtcd_build_step(
  "${AOM_ROOT}/aom_dsp/aom_dsp_rtcd_defs.pl"
  "${AOM_CONFIG_DIR}/config/aom_dsp_rtcd.h"
  "${AOM_ROOT}/aom_dsp/aom_dsp_rtcd.c" "aom_dsp_rtcd")
add_rtcd_build_step(
  "${AOM_ROOT}/aom_scale/aom_scale_rtcd.pl"
  "${AOM_CONFIG_DIR}/config/aom_scale_rtcd.h"
  "${AOM_ROOT}/aom_scale/aom_scale_rtcd.c" "aom_scale_rtcd")
add_rtcd_build_step(
  "${AOM_ROOT}/av1/common/av1_rtcd_defs.pl"
  "${AOM_CONFIG_DIR}/config/av1_rtcd.h" "${AOM_ROOT}/av1/common/av1_rtcd.c"
  "av1_rtcd")

add_library(aom_rtcd OBJECT ${AOM_RTCD_SOURCES})
add_dependencies(aom_rtcd aom_version)

if(ENABLE_EXAMPLES)
  add_library(aom_encoder_stats OBJECT ${AOM_ENCODER_STATS_SOURCES})
  set(AOM_LIB_TARGETS ${AOM_LIB_TARGETS} aom_encoder_stats)
endif()

add_library(aom ${AOM_SOURCES} $<TARGET_OBJECTS:aom_rtcd>)
if(BUILD_SHARED_LIBS)
  add_library(aom_static STATIC ${AOM_SOURCES} $<TARGET_OBJECTS:aom_rtcd>)
  set_target_properties(aom_static PROPERTIES OUTPUT_NAME aom)

  if(NOT MSVC)
    # Extract version string and set VERSION/SOVERSION for the aom target.
    extract_version_string("${AOM_CONFIG_DIR}/config/aom_version.h"
                           aom_version_triple)

    # Strip any trailing version information, if present.
    string(FIND "${aom_version_triple}" "-" dash_pos)
    if(NOT dash_pos EQUAL -1)
      string(SUBSTRING "${aom_version_triple}" 0 ${dash_pos} aom_version_triple)
    endif()

    # cmake-format: off
    # VERSION is embedded in the .so file name.
    # libaom.so -> libaom.so.SOVERSION
    # libaom.so.SOVERSION -> libaom.so.VERSION
    # libaom.so.VERSION
    # cmake-format: on
    set_target_properties(aom PROPERTIES SOVERSION ${SO_VERSION})
    set_target_properties(aom PROPERTIES VERSION ${SO_FILE_VERSION})
  endif()
endif()

if(NOT WIN32 AND NOT APPLE)
  target_link_libraries(aom ${AOM_LIB_LINK_TYPE} m)
  if(BUILD_SHARED_LIBS)
    target_link_libraries(aom_static ${AOM_LIB_LINK_TYPE} m)
  endif()
endif()

# List of object and static library targets.
set(AOM_LIB_TARGETS ${AOM_LIB_TARGETS} aom_rtcd aom_mem aom_scale aom)
if(BUILD_SHARED_LIBS)
  set(AOM_LIB_TARGETS ${AOM_LIB_TARGETS} aom_static)
endif()

# Setup dependencies.
setup_aom_dsp_targets()
setup_aom_mem_targets()
setup_aom_ports_targets()
setup_aom_util_targets()
setup_aom_scale_targets()
setup_av1_targets()

# Make all library targets depend on aom_rtcd to make sure it builds first.
foreach(aom_lib ${AOM_LIB_TARGETS})
  if(NOT "${aom_lib}" STREQUAL "aom_rtcd")
    add_dependencies(${aom_lib} aom_rtcd)
  endif()
endforeach()

# Generate C/C++ stub files containing the function usage_exit(). Users of the
# aom_common_app_util library must define this function. This is a convenience
# to allow omission of the function from applications that might want to use
# other pieces of the util support without defining usage_exit().
file(WRITE "${AOM_GEN_SRC_DIR}/usage_exit.c" "void usage_exit(void) {}")
file(WRITE "${AOM_GEN_SRC_DIR}/usage_exit.cc"
     "extern \"C\" void usage_exit(void) {}")

#
# Application and application support targets.
#
if(ENABLE_EXAMPLES
   OR ENABLE_TESTS
   OR ENABLE_TOOLS)
  add_library(aom_common_app_util OBJECT ${AOM_COMMON_APP_UTIL_SOURCES})
  set_property(TARGET ${example} PROPERTY FOLDER examples)
  if(CONFIG_AV1_DECODER)
    add_library(aom_decoder_app_util OBJECT ${AOM_DECODER_APP_UTIL_SOURCES})
    set_property(TARGET ${example} PROPERTY FOLDER examples)
    # obudec depends on internal headers that require *rtcd.h
    add_dependencies(aom_decoder_app_util aom_rtcd)
  endif()
  if(CONFIG_AV1_ENCODER)
    add_library(aom_encoder_app_util OBJECT ${AOM_ENCODER_APP_UTIL_SOURCES})
    set_property(TARGET ${example} PROPERTY FOLDER examples)
  endif()
endif()

if((CONFIG_AV1_DECODER OR CONFIG_AV1_ENCODER) AND ENABLE_EXAMPLES)
  add_executable(resize_util "${AOM_ROOT}/examples/resize_util.c"
                             $<TARGET_OBJECTS:aom_common_app_util>)
  set_property(TARGET ${example} PROPERTY FOLDER examples)
  list(APPEND AOM_APP_TARGETS resize_util)
  add_executable(
    lanczos_resample_y4m
    "${AOM_ROOT}/tools/lanczos/lanczos_resample.c"
    "${AOM_ROOT}/tools/lanczos/lanczos_resample.h"
    "${AOM_ROOT}/tools/lanczos/lanczos_resample_y4m.c")
  add_executable(
    lanczos_resample_yuv
    "${AOM_ROOT}/tools/lanczos/lanczos_resample.c"
    "${AOM_ROOT}/tools/lanczos/lanczos_resample.h"
    "${AOM_ROOT}/tools/lanczos/lanczos_resample_yuv.c")
  list(APPEND AOM_APP_TARGETS lanczos_resample_y4m lanczos_resample_yuv)
  add_executable(
    lanczos_resample_filter
    "${AOM_ROOT}/tools/lanczos/lanczos_resample.c"
    "${AOM_ROOT}/tools/lanczos/lanczos_resample.h"
    "${AOM_ROOT}/tools/lanczos/lanczos_resample_filter.c")
  list(APPEND AOM_APP_TARGETS lanczos_resample_filter)
endif()

if(CONFIG_AV1_DECODER AND ENABLE_EXAMPLES)
  add_executable(
    aomdec "${AOM_ROOT}/apps/aomdec.c" $<TARGET_OBJECTS:aom_common_app_util>
           $<TARGET_OBJECTS:aom_decoder_app_util>)
  add_executable(
    decode_to_md5
    "${AOM_ROOT}/examples/decode_to_md5.c"
    $<TARGET_OBJECTS:aom_common_app_util>
    $<TARGET_OBJECTS:aom_decoder_app_util>)
  add_executable(
    decode_with_drops
    "${AOM_ROOT}/examples/decode_with_drops.c"
    $<TARGET_OBJECTS:aom_common_app_util>
    $<TARGET_OBJECTS:aom_decoder_app_util>)
  add_executable(
    simple_decoder
    "${AOM_ROOT}/examples/simple_decoder.c"
    $<TARGET_OBJECTS:aom_common_app_util>
    $<TARGET_OBJECTS:aom_decoder_app_util>)
  add_executable(
    scalable_decoder
    "${AOM_ROOT}/examples/scalable_decoder.c"
    $<TARGET_OBJECTS:aom_common_app_util>
    $<TARGET_OBJECTS:aom_decoder_app_util>)

  if(CONFIG_ANALYZER)
    add_executable(
      analyzer
      "${AOM_ROOT}/examples/analyzer.cc" $<TARGET_OBJECTS:aom_common_app_util>
      $<TARGET_OBJECTS:aom_decoder_app_util>)
    target_link_libraries(analyzer ${AOM_LIB_LINK_TYPE} ${wxWidgets_LIBRARIES})
    list(APPEND AOM_APP_TARGETS analyzer)
    list(APPEND AOM_DECODER_EXAMPLE_TARGETS analyzer)
  endif()

  if(CONFIG_INSPECTION)
    add_executable(
      inspect
      "${AOM_ROOT}/examples/inspect.c" $<TARGET_OBJECTS:aom_common_app_util>
      $<TARGET_OBJECTS:aom_decoder_app_util>)
    list(APPEND AOM_DECODER_EXAMPLE_TARGETS inspect)

    if(EMSCRIPTEN)
      add_preproc_definition(_POSIX_SOURCE)
      append_link_flag_to_target("inspect" "--emrun")
      append_link_flag_to_target("inspect" "-s USE_PTHREADS=0")
      append_link_flag_to_target("inspect" "-s WASM=1")
      append_link_flag_to_target("inspect" "-s MODULARIZE=1")
      append_link_flag_to_target("inspect" "-s ALLOW_MEMORY_GROWTH=1")
      append_link_flag_to_target(
        "inspect" "-s \'EXTRA_EXPORTED_RUNTIME_METHODS=[\"UTF8ToString\"]\'")
      append_link_flag_to_target("inspect"
                                 "-s EXPORT_NAME=\"\'DecoderModule\'\"")
      append_link_flag_to_target("inspect" "--memory-init-file 0")

      if("${CMAKE_BUILD_TYPE}" STREQUAL "")

        # Default to -O3 when no build type is specified.
        append_compiler_flag("-O3")
      endif()

      em_link_post_js(inspect "${AOM_ROOT}/tools/inspect-post.js")
    endif()
  endif()

  if(CONFIG_EXTRACT_PROTO)
    list(APPEND AOM_EXTRACT_PROTO_SOURCES
         "${AOM_ROOT}/tools/extract_proto/extract_proto.cc"
         "${AOM_ROOT}/tools/extract_proto/enum_mappings.h")
    set(AVM_FRAME_PROTO_PATH "${AOM_ROOT}/tools/extract_proto/avm_frame.proto")
    find_package(Protobuf REQUIRED)
    set(CMAKE_CXX_STANDARD 17)
    set(CMAKE_CXX_STANDARD_REQUIRED ON)
    set(ABSL_PROPAGATE_CXX_STD ON)
    include_directories(${Protobuf_INCLUDE_DIRS})
    protobuf_generate_cpp(AVM_FRAME_PROTO_SRCS AVM_FRAME_PROTO_HDRS
                          ${AVM_FRAME_PROTO_PATH})
    add_subdirectory(third_party/abseil-cpp)
    # Find Python and generate the enums mapping for extract_proto.
    find_package(Python3)
    if(NOT PYTHON3_FOUND)
      message(FATAL_ERROR "python3 is required to build extract_proto.")
    endif()

    set(EXTRACT_PROTO_ENUMS_MAPPING_HEADER
        "${AOM_ROOT}/tools/extract_proto/enum_mappings.h")
    execute_process(
      COMMAND
        ${Python_EXECUTABLE}
        "${AOM_ROOT}/tools/extract_proto/generate_enum_mappings.py"
        --enums_header "${AOM_ROOT}/av1/common/av1_common_int.h" --enums_header
        "${AOM_ROOT}/av1/common/blockd.h" --enums_header
        "${AOM_ROOT}/av1/common/enums.h" --enums_header
        "${AOM_ROOT}/av1/common/filter.h" --enums_header
        "${AOM_ROOT}/av1/common/mv.h" --enums_header
        "${AOM_ROOT}/av1/decoder/accounting.h" --output
        "${AOM_ROOT}/tools/extract_proto/enum_mappings.h"
      OUTPUT_FILE ${EXTRACT_PROTO_ENUMS_MAPPING_HEADER})
    add_executable(
      extract_proto
      ${AOM_EXTRACT_PROTO_SOURCES} ${AVM_FRAME_PROTO_SRCS}
      ${AVM_FRAME_PROTO_HDRS} $<TARGET_OBJECTS:aom_common_app_util>
      $<TARGET_OBJECTS:aom_decoder_app_util>)
    target_link_libraries(
      extract_proto
      PRIVATE absl::base
              absl::flags
              absl::flags_parse
              absl::log
              absl::log_flags
              absl::log_globals
              absl::log_initialize
              absl::status
              absl::statusor
              absl::strings
              ${Protobuf_LIBRARIES})

    list(APPEND AOM_APP_TARGETS extract_proto)
  endif()

  # Maintain a list of decoder example targets.
  list(
    APPEND
    AOM_DECODER_EXAMPLE_TARGETS
    aomdec
    decode_to_md5
    decode_with_drops
    scalable_decoder
    simple_decoder)

  # Add decoder examples to the app targets list.
  list(APPEND AOM_APP_TARGETS ${AOM_DECODER_EXAMPLE_TARGETS})
endif()

if(CONFIG_AV1_ENCODER)
  if(ENABLE_EXAMPLES)
    add_executable(
      aomenc
      "${AOM_ROOT}/apps/aomenc.c" $<TARGET_OBJECTS:aom_common_app_util>
      $<TARGET_OBJECTS:aom_encoder_app_util>
      $<TARGET_OBJECTS:aom_encoder_stats>)
    add_executable(
      lossless_encoder
      "${AOM_ROOT}/examples/lossless_encoder.c"
      $<TARGET_OBJECTS:aom_common_app_util>
      $<TARGET_OBJECTS:aom_encoder_app_util>)
    add_executable(
      set_maps
      "${AOM_ROOT}/examples/set_maps.c" $<TARGET_OBJECTS:aom_common_app_util>
      $<TARGET_OBJECTS:aom_encoder_app_util>)
    add_executable(
      simple_encoder
      "${AOM_ROOT}/examples/simple_encoder.c"
      $<TARGET_OBJECTS:aom_common_app_util>
      $<TARGET_OBJECTS:aom_encoder_app_util>)
    add_executable(
      twopass_encoder
      "${AOM_ROOT}/examples/twopass_encoder.c"
      $<TARGET_OBJECTS:aom_common_app_util>
      $<TARGET_OBJECTS:aom_encoder_app_util>)
    add_executable(
      noise_model
      "${AOM_ROOT}/examples/noise_model.c"
      $<TARGET_OBJECTS:aom_common_app_util>
      $<TARGET_OBJECTS:aom_encoder_app_util>)
    add_executable(
      scalable_encoder
      "${AOM_ROOT}/examples/scalable_encoder.c"
      $<TARGET_OBJECTS:aom_common_app_util>
      $<TARGET_OBJECTS:aom_encoder_app_util>)

    # Maintain a list of encoder example targets.
    list(
      APPEND
      AOM_ENCODER_EXAMPLE_TARGETS
      aomenc
      lossless_encoder
      noise_model
      set_maps
      simple_encoder
      scalable_encoder
      twopass_encoder)
  endif()

  if(ENABLE_TOOLS)
    if(CONFIG_ENTROPY_STATS AND NOT BUILD_SHARED_LIBS)

      # TODO(tomfinegan): Sort out why a simple link command with
      # aom_entropy_optimizer.c won't work on macos, but dragging in all the
      # helper machinery allows the link to succeed.
      add_executable(
        aom_entropy_optimizer
        "${AOM_GEN_SRC_DIR}/usage_exit.c"
        "${AOM_ROOT}/tools/aom_entropy_optimizer.c"
        $<TARGET_OBJECTS:aom_common_app_util>
        $<TARGET_OBJECTS:aom_encoder_app_util>)

      # Maintain a list of encoder tool targets.
      list(APPEND AOM_ENCODER_TOOL_TARGETS aom_entropy_optimizer)
    endif()
  endif()

  # Add encoder examples and tools to the targets list.
  list(APPEND AOM_APP_TARGETS ${AOM_ENCODER_EXAMPLE_TARGETS}
       ${AOM_ENCODER_TOOL_TARGETS})

  if(CONFIG_TENSORFLOW_LITE)
    # Building TFLite from third_party sources. Previously TFLite was fetched
    # from github as part of the build, using the following syntax:
    # cmake-format: off
    # include(FetchContent)
    # set(TFLITE_TAG "v2.17.0")
    # fetchcontent_declare(
    #   tflite
    #   GIT_REPOSITORY https://github.com/tensorflow/tensorflow
    #   GIT_TAG ${TFLITE_TAG}
    #   GIT_SHALLOW TRUE)
    # fetchcontent_getproperties(tflite)
    # if(NOT tflite_POPULATED)
    #   fetchcontent_populate(tflite)
    #   add_subdirectory(${tflite_SOURCE_DIR}/tensorflow/lite/c
    #                    ${tflite_BINARY_DIR})
    # endif()
    # cmake-format: on
    #
    # However some enviroments don't allow internet access during cmake build,
    # so the new approach is to store all the necessary TFLite dependencies as
    # archives inside of the third_party directory. These archives are extracted
    # below and built as sub-projects. The fetchcontent based snippet above can
    # be used in the future to update the stored archives for the dependencies
    # should TFlite version be updated,
    message(STATUS "Building TFLite from local sources...")
    # These are the paths of the stored TFLite dependencies, use the the
    # fetchcontent snippet above, then look for messages like: "Performing
    # download step (download, verify and extract) for 'xyz'" go to
    # "xyz-source", Then archive the source into "xyz.tar.gz" and and add the
    # variable "XYZ_SOURCE_DIR" pointing to "third_party/xyz" like below, also
    # update the command line to extrac the archive below.

    string(
      CONCAT
        EXTRACT_TF_UPDATE_DEPS_CMAKE_CONFIG
        "cd ${CMAKE_CURRENT_SOURCE_DIR}/third_party;"
        "tar -xzf tensorflow.tar.gz; "
        "tar -xzf deps_cmake.tar.gz; "
        "cp deps_cmake/abseil-cpp.cmake ${CMAKE_CURRENT_SOURCE_DIR}/third_party/tensorflow/tensorflow/lite/tools/cmake/modules; "
        "cp deps_cmake/cpuinfo.cmake ${CMAKE_CURRENT_SOURCE_DIR}/third_party/tensorflow/tensorflow/lite/tools/cmake/modules; "
        "cp deps_cmake/eigen.cmake ${CMAKE_CURRENT_SOURCE_DIR}/third_party/tensorflow/tensorflow/lite/tools/cmake/modules; "
        "cp deps_cmake/farmhash.cmake ${CMAKE_CURRENT_SOURCE_DIR}/third_party/tensorflow/tensorflow/lite/tools/cmake/modules; "
        "cp deps_cmake/fft2d.cmake ${CMAKE_CURRENT_SOURCE_DIR}/third_party/tensorflow/tensorflow/lite/tools/cmake/modules; "
        "cp deps_cmake/flatbuffers.cmake ${CMAKE_CURRENT_SOURCE_DIR}/third_party/tensorflow/tensorflow/lite/tools/cmake/modules; "
        "cp deps_cmake/gemmlowp.cmake ${CMAKE_CURRENT_SOURCE_DIR}/third_party/tensorflow/tensorflow/lite/tools/cmake/modules; "
        "cp deps_cmake/ml_dtypes.cmake ${CMAKE_CURRENT_SOURCE_DIR}/third_party/tensorflow/tensorflow/lite/tools/cmake/modules; "
        "cp deps_cmake/neon2sse.cmake ${CMAKE_CURRENT_SOURCE_DIR}/third_party/tensorflow/tensorflow/lite/tools/cmake/modules; "
        "cp deps_cmake/protobuf.cmake ${CMAKE_CURRENT_SOURCE_DIR}/third_party/tensorflow/tensorflow/lite/tools/cmake/modules; "
        "cp deps_cmake/ruy.cmake ${CMAKE_CURRENT_SOURCE_DIR}/third_party/tensorflow/tensorflow/lite/tools/cmake/modules; "
        "cp deps_cmake/xnnpack.cmake ${CMAKE_CURRENT_SOURCE_DIR}/third_party/tensorflow/tensorflow/lite/tools/cmake/modules"
    )

    execute_process(COMMAND bash -c "${EXTRACT_TF_UPDATE_DEPS_CMAKE_CONFIG}")
    string(
      CONCAT EXTRACT_DEPS_TO_BUILD
             "cd ${CMAKE_CURRENT_SOURCE_DIR}/third_party; "
             "tar -xzf abseil-cpp.tar.gz -C ${CMAKE_BINARY_DIR}; "
             "tar -xzf eigen.tar.gz -C ${CMAKE_BINARY_DIR}; "
             "tar -xzf neon2sse.tar.gz -C ${CMAKE_BINARY_DIR}; "
             "tar -xzf xnnpack.tar.gz -C ${CMAKE_BINARY_DIR}; "
             "tar -xzf ruy.tar.gz -C ${CMAKE_BINARY_DIR}; "
             "tar -xzf farmhash.tar.gz -C ${CMAKE_BINARY_DIR}; "
             "tar -xzf fft2d.tar.gz -C ${CMAKE_BINARY_DIR}; "
             "tar -xzf gemmlowp.tar.gz -C ${CMAKE_BINARY_DIR}; "
             "tar -xzf ml_dtypes.tar.gz -C ${CMAKE_BINARY_DIR}; "
             "tar -xzf cpuinfo.tar.gz -C ${CMAKE_BINARY_DIR}; "
             "tar -xzf protobuf.tar.gz -C ${CMAKE_BINARY_DIR}; "
             "tar -xzf flatbuffers.tar.gz -C ${CMAKE_BINARY_DIR}; "
             "tar -xzf fp16.tar.gz -C ${CMAKE_BINARY_DIR}; "
             "tar -xzf pthreadpool.tar.gz -C ${CMAKE_BINARY_DIR}; "
             "tar -xzf psimd.tar.gz -C ${CMAKE_BINARY_DIR}; "
             "tar -xzf FXdiv.tar.gz -C ${CMAKE_BINARY_DIR}; "
             "tar -xzf benchmark.tar.gz -C ${CMAKE_BINARY_DIR}; "
             "tar -xzf googletest.tar.gz -C ${CMAKE_BINARY_DIR}")

    execute_process(COMMAND bash -c "${EXTRACT_DEPS_TO_BUILD}")

    set(FP16_SOURCE_DIR ${CMAKE_BINARY_DIR}/fp16)
    set(PTHREADPOOL_SOURCE_DIR ${CMAKE_BINARY_DIR}/pthreadpool)
    set(PSIMD_SOURCE_DIR ${CMAKE_BINARY_DIR}/psimd)
    set(FXDIV_SOURCE_DIR ${CMAKE_BINARY_DIR}/FXdiv)
    set(GOOGLEBENCHMARK_SOURCE_DIR ${CMAKE_BINARY_DIR}/benchmark)
    set(GOOGLETEST_SOURCE_DIR ${CMAKE_BINARY_DIR}/googletest)
    set(abseil-cpp_SOURCE_DIR ${CMAKE_BINARY_DIR}/abseil-cpp)
    set(CPUINFO_SOURCE_DIR ${CMAKE_BINARY_DIR}/cpuinfo)
    set(EIGEN_SOURCE_DIR ${CMAKE_BINARY_DIR}/eigen)
    set(FARMHASH_SOURCE_DIR ${CMAKE_BINARY_DIR}/farmhash)
    set(FFT2D_SOURCE_DIR ${CMAKE_BINARY_DIR}/fft2d)
    set(FLATBUFFERS_SOURCE_DIR ${CMAKE_BINARY_DIR}/flatbuffers)
    set(GEMMLOWP_SOURCE_DIR ${CMAKE_BINARY_DIR}/gemmlowp)
    set(ML_DTYPES_SOURCE_DIR ${CMAKE_BINARY_DIR}/ml_dtypes)
    set(PROTOBUF_SOURCE_DIR ${CMAKE_BINARY_DIR}/protobuf)
    set(RUY_SOURCE_DIR ${CMAKE_BINARY_DIR}/ruy)
    set(NEON2SSE_SOURCE_DIR ${CMAKE_BINARY_DIR}/neon2sse)
    set(XNNPACK_SOURCE_DIR ${CMAKE_BINARY_DIR}/XNNPACK)

    # static linking makes life with TFLite much easier
    set(TFLITE_C_BUILD_SHARED_LIBS OFF)

    # Keep RUY on. Ruy is a general GEMM library.
    set(TFLITE_ENABLE_RUY ON)
    # Turn XNNPack on.
    set(TFLITE_ENABLE_XNNPACK ON)

    # Some of the subprojects (e.g. Eigen) are very noisy and emit status
    # messages all the time. Temporary ignore status messages while adding this
    # to silence it. Ugly but effective.
    set(OLD_CMAKE_MESSAGE_LOG_LEVEL ${CMAKE_MESSAGE_LOG_LEVEL})
    set(CMAKE_MESSAGE_LOG_LEVEL WARNING)
    add_subdirectory(third_party/tensorflow/tensorflow/lite/c)
    set(CMAKE_MESSAGE_LOG_LEVEL ${OLD_CMAKE_MESSAGE_LOG_LEVEL})

    # Disable some noisy warnings in tflite
    target_compile_options(tensorflow-lite PRIVATE -w)
    include_directories(${AOM_ROOT}/third_party/tensorflow)
    include_directories("${CMAKE_CURRENT_BINARY_DIR}/flatbuffers/include/")
    add_dependencies(aom_av1_common tensorflow-lite)

    # Figure out all the directories that were add_subdirectory-ed.
    set(ALL_DEP_DIRS ${AOM_ROOT}/third_party/tensorflow/tensorflow/lite/c)
    while(TRUE)
      list(LENGTH ALL_DEP_DIRS ALL_DEP_DIRS_LEN)
      set(DIR_LIST ${ALL_DEP_DIRS})
      foreach(DIR ${DIR_LIST})
        get_directory_property(SUBDIRS DIRECTORY ${DIR} SUBDIRECTORIES)
        list(APPEND ALL_DEP_DIRS ${SUBDIRS})
      endforeach()
      list(REMOVE_DUPLICATES ALL_DEP_DIRS)
      list(LENGTH ALL_DEP_DIRS NEW_ALL_DEP_DIRS_LEN)
      # Break when no new folder is found.
      if(${ALL_DEP_DIRS_LEN} EQUAL ${NEW_ALL_DEP_DIRS_LEN})
        break()
      endif()
    endwhile()
    # Suppress the warnings for each target defined in the dependecy
    # directories.
    foreach(DEP_DIR ${ALL_DEP_DIRS})
      get_directory_property(DEP_TARGETS DIRECTORY ${DEP_DIR}
                                                   BUILDSYSTEM_TARGETS)
      foreach(DEP_TARGET ${DEP_TARGETS})
        get_target_property(DEP_TYPE ${DEP_TARGET} TYPE)
        if(${DEP_TYPE} STREQUAL "INTERFACE_LIBRARY")
          target_compile_options(${DEP_TARGET} INTERFACE -w)
        elseif(NOT (${DEP_TYPE} STREQUAL "UTILITY"))
          # There is a custom UTILITY type, so do not deal with it.
          target_compile_options(${DEP_TARGET} PUBLIC -w)
        endif()
      endforeach()
    endforeach()
  endif()

  if(CONFIG_USE_VMAF_RC AND NOT CONFIG_TUNE_VMAF)
    message(FATAL_ERROR "Turn on CONFIG_TUNE_VMAF to use CONFIG_USE_VMAF_RC.")
  endif()

  if(CONFIG_TUNE_VMAF)
    find_package(PkgConfig)
    if(CONFIG_USE_VMAF_RC)
      if(PKG_CONFIG_FOUND)
        pkg_check_modules(VMAF_RC REQUIRED libvmaf_rc)
        target_link_libraries(aom PRIVATE ${VMAF_RC_LDFLAGS}
                                          ${VMAF_RC_LIBRARIES})
        target_include_directories(aom PRIVATE ${VMAF_RC_INCLUDE_DIRS})
        if(VMAF_RC_CFLAGS)
          append_compiler_flag("${VMAF_RC_CFLAGS}")
        endif()
      else()
        message(FATAL_ERROR "CONFIG_USE_VMAF_RC error: pkg-config not found.")
      endif()
    else()
      if(PKG_CONFIG_FOUND)
        pkg_check_modules(VMAF REQUIRED libvmaf)
      else()
        find_library(VMAF_LIBRARIES vmaf)
        find_path(VMAF_INCLUDE_DIRS libvmaf.h PATH_SUFFIXES libvmaf)
        if(VMAF_LIBRARIES AND VMAF_INCLUDE_DIRS)
          message(STATUS "Found VMAF library: ${VMAF_LIBRARIES}")
          message(STATUS "Found VMAF include: ${VMAF_INCLUDE_DIRS}")
        else()
          message(FATAL_ERROR "VMAF library not found.")
        endif()
      endif()
      target_link_libraries(aom PRIVATE ${VMAF_LDFLAGS} ${VMAF_LIBRARIES})
      target_include_directories(aom PRIVATE ${VMAF_INCLUDE_DIRS})
      if(VMAF_CFLAGS)
        append_compiler_flag("${VMAF_CFLAGS}")
      endif()
    endif()
    set_target_properties(aom PROPERTIES LINKER_LANGUAGE CXX)
    if(BUILD_SHARED_LIBS)
      set_target_properties(aom_static PROPERTIES LINKER_LANGUAGE CXX)
    endif()
  endif()
endif()

if(ENABLE_EXAMPLES)

  # Maintain a separate variable listing only the examples to facilitate
  # installation of example programs into an examples sub directory of
  # $AOM_DIST_DIR/bin when building the dist target.
  list(APPEND AOM_EXAMPLE_TARGETS ${AOM_DECODER_EXAMPLE_TARGETS}
       ${AOM_ENCODER_EXAMPLE_TARGETS})
endif()

if(ENABLE_TOOLS)
  if(CONFIG_AV1_DECODER)
    add_executable(
      dump_obu
      "${AOM_GEN_SRC_DIR}/usage_exit.cc"
      "${AOM_ROOT}/tools/dump_obu.cc"
      "${AOM_ROOT}/tools/obu_parser.cc"
      "${AOM_ROOT}/tools/obu_parser.h"
      $<TARGET_OBJECTS:aom_common_app_util>
      $<TARGET_OBJECTS:aom_decoder_app_util>)

    list(APPEND AOM_TOOL_TARGETS dump_obu)
    list(APPEND AOM_APP_TARGETS dump_obu)

    # Maintain a separate variable listing only the examples to facilitate
    # installation of example programs into an tools sub directory of
    # $AOM_DIST_DIR/bin when building the dist target.
    list(APPEND AOM_TOOL_TARGETS ${AOM_DECODER_TOOL_TARGETS}
         ${AOM_ENCODER_TOOL_TARGETS})
  endif()
endif()

if(ENABLE_EXAMPLES
   AND CONFIG_AV1_DECODER
   AND CONFIG_AV1_ENCODER)
  add_executable(
    aom_cx_set_ref
    "${AOM_ROOT}/examples/aom_cx_set_ref.c"
    $<TARGET_OBJECTS:aom_common_app_util>
    $<TARGET_OBJECTS:aom_encoder_app_util>)
  list(APPEND AOM_EXAMPLE_TARGETS aom_cx_set_ref)
  list(APPEND AOM_APP_TARGETS aom_cx_set_ref)
endif()

if(ENABLE_EXAMPLES AND CONFIG_AV1_ENCODER)
  add_executable(
    lightfield_encoder
    "${AOM_ROOT}/examples/lightfield_encoder.c"
    $<TARGET_OBJECTS:aom_common_app_util>
    $<TARGET_OBJECTS:aom_encoder_app_util>)
  list(APPEND AOM_EXAMPLE_TARGETS lightfield_encoder)
  list(APPEND AOM_APP_TARGETS lightfield_encoder)
endif()

if(ENABLE_EXAMPLES AND CONFIG_AV1_DECODER)
  add_executable(
    lightfield_tile_list_decoder
    "${AOM_ROOT}/examples/lightfield_tile_list_decoder.c"
    $<TARGET_OBJECTS:aom_common_app_util>
    $<TARGET_OBJECTS:aom_decoder_app_util>)
  list(APPEND AOM_EXAMPLE_TARGETS lightfield_tile_list_decoder)
  list(APPEND AOM_APP_TARGETS lightfield_tile_list_decoder)
endif()

if(ENABLE_EXAMPLES AND CONFIG_AV1_DECODER)
  add_executable(
    lightfield_decoder
    "${AOM_ROOT}/examples/lightfield_decoder.c"
    $<TARGET_OBJECTS:aom_common_app_util>
    $<TARGET_OBJECTS:aom_decoder_app_util>)
  list(APPEND AOM_EXAMPLE_TARGETS lightfield_decoder)
  list(APPEND AOM_APP_TARGETS lightfield_decoder)
endif()

if(ENABLE_EXAMPLES
   AND CONFIG_AV1_ENCODER
   AND CONFIG_AV1_DECODER)
  add_executable(
    lightfield_bitstream_parsing
    "${AOM_ROOT}/examples/lightfield_bitstream_parsing.c"
    $<TARGET_OBJECTS:aom_common_app_util>
    $<TARGET_OBJECTS:aom_encoder_app_util>
    $<TARGET_OBJECTS:aom_decoder_app_util>)
  list(APPEND AOM_EXAMPLE_TARGETS lightfield_bitstream_parsing)
  list(APPEND AOM_APP_TARGETS lightfield_bitstream_parsing)
endif()

if((ENABLE_EXAMPLES OR ENABLE_TESTS)
   AND CONFIG_AV1_ENCODER
   AND CONFIG_AV1_DECODER
   AND CONFIG_BRU)
  add_executable(
    bru_encoder_decoder
    "${AOM_ROOT}/examples/bru_encoder_decoder.c"
    $<TARGET_OBJECTS:aom_common_app_util>
    $<TARGET_OBJECTS:aom_encoder_app_util>
    $<TARGET_OBJECTS:aom_decoder_app_util>)
  list(APPEND AOM_EXAMPLE_TARGETS bru_encoder_decoder)
  list(APPEND AOM_APP_TARGETS bru_encoder_decoder)
endif()

foreach(aom_app ${AOM_APP_TARGETS})
  target_link_libraries(${aom_app} ${AOM_LIB_LINK_TYPE} aom)
endforeach()

if(ENABLE_EXAMPLES
   OR ENABLE_TESTS
   OR ENABLE_TOOLS)
  if(CONFIG_LIBYUV)
    add_library(yuv OBJECT ${AOM_LIBYUV_SOURCES})
    if(NOT MSVC)
      target_compile_options(yuv PRIVATE -Wno-unused-parameter)
    endif()
    include_directories("${AOM_ROOT}/third_party/libyuv/include")

    # Add to existing targets.
    foreach(aom_app ${AOM_APP_TARGETS})
      target_sources(${aom_app} PRIVATE $<TARGET_OBJECTS:yuv>)
      set_property(TARGET ${aom_app} PROPERTY LINKER_LANGUAGE CXX)
    endforeach()
  endif()

  if(CONFIG_WEBM_IO)
    add_library(webm OBJECT ${AOM_LIBWEBM_SOURCES})
    include_directories("${AOM_ROOT}/third_party/libwebm")
    target_compile_definitions(webm PRIVATE __STDC_CONSTANT_MACROS)
    target_compile_definitions(webm PRIVATE __STDC_LIMIT_MACROS)

    if(NOT MSVC)
      target_compile_options(webm PRIVATE -Wno-shadow)
    endif()

    # Add to existing targets.
    if(CONFIG_AV1_DECODER)
      target_sources(aom_decoder_app_util PRIVATE ${AOM_WEBM_DECODER_SOURCES})
    endif()

    if(CONFIG_AV1_ENCODER)
      target_sources(aom_encoder_app_util PRIVATE ${AOM_WEBM_ENCODER_SOURCES})
    endif()

    foreach(aom_app ${AOM_APP_TARGETS})
      target_sources(${aom_app} PRIVATE $<TARGET_OBJECTS:webm>)
      set_property(TARGET ${aom_app} PROPERTY LINKER_LANGUAGE CXX)
    endforeach()
  endif()
endif()

if(ENABLE_TESTS)

  # Create test_libaom target and the targets it depends on.
  setup_aom_test_targets()
endif()

if(HAVE_PTHREAD_H AND CONFIG_MULTITHREAD)
  find_package(Threads)
  target_link_libraries(aom ${AOM_LIB_LINK_TYPE} Threads::Threads)
  if(BUILD_SHARED_LIBS)
    target_link_libraries(aom_static ${AOM_LIB_LINK_TYPE} Threads::Threads)
  endif()
endif()

if(XCODE)

  # TODO(tomfinegan): Make sure target has no C++ files before doing this as
  # it's not necessary in that case.
  if(CONFIG_LIBYUV OR CONFIG_WEBM_IO)

    # The Xcode generator does not obey LINKER_LANGUAGE. Because of the issue
    # what looks like a C++ file needs to be in any target that Xcode will link
    # when the target contains a C++ dependency. Without this Xcode will try to
    # link with the C linker, which always ends badly when a dependency actually
    # includes C++.

    # Note: LINKER_LANGUAGE is explicitly set to C++ for all targets touched
    # here, it really is the Xcode generator's fault, or just a deficiency in
    # Xcode itself.
    foreach(aom_app ${AOM_APP_TARGETS})
      add_dummy_source_file_to_target("${aom_app}" "cc")
    endforeach()
  endif()
endif()

if(CONFIG_TENSORFLOW_LITE AND CONFIG_AV1_ENCODER)
  if(ENABLE_EXAMPLES)
    add_executable(tf_lite_model "${AOM_ROOT}/examples/tf_lite_model.cc")
    list(APPEND AOM_EXAMPLE_TARGETS tf_lite_model)
    list(APPEND AOM_APP_TARGETS tf_lite_model)
    add_executable(cnn_restore_y4m
                   "${AOM_ROOT}/examples/cnn_restore/cnn_restore_y4m.cc")
    list(APPEND AOM_APP_TARGETS cnn_restore_y4m)
  endif()

  if(ENABLE_EXAMPLES OR ENABLE_TOOLS)
    foreach(aom_app ${AOM_APP_TARGETS})
      add_dependencies(${aom_app} tensorflow-lite)
      target_link_libraries(${aom_app} PRIVATE tensorflow-lite)
    endforeach()
  endif()
endif()

if(ENABLE_EXAMPLES AND "${CMAKE_GENERATOR}" MATCHES "Makefiles$")

  # For historical purposes place the example binaries in the example directory.
  file(MAKE_DIRECTORY "${AOM_CONFIG_DIR}/examples")

  foreach(target ${AOM_EXAMPLE_TARGETS})
    if(NOT "${target}" MATCHES "aomdec\|aomenc")
      set_target_properties(${target} PROPERTIES RUNTIME_OUTPUT_DIRECTORY
                                                 "${AOM_CONFIG_DIR}/examples")
    endif()
  endforeach()

  if(ENABLE_TOOLS AND AOM_TOOL_TARGETS)

    # The same expectation is true for tool targets.
    file(MAKE_DIRECTORY "${AOM_CONFIG_DIR}/tools")
    set_target_properties(
      ${AOM_TOOL_TARGETS} PROPERTIES RUNTIME_OUTPUT_DIRECTORY
                                     "${AOM_CONFIG_DIR}/tools")
  endif()
endif()

if(BUILD_SHARED_LIBS)
  include("${AOM_ROOT}/build/cmake/exports.cmake")
  setup_exports_target()
endif()

# Handle user supplied compile and link flags last to ensure they're obeyed.
set_user_flags()

# Aomedia documentation rule.
set(DOXYGEN_VERSION_VALUE 0)
if(ENABLE_DOCS)
  include(FindDoxygen)
  if(DOXYGEN_FOUND)
    # Check if Doxygen version is >= minimum required version(i.e. 1.8.10).
    set(MINIMUM_DOXYGEN_VERSION 1008010)

    if(DOXYGEN_VERSION)
      # Strip SHA1 from version string if present.
      string(REGEX REPLACE "^([0-9]+\\.[0-9]+\\.[0-9]+).*" "\\1"
                           DOXYGEN_VERSION ${DOXYGEN_VERSION})
      # Replace dots with semicolons to create a list.
      string(REGEX REPLACE "\\." ";" DOXYGEN_VERSION_LIST ${DOXYGEN_VERSION})
      # Parse version components from the list.
      list(GET DOXYGEN_VERSION_LIST 0 DOXYGEN_MAJOR)
      list(GET DOXYGEN_VERSION_LIST 1 DOXYGEN_MINOR)
      list(GET DOXYGEN_VERSION_LIST 2 DOXYGEN_PATCH)
    endif()

    # Construct a version value for comparison.
    math(EXPR DOXYGEN_MAJOR "${DOXYGEN_MAJOR}*1000000")
    math(EXPR DOXYGEN_MINOR "${DOXYGEN_MINOR}*1000")
    math(EXPR DOXYGEN_VERSION_VALUE
         "${DOXYGEN_MAJOR} + ${DOXYGEN_MINOR} + ${DOXYGEN_PATCH}")

    if(${DOXYGEN_VERSION_VALUE} LESS ${MINIMUM_DOXYGEN_VERSION})
      set(DOXYGEN_FOUND NO)
    endif()
  endif()

  if(DOXYGEN_FOUND)
    include("${AOM_ROOT}/docs.cmake")
    setup_documentation_targets()
  else()
    message(
      "--- Cannot find doxygen(version 1.8.10 or newer), ENABLE_DOCS turned off."
    )
    set(ENABLE_DOCS OFF)
  endif()
endif()

# Aomedia dist rule.
if(CONFIG_AV1_DECODER AND ENABLE_EXAMPLES)
  list(APPEND AOM_DIST_APPS $<TARGET_FILE:aomdec>)
endif()
if(CONFIG_AV1_ENCODER AND ENABLE_EXAMPLES)
  list(APPEND AOM_DIST_APPS $<TARGET_FILE:aomenc>)
endif()

if(ENABLE_EXAMPLES)
  foreach(example ${AOM_EXAMPLE_TARGETS})
    list(APPEND AOM_DIST_EXAMPLES $<TARGET_FILE:${example}>)
    set_property(TARGET ${example} PROPERTY FOLDER examples)
  endforeach()
endif()

if(ENABLE_TOOLS)
  foreach(tool ${AOM_TOOL_TARGETS})
    list(APPEND AOM_DIST_TOOLS $<TARGET_FILE:${tool}>)
    set_property(TARGET ${tool} PROPERTY FOLDER tools)
  endforeach()
endif()

if(NOT AOM_DIST_DIR)
  set(AOM_DIST_DIR "${AOM_CONFIG_DIR}/dist")
endif()

add_custom_target(
  dist
  COMMAND
    ${CMAKE_COMMAND} -DAOM_ROOT=${AOM_ROOT} -DAOM_CONFIG_DIR=${AOM_CONFIG_DIR}
    -DAOM_DIST_DIR=${AOM_DIST_DIR} -DAOM_DIST_APPS="${AOM_DIST_APPS}"
    -DAOM_DIST_EXAMPLES="${AOM_DIST_EXAMPLES}"
    -DAOM_DIST_TOOLS="${AOM_DIST_TOOLS}"
    -DAOM_DIST_INCLUDES="${AOM_INSTALL_INCS}" -DAOM_DIST_LIBS=$<TARGET_FILE:aom>
    -DENABLE_DOCS=${ENABLE_DOCS} -P "${AOM_ROOT}/build/cmake/dist.cmake"
  DEPENDS ${AOM_INSTALL_BINS} ${AOM_INSTALL_LIBS} ${AOM_INSTALL_INCS}
          ${AOM_EXAMPLE_TARGETS} ${AOM_TOOL_TARGETS})

if(ENABLE_DOCS)
  add_dependencies(dist docs)
endif()

# Collect all variables containing libaom source files.
get_cmake_property(all_cmake_vars VARIABLES)
foreach(var ${all_cmake_vars})
  if("${var}" MATCHES "SOURCES$\|_INTRIN_\|_ASM_"
     AND NOT "${var}" MATCHES "_APP_\|DOXYGEN\|LIBWEBM\|LIBYUV\|_PKG_\|TEST")
    list(APPEND aom_source_vars ${var})
  endif()
endforeach()

if(NOT CONFIG_AV1_DECODER)
  list(FILTER aom_source_vars EXCLUDE REGEX "_DECODER_")
endif()

# Libaom_srcs.txt generation.
set(libaom_srcs_txt_file "${AOM_CONFIG_DIR}/libaom_srcs.txt")
file(WRITE "${libaom_srcs_txt_file}" "# This file is generated. DO NOT EDIT.\n")

# Static source file list first.
foreach(aom_source_var ${aom_source_vars})
  foreach(file ${${aom_source_var}})
    if(NOT "${file}" MATCHES "${AOM_CONFIG_DIR}")
      string(REPLACE "${AOM_ROOT}/" "" file "${file}")
      if(NOT CONFIG_AV1_DECODER AND "${file}" MATCHES "aom_decoder")
        continue()
      endif()
      file(APPEND "${libaom_srcs_txt_file}" "${file}\n")
    endif()
  endforeach()
endforeach()

file(APPEND "${libaom_srcs_txt_file}"
     "# Files below this line are generated by the libaom build system.\n")
foreach(aom_source_var ${aom_source_vars})
  foreach(file ${${aom_source_var}})
    if("${file}" MATCHES "${AOM_CONFIG_DIR}")
      string(REPLACE "${AOM_CONFIG_DIR}/" "" file "${file}")
      file(APPEND "${libaom_srcs_txt_file}" "${file}\n")
    endif()
  endforeach()
endforeach()

# Libaom_srcs.gni generation.
set(libaom_srcs_gni_file "${AOM_CONFIG_DIR}/libaom_srcs.gni")
file(WRITE "${libaom_srcs_gni_file}" "# This file is generated. DO NOT EDIT.\n")

foreach(aom_source_var ${aom_source_vars})
  if("${${aom_source_var}}" MATCHES "${AOM_ROOT}")
    string(TOLOWER ${aom_source_var} aom_source_var_lowercase)
    file(APPEND "${libaom_srcs_gni_file}" "\n${aom_source_var_lowercase} = [\n")
  endif()

  foreach(file ${${aom_source_var}})
    if(NOT "${file}" MATCHES "${AOM_CONFIG_DIR}")
      string(REPLACE "${AOM_ROOT}" "//third_party/libaom/source/libaom" file
                     "${file}")
      if(NOT CONFIG_AV1_DECODER AND "${file}" MATCHES "aom_decoder")
        continue()
      endif()
      file(APPEND "${libaom_srcs_gni_file}" "  \"${file}\",\n")
    endif()
  endforeach()

  if("${${aom_source_var}}" MATCHES "${AOM_ROOT}")
    file(APPEND "${libaom_srcs_gni_file}" "]\n")
  endif()
endforeach()

file(APPEND "${libaom_srcs_gni_file}"
     "\n# Files below this line are generated by the libaom build system.\n")

foreach(aom_source_var ${aom_source_vars})
  if("${${aom_source_var}}" MATCHES "${AOM_CONFIG_DIR}")
    string(TOLOWER ${aom_source_var} aom_source_var_lowercase)
    file(APPEND "${libaom_srcs_gni_file}"
         "\n${aom_source_var_lowercase}_gen = [\n")
  endif()
  foreach(file ${${aom_source_var}})
    if(NOT "${file}" MATCHES "${AOM_ROOT}")
      string(REPLACE "${AOM_CONFIG_DIR}" "//third_party/libaom/source/libaom"
                     file "${file}")
      file(APPEND "${libaom_srcs_gni_file}" "  \"${file}\",\n")
    endif()
  endforeach()

  if("${${aom_source_var}}" MATCHES "${AOM_CONFIG_DIR}")
    file(APPEND "${libaom_srcs_gni_file}" "]\n")
  endif()
endforeach()

# Generate aom.pc and setup install rule.
setup_aom_install_targets()
