#
# 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.5)

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