aboutsummaryrefslogtreecommitdiff
path: root/libc/cmake/modules/LibcParseArguments.cmake
blob: ef4a2aff0ce822cdec78c9ea6ebfcf366d47f687 (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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
set(LLVM_LIBC_OPTIONAL_ARGS
  ALIAS
  PUBLIC
  NO_GPU_BUNDLE
  NO_RUN_POSTBUILD
  C_TEST
  NEED_MPFR
  NEED_MPC
  IS_GPU_BENCHMARK
)

set(LLVM_LIBC_SINGLE_VALUE_ARGS
  CXX_STANDARD
  SUITE
  CREATE_TARGET_FUNCTION
  HDR
  DEST_HDR
  YAML_FILE
  GEN_HDR
  NAME
)

set(LLVM_LIBC_MULTI_VALUE_ARGS
  HDRS
  SRCS
  COMPILE_OPTIONS
  LINK_OPTIONS
  LINK_LIBRARIES
  ENV
  DEPENDS
  FLAGS
  ARGS
  LOADER_ARGS
)

foreach(arg_list LLVM_LIBC_OPTIONAL_ARGS LLVM_LIBC_SINGLE_VALUE_ARGS LLVM_LIBC_MULTI_VALUE_ARGS)
  list(TRANSFORM ${arg_list}
    PREPEND "OVERLAY_"
    OUTPUT_VARIABLE ${arg_list}_OVERLAY
  )
  list(TRANSFORM ${arg_list}
    PREPEND "FULL_BUILD_"
    OUTPUT_VARIABLE ${arg_list}_FULL_BUILD
  )
  set(${arg_list}_COMPLETE ${${arg_list}} ${${arg_list}_OVERLAY} ${${arg_list}_FULL_BUILD})
endforeach()

macro(llvm_libc_parse_arguments name_prefix)
  cmake_parse_arguments(
    ${name_prefix}
    "${LLVM_LIBC_OPTIONAL_ARGS_COMPLETE}"
    "${LLVM_LIBC_SINGLE_VALUE_ARGS_COMPLETE}"
    "${LLVM_LIBC_MULTI_VALUE_ARGS_COMPLETE}"
    ${ARGN}
  )

  # Collect overlay and full build args
  foreach(argument IN LISTS LLVM_LIBC_OPTIONAL_ARGS LLVM_LIBC_SINGLE_VALUE_ARGS LLVM_LIBC_MULTI_VALUE_ARGS)
    if(LLVM_LIBC_FULL_BUILD)
      if(${name_prefix}_${argument}_FULL_BUILD)
        list(APPEND ${name_prefix}_${argument} ${${name_prefix}_${argument}_FULL_BUILD})
      endif()
    else()
      if(${name_prefix}_${argument}_OVERLAY)
        list(APPEND ${name_prefix}_${argument} ${${name_prefix}_${argument}_OVERLAY})
      endif()
    endif()
  endforeach()
endmacro()

# Forward all arguments that can be used for llvm_libc_parse_arguments again.
# Assume that *_OVERLAY and *_FULL_BUILD args have been merged properly.
macro(forward_arguments name_prefix output)
  set(${output} "")
  
  foreach(argument ${LLVM_LIBC_OPTIONAL_ARGS})
    if(${name_prefix}_${argument})
      list(APPEND output ${argument})
    endif()
  endforeach()

  foreach(argument ${LLVM_LIBC_SINGLE_VALUE_ARGS} ${LLVM_LIBC_MULTI_VALUE_ARGS})
    if(${name_prefix}_${argument})
      list(APPEND output ${argument} "${${name_prefix}_${argument}}")
    endif()
  endforeach()
endmacro()