#
# 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(REQUIRED_ARGS "AOM_ROOT" "AOM_CONFIG_DIR" "GIT_EXECUTABLE"
                  "PERL_EXECUTABLE")

foreach(arg ${REQUIRED_ARGS})
  if("${${arg}}" STREQUAL "")
    message(FATAL_ERROR "${arg} must not be empty.")
  endif()
endforeach()

include("${AOM_ROOT}/build/cmake/util.cmake")

# Generate the version string for this run. Allow optional prefix like 'foo-'
# before the version string 'v*'.
unset(aom_version)
if(EXISTS "${GIT_EXECUTABLE}")
  execute_process(
    COMMAND ${GIT_EXECUTABLE} --git-dir=${AOM_ROOT}/.git describe --tags --match
            "*-v[0-9]*" --match "v[0-9]*"
    OUTPUT_VARIABLE aom_version
    ERROR_QUIET
    RESULT_VARIABLE version_check_result)

  if(${version_check_result} EQUAL 0)
    string(STRIP "${aom_version}" aom_version)

    # Remove the optional prefix before version.
    string(FIND "${aom_version}" "-v" dash_pos)
    if(NOT ${dash_pos} EQUAL -1)
      math(EXPR start_pos "${dash_pos}+1")
      string(SUBSTRING "${aom_version}" ${start_pos} -1 aom_version)
    endif()

    # Remove the leading 'v' from the version string.
    string(FIND "${aom_version}" "v" v_pos)
    if(${v_pos} EQUAL 0)
      string(SUBSTRING "${aom_version}" 1 -1 aom_version)
    endif()
  else()
    set(aom_version "")
  endif()
endif()

if("${aom_version}" STREQUAL "")
  set(aom_version "${AOM_ROOT}/CHANGELOG")
endif()

unset(last_aom_version)
set(version_file "${AOM_CONFIG_DIR}/config/aom_version.h")
if(EXISTS "${version_file}")
  extract_version_string("${version_file}" last_aom_version)
  if("${aom_version}" MATCHES "CHANGELOG$")
    set(aom_version "${last_aom_version}")
  endif()
endif()

if(NOT "${aom_version}" STREQUAL "${last_aom_version}")
  # TODO(tomfinegan): Perl dependency is unnecessary. CMake can do everything
  # that is done by version.pl on its own (if a bit more verbosely...).
  execute_process(
    COMMAND
      ${PERL_EXECUTABLE} "${AOM_ROOT}/build/cmake/version.pl"
      --version_data=${aom_version} --version_filename=${version_file} VERBATIM)
endif()
