-
Notifications
You must be signed in to change notification settings - Fork 108
/
Copy pathmluop_kernel_depends.cmake
118 lines (104 loc) · 3.63 KB
/
mluop_kernel_depends.cmake
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
cmake_policy(SET CMP0057 NEW) # Use `IN_LIST` operator
# B \ A = {x in B and x not in A}
macro(SET_RELATIVE_COMPLEMENT B A RET)
set(_RELATIVE_COMP_RET "")
foreach (element ${${B}})
if (NOT element IN_LIST ${A})
set(_RELATIVE_COMP_RET ${_RELATIVE_COMP_RET} ${element})
endif()
endforeach()
set(${RET} ${_RELATIVE_COMP_RET})
endmacro()
# A + B = {x in A OR x in B}
macro(SET_UNION A B RET)
set(_SET_UNION_RET ${${A}} ${${B}})
list(REMOVE_DUPLICATES _SET_UNION_RET)
set(${RET} ${_SET_UNION_RET})
endmacro()
## handle kernels dependency
if (NOT MLUOP_KERNEL_CONFIG)
set(MLUOP_KERNEL_CONFIG "${CMAKE_CURRENT_SOURCE_DIR}/kernel_depends.toml")
endif()
get_directory_property(hasParent PARENT_DIRECTORY)
if (NOT dependencies)
message("#parse ${MLUOP_KERNEL_CONFIG} to populate dependencies")
# get all kernels defined in ${MLUOP_KERNEL_CONFIG}
execute_process(
COMMAND grep -v -P "[[:space:]]*#" ${MLUOP_KERNEL_CONFIG}
COMMAND tr -d "[:blank:]"
COMMAND grep -P "^\\w\\S*?=\\[\\S*\\]"
OUTPUT_VARIABLE depedencies
OUTPUT_STRIP_TRAILING_WHITESPACE
)
execute_process(
COMMAND echo -n "${depedencies}"
COMMAND cut -d "=" -f1
COMMAND sort
COMMAND uniq # remove duplicate key
COMMAND xargs
OUTPUT_VARIABLE pre_kernels
OUTPUT_STRIP_TRAILING_WHITESPACE
)
separate_arguments(pre_kernels)
set(parsed_kernels)
foreach(kernel ${pre_kernels})
execute_process(
COMMAND echo -n "${depedencies}"
COMMAND grep -E "^${kernel}="
COMMAND cut -d= -f 2
COMMAND cut -d [ -f 2
COMMAND cut -d ] -f 1
COMMAND tr "," "\n"
COMMAND sort
COMMAND uniq # remove duplicate
COMMAND tr "\n" " "
COMMAND xargs echo -n # remove '"'
OUTPUT_VARIABLE _kernel_depends
)
separate_arguments(_kernel_depends)
list(REMOVE_ITEM _kernel_depends ${kernel})
# <kernel> depends on <_kernel_depends;>
set(kernel_depend_${kernel} ${_kernel_depends})
foreach(dep ${_kernel_depends})
# we have a -> {b}, at present c -> {a}, so we got c -> {a, b}
SET_UNION(kernel_depend_${kernel} kernel_depend_${dep} kernel_depend_${kernel})
endforeach()
#foreach(dep ${_kernel_depends})
# # reverse relation <dep> needed by <kernel_support_dep>
# set(kernel_support_${dep} ${kernel_support_${dep}} ${kernel})
# foreach(support ${kernel_support_${kernel}})
# set(kernel_support_${dep} ${kernel_support_${dep}} ${support})
# endforeach()
#endforeach()
if (parsed_kernels)
foreach (_kernel ${parsed_kernels})
# we have a -> {b}, at present b -> {c}, so we got a -> {b, c}
if (kernel IN_LIST kernel_depend_${_kernel})
SET_UNION(kernel_depend_${_kernel} kernel_depend_${kernel} kernel_depend_${_kernel})
endif()
endforeach()
endif()
set(parsed_kernels ${parsed_kernels} ${kernel})
endforeach()
if (hasParent)
set(pre_kernels ${pre_kernels} PARENT_SCOPE)
set(dependencies ${dependencies} PARENT_SCOPE)
endif()
foreach(kernel ${pre_kernels})
if (kernel IN_LIST kernel_depend_${kernel})
message(WARNING "cyclic dependencies under ${kernel}")
list(REMOVE_ITEM kernel_depend_${kernel} ${kernel})
endif()
message(STATUS "populated kernel ${kernel}, depend_on: ${kernel_depend_${kernel}}")
if (hasParent)
set(kernel_depend_${kernel} ${kernel_depend_${kernel}} PARENT_SCOPE)
endif()
endforeach()
endif()
macro(populate_op ret)
set(${${ret}})
cmake_parse_arguments(POPULATE_OP "" "" "SPECIFIC_OP" ${ARGN})
foreach(kernel ${POPULATE_OP_SPECIFIC_OP})
SET_UNION(${ret} kernel_depend_${kernel} ${ret})
endforeach()
endmacro()