blob: 317adf4fa5aa5624a5c9ed87121dd4a778579b71 [file] [log] [blame]
# 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)