summaryrefslogtreecommitdiff
path: root/infra/nncc/cmake/modules/TargetRequire.cmake
blob: 801600dd9dbf7e70163ab8ecf8412193d359106c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# TargetRequire_Check(NAME t1 t2 t3 ...)
#
# TargetRequire_Check(NAME ...) sets "NAME" as TRUE if all the required targets are
# available, and FALSE otherwise.
function(TargetRequire_Check VARNAME)
  set(${VARNAME} TRUE PARENT_SCOPE)
  foreach(REQUIRED_TARGET IN ITEMS ${ARGN})
    if(NOT TARGET ${REQUIRED_TARGET})
      set(${VARNAME} FALSE PARENT_SCOPE)
      return()
    endif(NOT TARGET ${REQUIRED_TARGET})
  endforeach(REQUIRED_TARGET)
endfunction(TargetRequire_Check)

# TargetRequire_Assert(t1 t2 t3 ...)
#
# TargetRequire_Assert(...) stops CMake immediately if there is a target required but unavailable.
function(TargetRequire_Assert)
  unset(MISSING_TARGETS)

  foreach(REQUIRED_TARGET IN ITEMS ${ARGN})
    if(NOT TARGET ${REQUIRED_TARGET})
      list(APPEND MISSING_TARGETS ${REQUIRED_TARGET})
    endif(NOT TARGET ${REQUIRED_TARGET})
  endforeach(REQUIRED_TARGET)

  list(LENGTH MISSING_TARGETS MISSING_COUNT)

  if(NOT MISSING_COUNT EQUAL 0)
    message(FATAL_ERROR "${MISSING_TARGETS} are required, but unavailable")
  endif(NOT MISSING_COUNT EQUAL 0)
endfunction(TargetRequire_Assert)

# TargetRequire_Return(t1 t2 t3 ...)
#
# TargetRequire_Return(...) returns immediately if there is a target required but unavailable.
#
# NOTE "macro" is inevitable to make "return" inside affect the caller.
macro(TargetRequire_Return)
  foreach(REQUIRED_TARGET IN ITEMS ${ARGN})
    if(NOT TARGET ${REQUIRED_TARGET})
      return()
    endif(NOT TARGET ${REQUIRED_TARGET})
  endforeach(REQUIRED_TARGET)
endmacro(TargetRequire_Return)