VTK  9.0.3
vtkModuleJson.cmake
Go to the documentation of this file.
1 #[==[
2 @ingroup module-impl
3 @brief Output a boolean to JSON
4 
5 Appends a condition as a JSON boolean with the given dictionary key name to the
6 given string variable.
7 
8 ~~~
9 _vtk_json_bool(<output> <name> <cond>)
10 ~~~
11 #]==]
12 macro (_vtk_json_bool output name cond)
13  if (${cond})
14  set(val "true")
15  else ()
16  set(val "false")
17  endif ()
18  string(APPEND "${output}" "\"${name}\": ${val}, ")
19  unset(val)
20 endmacro ()
21 
22 #[==[
23 @ingroup module-impl
24 @brief Output a string list to JSON
25 
26 Appends a variable as a JSON list of strings with the given dictionary key name
27 to the given string variable.
28 
29 ~~~
30 _vtk_json_string_list(<output> <name> <cond>)
31 ~~~
32 #]==]
33 macro (_vtk_json_string_list output name var)
34  set(list "[")
35  foreach (value IN LISTS "${var}")
36  string(APPEND list "\"${value}\", ")
37  endforeach ()
38  string(APPEND list "]")
39  string(REPLACE ", ]" "]" list "${list}")
40  string(APPEND "${output}" "\"${name}\": ${list}, ")
41  unset(value)
42  unset(list)
43 endmacro ()
44 
45 #[==[
46 @ingroup module-support
47 @brief JSON metadata representation of modules
48 
49 Information about the modules built and/or available may be dumped to a JSON
50 file.
51 
52 ~~~
54  MODULES <module>...
55  OUTPUT <path>)
56 ~~~
57 
58  * `MODULES`: (Required) The modules to output information for.
59  * `OUTPUT`: (Required) A JSON file describing the modules built will
60  be output to this path. Relative paths are rooted to `CMAKE_BINARY_DIR`.
61 
62 Example output:
63 
64 ~~~{.json}
65 {
66  "modules": [
67  {
68  "name": "...",
69  "library_name": "...",
70  "enabled": <bool>,
71  "implementable": <bool>,
72  "third_party": <bool>,
73  "wrap_exclude": <bool>,
74  "kit": "...",
75  "depends": [
76  "..."
77  ],
78  "optional_depends": [
79  "..."
80  ],
81  "private_depends": [
82  "..."
83  ],
84  "implements": [
85  "..."
86  ],
87  "headers": [
88  "..."
89  ]
90  }
91  ],
92  "kits": [
93  {
94  "name": "...",
95  "enabled": <bool>,
96  "modules": [
97  ]
98  }
99  ]
100 }
101 ~~~
102 #]==]
103 function (vtk_module_json)
104  cmake_parse_arguments(_vtk_json
105  ""
106  "OUTPUT"
107  "MODULES"
108  ${ARGN})
109 
110  if (_vtk_json_UNPARSED_ARGUMENTS)
111  message(FATAL_ERROR
112  "Unparsed arguments for vtk_module_json: "
113  "${_vtk_json_UNPARSED_ARGUMENTS}")
114  endif ()
115 
116  if (NOT DEFINED _vtk_json_OUTPUT)
117  message(FATAL_ERROR
118  "The `OUTPUT` argument is required.")
119  endif ()
120 
121  if (NOT _vtk_json_MODULES)
122  message(FATAL_ERROR "No modules given to output.")
123  endif ()
124 
125  if (NOT IS_ABSOLUTE "${_vtk_json_OUTPUT}")
126  set(_vtk_json_OUTPUT "${CMAKE_BINARY_DIR}/${_vtk_json_OUTPUT}")
127  endif ()
128 
129  set(_vtk_json_kits)
130 
131  set(_vtk_json_contents "{")
132  string(APPEND _vtk_json_contents "\"modules\": {")
133  foreach (_vtk_json_module IN LISTS _vtk_json_MODULES)
134  get_property(_vtk_json_description GLOBAL
135  PROPERTY "_vtk_module_${_vtk_json_module}_description")
136  get_property(_vtk_json_implementable GLOBAL
137  PROPERTY "_vtk_module_${_vtk_json_module}_implementable")
138  get_property(_vtk_json_third_party GLOBAL
139  PROPERTY "_vtk_module_${_vtk_json_module}_third_party")
140  get_property(_vtk_json_wrap_exclude GLOBAL
141  PROPERTY "_vtk_module_${_vtk_json_module}_wrap_exclude")
142  get_property(_vtk_json_kit GLOBAL
143  PROPERTY "_vtk_module_${_vtk_json_module}_kit")
144  get_property(_vtk_json_depends GLOBAL
145  PROPERTY "_vtk_module_${_vtk_json_module}_depends")
146  get_property(_vtk_json_private_depends GLOBAL
147  PROPERTY "_vtk_module_${_vtk_json_module}_private_depends")
148  get_property(_vtk_json_optional_depends GLOBAL
149  PROPERTY "_vtk_module_${_vtk_json_module}_optional_depends")
150  get_property(_vtk_json_implements GLOBAL
151  PROPERTY "_vtk_module_${_vtk_json_module}_implements")
152  get_property(_vtk_json_library_name GLOBAL
153  PROPERTY "_vtk_module_${_vtk_json_module}_library_name")
154  get_property(_vtk_json_module_file GLOBAL
155  PROPERTY "_vtk_module_${_vtk_json_module}_file")
156 
157  set(_vtk_json_kit_name "null")
158  if (_vtk_json_kit)
159  list(APPEND _vtk_json_kits
160  "${_vtk_json_kit}")
161  set(_vtk_json_kit_name "\"${_vtk_json_kit}\"")
162  endif ()
163  set(_vtk_json_headers "")
164  if (TARGET "${_vtk_json_module}")
165  _vtk_module_get_module_property("${_vtk_json_module}"
166  PROPERTY "headers"
167  VARIABLE _vtk_json_headers)
168  get_filename_component(_vtk_json_module_dir "${_vtk_json_module_file}" DIRECTORY)
169  file(RELATIVE_PATH _vtk_json_module_subdir "${CMAKE_SOURCE_DIR}" "${_vtk_json_module_dir}")
170  string(REPLACE "${CMAKE_SOURCE_DIR}/${_vtk_json_module_subdir}/" "" _vtk_json_headers "${_vtk_json_headers}")
171  string(REPLACE "${CMAKE_BINARY_DIR}/${_vtk_json_module_subdir}/" "" _vtk_json_headers "${_vtk_json_headers}")
172  endif ()
173 
174  string(APPEND _vtk_json_contents "\"${_vtk_json_module}\": {")
175  string(APPEND _vtk_json_contents "\"library_name\": \"${_vtk_json_library_name}\", ")
176  string(APPEND _vtk_json_contents "\"description\": \"${_vtk_json_description}\", ")
177  _vtk_json_bool(_vtk_json_contents "enabled" "TARGET;${_vtk_json_module}")
178  _vtk_json_bool(_vtk_json_contents "implementable" _vtk_json_implementable)
179  _vtk_json_bool(_vtk_json_contents "third_party" _vtk_json_third_party)
180  _vtk_json_bool(_vtk_json_contents "wrap_exclude" _vtk_json_wrap_exclude)
181  string(APPEND _vtk_json_contents "\"kit\": ${_vtk_json_kit_name}, ")
182  _vtk_json_string_list(_vtk_json_contents "depends" _vtk_json_depends)
183  _vtk_json_string_list(_vtk_json_contents "optional_depends" _vtk_json_optional_depends)
184  _vtk_json_string_list(_vtk_json_contents "private_depends" _vtk_json_private_depends)
185  _vtk_json_string_list(_vtk_json_contents "implements" _vtk_json_implements)
186  _vtk_json_string_list(_vtk_json_contents "headers" _vtk_json_headers)
187  string(APPEND _vtk_json_contents "}, ")
188  endforeach ()
189  string(APPEND _vtk_json_contents "}, ")
190 
191  string(APPEND _vtk_json_contents "\"kits\": {")
192  foreach (_vtk_json_kit IN LISTS _vtk_json_kits)
193  set(_vtk_json_library_name "null")
194  if (TARGET "${_vtk_json_kit}")
195  get_property(_vtk_json_library
196  TARGET "${_vtk_json_kit}"
197  PROPERTY LIBRARY_OUTPUT_NAME)
198  set(_vtk_json_library_name "\"${_vtk_json_library}\"")
199  endif ()
200 
201  string(APPEND _vtk_json_contents "\"${_vtk_json_kit}\": {")
202  string(APPEND _vtk_json_contents "\"library_name\": ${_vtk_json_library_name}, ")
203  _vtk_json_bool(_vtk_json_contents "enabled" "TARGET;${_vtk_json_kit}")
204  string(APPEND _vtk_json_contents "}, ")
205  endforeach ()
206  string(APPEND _vtk_json_contents "}, ")
207 
208  string(APPEND _vtk_json_contents "}")
209  string(REPLACE ", ]" "]" _vtk_json_contents "${_vtk_json_contents}")
210  string(REPLACE ", }" "}" _vtk_json_contents "${_vtk_json_contents}")
211  file(GENERATE
212  OUTPUT "${_vtk_json_OUTPUT}"
213  CONTENT "${_vtk_json_contents}")
214 endfunction ()
macro _vtk_json_string_list(output, name, var)
Output a string list to JSON.
macro _vtk_json_bool(output, name, cond)
Output a boolean to JSON.
function vtk_module_json()
JSON metadata representation of modules.
@ key
Definition: vtkX3D.h:263
@ value
Definition: vtkX3D.h:226
@ name
Definition: vtkX3D.h:225
@ string
Definition: vtkX3D.h:496