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

# Converts spaces in $in_string to semicolons and writes the output to
# $out_string. In CMake's eyes this converts the input string to a list.
function(listify_string in_string out_string)
  string(REPLACE " " ";" ${out_string} ${in_string})
  set(${out_string} "${${out_string}}" PARENT_SCOPE)
endfunction()

set(REQUIRED_ARGS "AOM_ROOT" "AOM_CONFIG_DIR" "AOM_DIST_DIR"
    "AOM_DIST_INCLUDES" "AOM_DIST_LIBS" "ENABLE_DOCS")

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

if(ENABLE_DOCS)
  file(INSTALL "${AOM_CONFIG_DIR}/docs" DESTINATION "${AOM_DIST_DIR}")
endif()

if(AOM_DIST_EXAMPLES)
  listify_string("${AOM_DIST_EXAMPLES}" "AOM_DIST_EXAMPLES")
  foreach(example ${AOM_DIST_EXAMPLES})
    if(NOT "${example}" MATCHES "aomdec\|aomenc")
      file(INSTALL "${example}" DESTINATION "${AOM_DIST_DIR}/bin/examples")
    endif()
  endforeach()
endif()

if(AOM_DIST_TOOLS)
  listify_string("${AOM_DIST_TOOLS}" "AOM_DIST_TOOLS")
  foreach(tool ${AOM_DIST_TOOLS})
    file(INSTALL "${tool}" DESTINATION "${AOM_DIST_DIR}/bin/tools")
  endforeach()
endif()

if(AOM_DIST_APPS)
  listify_string("${AOM_DIST_APPS}" "AOM_DIST_APPS")
  foreach(app ${AOM_DIST_APPS})
    file(INSTALL "${app}" DESTINATION "${AOM_DIST_DIR}/bin")
  endforeach()
endif()

listify_string("${AOM_DIST_INCLUDES}" "AOM_DIST_INCLUDES")
foreach(inc ${AOM_DIST_INCLUDES})
  file(INSTALL "${inc}" DESTINATION "${AOM_DIST_DIR}/include/aom")
endforeach()

listify_string("${AOM_DIST_LIBS}" "AOM_DIST_LIBS")
foreach(lib ${AOM_DIST_LIBS})
  file(INSTALL "${lib}" DESTINATION "${AOM_DIST_DIR}/lib")
endforeach()
