VTK  9.2.6
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 ~~~
53 vtk_module_json(
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(PARSE_ARGV 0 _vtk_json
105  ""
106  "OUTPUT"
107  "MODULES")
108 
109  if (_vtk_json_UNPARSED_ARGUMENTS)
110  message(FATAL_ERROR
111  "Unparsed arguments for vtk_module_json: "
112  "${_vtk_json_UNPARSED_ARGUMENTS}")
113  endif ()
114 
115  if (NOT DEFINED _vtk_json_OUTPUT)
116  message(FATAL_ERROR
117  "The `OUTPUT` argument is required.")
118  endif ()
119 
120  if (NOT _vtk_json_MODULES)
121  message(FATAL_ERROR "No modules given to output.")
122  endif ()
123 
124  if (NOT IS_ABSOLUTE "${_vtk_json_OUTPUT}")
125  string(PREPEND _vtk_json_OUTPUT "${CMAKE_BINARY_DIR}/")
126  endif ()
127 
128  set(_vtk_json_kits)
129 
130  set(_vtk_json_contents "{")
131  string(APPEND _vtk_json_contents "\"modules\": {")
132  foreach (_vtk_json_module IN LISTS _vtk_json_MODULES)
133  get_property(_vtk_json_description GLOBAL
134  PROPERTY "_vtk_module_${_vtk_json_module}_description")
135  get_property(_vtk_json_implementable GLOBAL
136  PROPERTY "_vtk_module_${_vtk_json_module}_implementable")
137  get_property(_vtk_json_third_party GLOBAL
138  PROPERTY "_vtk_module_${_vtk_json_module}_third_party")
139  get_property(_vtk_json_wrap_exclude GLOBAL
140  PROPERTY "_vtk_module_${_vtk_json_module}_wrap_exclude")
141  get_property(_vtk_json_kit GLOBAL
142  PROPERTY "_vtk_module_${_vtk_json_module}_kit")
143  get_property(_vtk_json_depends GLOBAL
144  PROPERTY "_vtk_module_${_vtk_json_module}_depends")
145  get_property(_vtk_json_private_depends GLOBAL
146  PROPERTY "_vtk_module_${_vtk_json_module}_private_depends")
147  get_property(_vtk_json_optional_depends GLOBAL
148  PROPERTY "_vtk_module_${_vtk_json_module}_optional_depends")
149  get_property(_vtk_json_implements GLOBAL
150  PROPERTY "_vtk_module_${_vtk_json_module}_implements")
151  get_property(_vtk_json_library_name GLOBAL
152  PROPERTY "_vtk_module_${_vtk_json_module}_library_name")
153  get_property(_vtk_json_module_file GLOBAL
154  PROPERTY "_vtk_module_${_vtk_json_module}_file")
155  get_property(_vtk_json_licenses GLOBAL
156  PROPERTY "_vtk_module_${_vtk_json_module}_licenses")
157 
158  set(_vtk_json_kit_name "null")
159  if (_vtk_json_kit)
160  list(APPEND _vtk_json_kits
161  "${_vtk_json_kit}")
162  set(_vtk_json_kit_name "\"${_vtk_json_kit}\"")
163  endif ()
164  set(_vtk_json_headers "")
165  if (TARGET "${_vtk_json_module}")
166  _vtk_module_get_module_property("${_vtk_json_module}"
167  PROPERTY "headers"
168  VARIABLE _vtk_json_headers)
169  get_filename_component(_vtk_json_module_dir "${_vtk_json_module_file}" DIRECTORY)
170  file(RELATIVE_PATH _vtk_json_module_subdir "${CMAKE_SOURCE_DIR}" "${_vtk_json_module_dir}")
171  string(REPLACE "${CMAKE_SOURCE_DIR}/${_vtk_json_module_subdir}/" "" _vtk_json_headers "${_vtk_json_headers}")
172  string(REPLACE "${CMAKE_BINARY_DIR}/${_vtk_json_module_subdir}/" "" _vtk_json_headers "${_vtk_json_headers}")
173  endif ()
174 
175  string(APPEND _vtk_json_contents "\"${_vtk_json_module}\": {")
176  string(APPEND _vtk_json_contents "\"library_name\": \"${_vtk_json_library_name}\", ")
177  string(APPEND _vtk_json_contents "\"description\": \"${_vtk_json_description}\", ")
178  _vtk_json_bool(_vtk_json_contents "enabled" "TARGET;${_vtk_json_module}")
179  _vtk_json_bool(_vtk_json_contents "implementable" _vtk_json_implementable)
180  _vtk_json_bool(_vtk_json_contents "third_party" _vtk_json_third_party)
181  _vtk_json_bool(_vtk_json_contents "wrap_exclude" _vtk_json_wrap_exclude)
182  string(APPEND _vtk_json_contents "\"kit\": ${_vtk_json_kit_name}, ")
183  _vtk_json_string_list(_vtk_json_contents "depends" _vtk_json_depends)
184  _vtk_json_string_list(_vtk_json_contents "optional_depends" _vtk_json_optional_depends)
185  _vtk_json_string_list(_vtk_json_contents "private_depends" _vtk_json_private_depends)
186  _vtk_json_string_list(_vtk_json_contents "implements" _vtk_json_implements)
187  _vtk_json_string_list(_vtk_json_contents "headers" _vtk_json_headers)
188  _vtk_json_string_list(_vtk_json_contents "licenses" _vtk_json_licences)
189  string(APPEND _vtk_json_contents "}, ")
190  endforeach ()
191  string(APPEND _vtk_json_contents "}, ")
192 
193  string(APPEND _vtk_json_contents "\"kits\": {")
194  foreach (_vtk_json_kit IN LISTS _vtk_json_kits)
195  set(_vtk_json_library_name "null")
196  if (TARGET "${_vtk_json_kit}")
197  get_property(_vtk_json_library
198  TARGET "${_vtk_json_kit}"
199  PROPERTY LIBRARY_OUTPUT_NAME)
200  set(_vtk_json_library_name "\"${_vtk_json_library}\"")
201  endif ()
202 
203  string(APPEND _vtk_json_contents "\"${_vtk_json_kit}\": {")
204  string(APPEND _vtk_json_contents "\"library_name\": ${_vtk_json_library_name}, ")
205  _vtk_json_bool(_vtk_json_contents "enabled" "TARGET;${_vtk_json_kit}")
206  string(APPEND _vtk_json_contents "}, ")
207  endforeach ()
208  string(APPEND _vtk_json_contents "}, ")
209 
210  string(APPEND _vtk_json_contents "}")
211  string(REPLACE ", ]" "]" _vtk_json_contents "${_vtk_json_contents}")
212  string(REPLACE ", }" "}" _vtk_json_contents "${_vtk_json_contents}")
213  file(GENERATE
214  OUTPUT "${_vtk_json_OUTPUT}"
215  CONTENT "${_vtk_json_contents}")
216 endfunction ()