#
# Copyright (c) 2017, 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.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()
