-
Notifications
You must be signed in to change notification settings - Fork 19
/
vtkWrapHierarchy.cmake
167 lines (144 loc) · 5.54 KB
/
vtkWrapHierarchy.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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
#
# a cmake macro to generate a text file with the class hierarchy
#
macro(VTK_WRAP_HIERARCHY module_name OUTPUT_DIR SOURCES)
if(NOT VTK_WRAP_HIERARCHY_EXE)
if(TARGET vtkWrapHierarchy)
set(VTK_WRAP_HIERARCHY_EXE vtkWrapHierarchy)
elseif(TARGET VTK::WrapHierarchy)
set(VTK_WRAP_HIERARCHY_EXE VTK::WrapHierarchy)
else()
message(SEND_ERROR "VTK_WRAP_HIERARCHY_EXE not specified when calling VTK_WRAP_HIERARCHY")
endif()
endif()
# collect the common wrapper-tool arguments
if(NOT VTK_ENABLE_KITS)
# write wrapper-tool arguments to a file
set(_args_file ${module_name}Hierarchy.$<CONFIGURATION>.args)
file(GENERATE OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${_args_file} CONTENT "
$<$<BOOL:$<TARGET_PROPERTY:${module_name},COMPILE_DEFINITIONS>>:
-D\"$<JOIN:$<TARGET_PROPERTY:${module_name},COMPILE_DEFINITIONS>,\"
-D\">\">
$<$<BOOL:$<TARGET_PROPERTY:${module_name},INCLUDE_DIRECTORIES>>:
-I\"$<JOIN:$<TARGET_PROPERTY:${module_name},INCLUDE_DIRECTORIES>,\"
-I\">\">
")
else()
set(_common_args)
get_directory_property(_def_list DEFINITION COMPILE_DEFINITIONS)
foreach(TMP_DEF ${_def_list})
set(_common_args "${_common_args}-D${TMP_DEF}\n")
endforeach()
# all the include directories
if(VTK_WRAP_INCLUDE_DIRS)
set(TMP_INCLUDE_DIRS ${VTK_WRAP_INCLUDE_DIRS})
else()
set(TMP_INCLUDE_DIRS ${VTK_INCLUDE_DIRS})
endif()
foreach(INCLUDE_DIR ${TMP_INCLUDE_DIRS})
set(_common_args "${_common_args}-I\"${INCLUDE_DIR}\"\n")
endforeach()
# write wrapper-tool arguments to a file
set(_args_file ${module_name}Hierarchy.args)
string(STRIP "${_common_args}" CMAKE_CONFIGURABLE_FILE_CONTENT)
configure_file(${CMAKE_ROOT}/Modules/CMakeConfigurableFile.in
${_args_file} @ONLY)
endif()
# list of all files to wrap
set(VTK_WRAPPER_INIT_DATA)
# list of used files
set(INPUT_FILES)
# For each class
foreach(FILE ${SOURCES})
# what is the filename without the extension
get_filename_component(TMP_FILENAME ${FILE} NAME_WE)
# get the absolute path to the file
get_filename_component(TMP_FULLPATH ${FILE} ABSOLUTE)
# get the directory
get_filename_component(TMP_FILEPATH ${TMP_FULLPATH} PATH)
# assume header file is in the same directory
set(TMP_INPUT ${TMP_FILEPATH}/${TMP_FILENAME}.h)
# include all non-private headers in the hierarchy files
set(TMP_EXCLUDE_FROM_HIERARCHY OFF)
get_source_file_property(TMP_SKIP ${FILE} SKIP_HEADER_INSTALL)
if(TMP_SKIP)
set(TMP_EXCLUDE_FROM_HIERARCHY ON)
endif()
# ensure that header exists
if(NOT EXISTS ${TMP_INPUT})
set(TMP_EXCLUDE_FROM_HIERARCHY ON)
endif()
# Exclude this huge generated header file
if("${TMP_FILENAME}" STREQUAL "vtkgl")
set(TMP_EXCLUDE_FROM_HIERARCHY ON)
endif()
if(NOT TMP_EXCLUDE_FROM_HIERARCHY)
# add to the INPUT_FILES
list(APPEND INPUT_FILES ${TMP_INPUT})
set(_name ${module_name})
if(${VTK_VERSION} VERSION_GREATER_EQUAL "8.90")
if(VTK_ENABLE_KITS AND ${_name}_KIT)
set(_name "${${_name}_KIT}Kit")
endif()
endif()
# add the info to the init file
set(VTK_WRAPPER_INIT_DATA
"${VTK_WRAPPER_INIT_DATA}${TMP_INPUT};${_name}")
set(VTK_WRAPPER_INIT_DATA "${VTK_WRAPPER_INIT_DATA}\n")
endif()
endforeach()
# finish the data file for the init file
configure_file(
${vtkAddon_CMAKE_DIR}/vtkWrapperInit.data.in
${module_name}Hierarchy.data
@ONLY
)
# search through the deps to find modules we depend on
set(OTHER_HIERARCHY_FILES)
set(OTHER_HIERARCHY_TARGETS)
# Don't use ${module_name}_DEPENDS. That list also includes COMPILE_DEPENDS,
# which aren't library dependencies, merely dependencies for generators and
# such. Instead, use _WRAP_DEPENDS which includes the DEPENDS and the
# PRIVATE_DEPENDS from module.cmake, but not COMPILE_DEPENDS.
foreach(dep ${${module_name}_WRAP_DEPENDS})
if(NOT "${module_name}" STREQUAL "${dep}")
if(NOT ${dep}_EXCLUDE_FROM_WRAPPING)
list(APPEND OTHER_HIERARCHY_FILES "${${dep}_WRAP_HIERARCHY_FILE}")
if (TARGET "${dep}Hierarchy")
list(APPEND OTHER_HIERARCHY_TARGETS "${dep}Hierarchy")
endif ()
endif()
endif()
endforeach()
# write wrapper-tool arguments to a file
set(_other_hierarchy_args )
foreach(hierarchy_file ${OTHER_HIERARCHY_FILES})
set(_other_hierarchy_args "${_other_hierarchy_args}\"${hierarchy_file}\"\n")
endforeach()
set(_other_hierarchy_args_file ${module_name}OtherHierarchyFiles.args)
string(STRIP "${_other_hierarchy_args}" CMAKE_CONFIGURABLE_FILE_CONTENT)
configure_file(${CMAKE_ROOT}/Modules/CMakeConfigurableFile.in
${_other_hierarchy_args_file} @ONLY)
if (CMAKE_GENERATOR MATCHES "Ninja")
set(hierarchy_depends ${OTHER_HIERARCHY_FILES})
else ()
set(hierarchy_depends ${OTHER_HIERARCHY_TARGETS})
endif ()
add_custom_command(
OUTPUT "${OUTPUT_DIR}/${module_name}Hierarchy.txt"
COMMAND ${VTK_WRAP_HIERARCHY_EXE}
@${_args_file} -o ${OUTPUT_DIR}/${module_name}Hierarchy.txt
${module_name}Hierarchy.data
@${_other_hierarchy_args_file}
COMMENT "For ${module_name} - updating ${module_name}Hierarchy.txt"
DEPENDS ${VTK_WRAP_HIERARCHY_EXE}
${CMAKE_CURRENT_BINARY_DIR}/${_args_file}
${CMAKE_CURRENT_BINARY_DIR}/${module_name}Hierarchy.data
${hierarchy_depends}
${INPUT_FILES}
VERBATIM
)
add_custom_target(${module_name}Hierarchy
DEPENDS
${OUTPUT_DIR}/${module_name}Hierarchy.txt)
endmacro()