# Copyright (c) 2014 Alexander Lamaison <alexander.lamaison@gmail.com>
#
# Redistribution and use in source and binary forms,
# with or without modification, are permitted provided
# that the following conditions are met:
#
#   Redistributions of source code must retain the above
#   copyright notice, this list of conditions and the
#   following disclaimer.
#
#   Redistributions in binary form must reproduce the above
#   copyright notice, this list of conditions and the following
#   disclaimer in the documentation and/or other materials
#   provided with the distribution.
#
#   Neither the name of the copyright holder nor the names
#   of any other contributors may be used to endorse or
#   promote products derived from this software without
#   specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
# CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
# OF SUCH DAMAGE.

include(CMakeParseArguments)

function(ADD_TARGET_TO_COPY_DEPENDENCIES)
  set(options)
  set(oneValueArgs TARGET)
  set(multiValueArgs DEPENDENCIES BEFORE_TARGETS)
  cmake_parse_arguments(COPY
    "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})

  if(NOT COPY_DEPENDENCIES)
    return()
  endif()

  # Using a custom target to drive custom commands stops multiple
  # parallel builds trying to kick off the commands at the same time
  add_custom_target(${COPY_TARGET})

  foreach(target ${COPY_BEFORE_TARGETS})
    add_dependencies(${target} ${COPY_TARGET})
  endforeach()

  foreach(dependency ${COPY_DEPENDENCIES})

    add_custom_command(
      TARGET ${COPY_TARGET}
      DEPENDS ${dependency}
      # Make directory first otherwise file is copied in place of
      # directory instead of into it
      COMMAND ${CMAKE_COMMAND}
      ARGS -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}
      COMMAND ${CMAKE_COMMAND}
      ARGS -E copy ${dependency} ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}
      VERBATIM)

  endforeach()

endfunction()
