# Copyright (C) 2016 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# required is used to check that a parameter was set.
function (required var message)
    if(NOT ${var})
        message(FATAL_ERROR "${var} expected ${message}")
    endif()
endfunction(required)

# default is used to default a parameter to the supplied value if not set.
function (default var value)
    if(NOT DEFINED ${var})
        set(${var} ${value} PARENT_SCOPE)
    endif()
endfunction(default)

# add_file_copy adds a file copying rule that updates dst if older that src.
function(add_file_copy src dst)
    add_custom_command(
        OUTPUT ${dst}
        COMMAND ${CMAKE_COMMAND} -E copy ${src} ${dst}
        DEPENDS ${src}
    )
endfunction(add_file_copy)

# all_target is used by steps that want a rule to run all occurences of a step
# type, Most often used by code generators.
# It makes a targets called ${name}-${child} ${name}-all and sets the all
# target to depend on the child target, and the child target to depend on any
# remaining arguments.
function(all_target name child)
    set(target ${name}-${child})
    set(all_target ${name}-all)
    add_custom_target(${target} ALL DEPENDS ${ARGN})
    if(NOT TARGET ${all_target})
        add_custom_target(${all_target} ALL)
    endif()
    add_dependencies(${all_target} ${target})
    if(NOT TARGET generate)
        add_custom_target(generate)
    endif()
    add_dependencies(generate ${target})
endfunction(all_target)


# build_subdirectory is analagous to add_subdirectory, and performs the same
# task if the sub directory has a CMakeLists.txt, but if it has a build.cmake
# then it includes that instead.
# This is needed becuase some of our targets have to be generated in the same
# context but from many directories.
function(build_subdirectory dir)
    set(CMAKE_CURRENT_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/${dir})
    if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt")
        add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR})
    else()
        include("${CMAKE_CURRENT_SOURCE_DIR}/CMakeBuild.cmake")
    endif()
endfunction(build_subdirectory)

# abs_list uses the specified path as the base to make absolute all entries
# in VAR that are not already absolute paths.
function(abs_list VAR path)
    set(result)
    foreach(entry ${${VAR}})
        if(NOT IS_ABSOLUTE ${entry})
            get_filename_component(entry "${path}/${entry}" ABSOLUTE)
        endif()
        list(APPEND result ${entry})
    endforeach()
    set(${VAR} ${result} PARENT_SCOPE)
endfunction(abs_list)


# Override and disable link_libraries, it's been a mistake every time it's been used
function(link_libraries)
    message(FATAL_ERROR "Don't use link_libraries, you probably meant target_link_libraries (${ARGV})")
endfunction()

# Create a library target that includes external libraries
function(imported_library tgt)
    if(TARGET tgt)
        return()
    endif()
    list(LENGTH ARGN count)
    if(count EQUAL 0)
        add_library(${tgt} INTERFACE IMPORTED)
    elseif(count EQUAL 1)
        add_library(${tgt} UNKNOWN IMPORTED)
        set_target_properties(${tgt} PROPERTIES IMPORTED_LOCATION "${ARGN}")
    else()
        message("Only 0 or 1 libraries allowed right now")
    endif()
endfunction(imported_library)
