frida 16.2.1 → 16.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (386) hide show
  1. package/BSDmakefile +6 -0
  2. package/Makefile +16 -0
  3. package/README.md +14 -11
  4. package/configure +18 -0
  5. package/configure.bat +22 -0
  6. package/dist/native.js +0 -8
  7. package/lib/application.ts +98 -0
  8. package/lib/authentication.ts +3 -0
  9. package/lib/build.py +50 -0
  10. package/lib/bus.ts +30 -0
  11. package/lib/cancellable.ts +33 -0
  12. package/lib/child.ts +15 -0
  13. package/lib/crash.ts +11 -0
  14. package/lib/device.ts +329 -0
  15. package/lib/device_manager.ts +69 -0
  16. package/lib/endpoint_parameters.ts +56 -0
  17. package/lib/icon.ts +15 -0
  18. package/lib/index.ts +311 -0
  19. package/lib/iostream.ts +78 -0
  20. package/lib/meson.build +53 -0
  21. package/lib/native.ts +9 -0
  22. package/lib/portal_membership.ts +10 -0
  23. package/lib/portal_service.ts +105 -0
  24. package/lib/process.ts +57 -0
  25. package/lib/relay.ts +44 -0
  26. package/lib/script.ts +352 -0
  27. package/lib/session.ts +113 -0
  28. package/lib/signals.ts +45 -0
  29. package/lib/socket_address.ts +35 -0
  30. package/lib/spawn.ts +4 -0
  31. package/lib/system_parameters.ts +78 -0
  32. package/make.bat +23 -0
  33. package/meson.build +160 -0
  34. package/meson.options +11 -0
  35. package/package.json +27 -6
  36. package/releng/deps.py +1133 -0
  37. package/releng/deps.toml +391 -0
  38. package/releng/devkit-assets/frida-core-example-unix.c +188 -0
  39. package/releng/devkit-assets/frida-core-example-windows.c +197 -0
  40. package/releng/devkit-assets/frida-core-example.sln +28 -0
  41. package/releng/devkit-assets/frida-core-example.vcxproj +157 -0
  42. package/releng/devkit-assets/frida-core-example.vcxproj.filters +27 -0
  43. package/releng/devkit-assets/frida-gum-example-unix.c +122 -0
  44. package/releng/devkit-assets/frida-gum-example-windows.c +132 -0
  45. package/releng/devkit-assets/frida-gum-example.sln +28 -0
  46. package/releng/devkit-assets/frida-gum-example.vcxproj +157 -0
  47. package/releng/devkit-assets/frida-gum-example.vcxproj.filters +27 -0
  48. package/releng/devkit-assets/frida-gumjs-example-unix.c +84 -0
  49. package/releng/devkit-assets/frida-gumjs-example-windows.c +91 -0
  50. package/releng/devkit-assets/frida-gumjs-example.sln +28 -0
  51. package/releng/devkit-assets/frida-gumjs-example.vcxproj +157 -0
  52. package/releng/devkit-assets/frida-gumjs-example.vcxproj.filters +27 -0
  53. package/releng/devkit.py +535 -0
  54. package/releng/env.py +420 -0
  55. package/releng/env_android.py +150 -0
  56. package/releng/env_apple.py +176 -0
  57. package/releng/env_generic.py +373 -0
  58. package/releng/frida_version.py +69 -0
  59. package/releng/machine_file.py +44 -0
  60. package/releng/machine_spec.py +290 -0
  61. package/releng/meson/meson.py +27 -0
  62. package/releng/meson/mesonbuild/__init__.py +0 -0
  63. package/releng/meson/mesonbuild/_pathlib.py +63 -0
  64. package/releng/meson/mesonbuild/_typing.py +69 -0
  65. package/releng/meson/mesonbuild/arglist.py +321 -0
  66. package/releng/meson/mesonbuild/ast/__init__.py +23 -0
  67. package/releng/meson/mesonbuild/ast/interpreter.py +441 -0
  68. package/releng/meson/mesonbuild/ast/introspection.py +374 -0
  69. package/releng/meson/mesonbuild/ast/postprocess.py +109 -0
  70. package/releng/meson/mesonbuild/ast/printer.py +620 -0
  71. package/releng/meson/mesonbuild/ast/visitor.py +161 -0
  72. package/releng/meson/mesonbuild/backend/__init__.py +0 -0
  73. package/releng/meson/mesonbuild/backend/backends.py +2047 -0
  74. package/releng/meson/mesonbuild/backend/ninjabackend.py +3808 -0
  75. package/releng/meson/mesonbuild/backend/nonebackend.py +26 -0
  76. package/releng/meson/mesonbuild/backend/vs2010backend.py +2078 -0
  77. package/releng/meson/mesonbuild/backend/vs2012backend.py +35 -0
  78. package/releng/meson/mesonbuild/backend/vs2013backend.py +34 -0
  79. package/releng/meson/mesonbuild/backend/vs2015backend.py +35 -0
  80. package/releng/meson/mesonbuild/backend/vs2017backend.py +59 -0
  81. package/releng/meson/mesonbuild/backend/vs2019backend.py +54 -0
  82. package/releng/meson/mesonbuild/backend/vs2022backend.py +54 -0
  83. package/releng/meson/mesonbuild/backend/xcodebackend.py +1781 -0
  84. package/releng/meson/mesonbuild/build.py +3249 -0
  85. package/releng/meson/mesonbuild/cargo/__init__.py +5 -0
  86. package/releng/meson/mesonbuild/cargo/builder.py +238 -0
  87. package/releng/meson/mesonbuild/cargo/cfg.py +274 -0
  88. package/releng/meson/mesonbuild/cargo/interpreter.py +733 -0
  89. package/releng/meson/mesonbuild/cargo/manifest.py +227 -0
  90. package/releng/meson/mesonbuild/cargo/version.py +95 -0
  91. package/releng/meson/mesonbuild/cmake/__init__.py +28 -0
  92. package/releng/meson/mesonbuild/cmake/common.py +331 -0
  93. package/releng/meson/mesonbuild/cmake/data/__init__.py +0 -0
  94. package/releng/meson/mesonbuild/cmake/data/preload.cmake +82 -0
  95. package/releng/meson/mesonbuild/cmake/executor.py +241 -0
  96. package/releng/meson/mesonbuild/cmake/fileapi.py +324 -0
  97. package/releng/meson/mesonbuild/cmake/generator.py +186 -0
  98. package/releng/meson/mesonbuild/cmake/interpreter.py +1267 -0
  99. package/releng/meson/mesonbuild/cmake/toolchain.py +248 -0
  100. package/releng/meson/mesonbuild/cmake/traceparser.py +814 -0
  101. package/releng/meson/mesonbuild/cmake/tracetargets.py +161 -0
  102. package/releng/meson/mesonbuild/compilers/__init__.py +86 -0
  103. package/releng/meson/mesonbuild/compilers/asm.py +307 -0
  104. package/releng/meson/mesonbuild/compilers/c.py +788 -0
  105. package/releng/meson/mesonbuild/compilers/c_function_attributes.py +143 -0
  106. package/releng/meson/mesonbuild/compilers/compilers.py +1388 -0
  107. package/releng/meson/mesonbuild/compilers/cpp.py +1035 -0
  108. package/releng/meson/mesonbuild/compilers/cs.py +136 -0
  109. package/releng/meson/mesonbuild/compilers/cuda.py +806 -0
  110. package/releng/meson/mesonbuild/compilers/cython.py +91 -0
  111. package/releng/meson/mesonbuild/compilers/d.py +861 -0
  112. package/releng/meson/mesonbuild/compilers/detect.py +1396 -0
  113. package/releng/meson/mesonbuild/compilers/fortran.py +523 -0
  114. package/releng/meson/mesonbuild/compilers/java.py +113 -0
  115. package/releng/meson/mesonbuild/compilers/mixins/__init__.py +0 -0
  116. package/releng/meson/mesonbuild/compilers/mixins/arm.py +167 -0
  117. package/releng/meson/mesonbuild/compilers/mixins/ccrx.py +113 -0
  118. package/releng/meson/mesonbuild/compilers/mixins/clang.py +170 -0
  119. package/releng/meson/mesonbuild/compilers/mixins/clike.py +1330 -0
  120. package/releng/meson/mesonbuild/compilers/mixins/compcert.py +117 -0
  121. package/releng/meson/mesonbuild/compilers/mixins/elbrus.py +93 -0
  122. package/releng/meson/mesonbuild/compilers/mixins/emscripten.py +89 -0
  123. package/releng/meson/mesonbuild/compilers/mixins/gnu.py +629 -0
  124. package/releng/meson/mesonbuild/compilers/mixins/intel.py +167 -0
  125. package/releng/meson/mesonbuild/compilers/mixins/islinker.py +120 -0
  126. package/releng/meson/mesonbuild/compilers/mixins/metrowerks.py +279 -0
  127. package/releng/meson/mesonbuild/compilers/mixins/pgi.py +88 -0
  128. package/releng/meson/mesonbuild/compilers/mixins/ti.py +130 -0
  129. package/releng/meson/mesonbuild/compilers/mixins/visualstudio.py +458 -0
  130. package/releng/meson/mesonbuild/compilers/mixins/xc16.py +111 -0
  131. package/releng/meson/mesonbuild/compilers/objc.py +120 -0
  132. package/releng/meson/mesonbuild/compilers/objcpp.py +102 -0
  133. package/releng/meson/mesonbuild/compilers/rust.py +230 -0
  134. package/releng/meson/mesonbuild/compilers/swift.py +131 -0
  135. package/releng/meson/mesonbuild/compilers/vala.py +121 -0
  136. package/releng/meson/mesonbuild/coredata.py +1532 -0
  137. package/releng/meson/mesonbuild/dependencies/__init__.py +252 -0
  138. package/releng/meson/mesonbuild/dependencies/base.py +663 -0
  139. package/releng/meson/mesonbuild/dependencies/boost.py +1083 -0
  140. package/releng/meson/mesonbuild/dependencies/cmake.py +656 -0
  141. package/releng/meson/mesonbuild/dependencies/coarrays.py +80 -0
  142. package/releng/meson/mesonbuild/dependencies/configtool.py +163 -0
  143. package/releng/meson/mesonbuild/dependencies/cuda.py +295 -0
  144. package/releng/meson/mesonbuild/dependencies/data/CMakeLists.txt +102 -0
  145. package/releng/meson/mesonbuild/dependencies/data/CMakeListsLLVM.txt +204 -0
  146. package/releng/meson/mesonbuild/dependencies/data/CMakePathInfo.txt +31 -0
  147. package/releng/meson/mesonbuild/dependencies/data/__init__.py +0 -0
  148. package/releng/meson/mesonbuild/dependencies/detect.py +225 -0
  149. package/releng/meson/mesonbuild/dependencies/dev.py +707 -0
  150. package/releng/meson/mesonbuild/dependencies/dub.py +424 -0
  151. package/releng/meson/mesonbuild/dependencies/factory.py +146 -0
  152. package/releng/meson/mesonbuild/dependencies/framework.py +111 -0
  153. package/releng/meson/mesonbuild/dependencies/hdf5.py +168 -0
  154. package/releng/meson/mesonbuild/dependencies/misc.py +618 -0
  155. package/releng/meson/mesonbuild/dependencies/mpi.py +231 -0
  156. package/releng/meson/mesonbuild/dependencies/pkgconfig.py +570 -0
  157. package/releng/meson/mesonbuild/dependencies/platform.py +52 -0
  158. package/releng/meson/mesonbuild/dependencies/python.py +431 -0
  159. package/releng/meson/mesonbuild/dependencies/qt.py +484 -0
  160. package/releng/meson/mesonbuild/dependencies/scalapack.py +142 -0
  161. package/releng/meson/mesonbuild/dependencies/ui.py +281 -0
  162. package/releng/meson/mesonbuild/depfile.py +82 -0
  163. package/releng/meson/mesonbuild/envconfig.py +480 -0
  164. package/releng/meson/mesonbuild/environment.py +987 -0
  165. package/releng/meson/mesonbuild/interpreter/__init__.py +47 -0
  166. package/releng/meson/mesonbuild/interpreter/compiler.py +900 -0
  167. package/releng/meson/mesonbuild/interpreter/dependencyfallbacks.py +386 -0
  168. package/releng/meson/mesonbuild/interpreter/interpreter.py +3595 -0
  169. package/releng/meson/mesonbuild/interpreter/interpreterobjects.py +1096 -0
  170. package/releng/meson/mesonbuild/interpreter/kwargs.py +479 -0
  171. package/releng/meson/mesonbuild/interpreter/mesonmain.py +487 -0
  172. package/releng/meson/mesonbuild/interpreter/primitives/__init__.py +29 -0
  173. package/releng/meson/mesonbuild/interpreter/primitives/array.py +108 -0
  174. package/releng/meson/mesonbuild/interpreter/primitives/boolean.py +52 -0
  175. package/releng/meson/mesonbuild/interpreter/primitives/dict.py +88 -0
  176. package/releng/meson/mesonbuild/interpreter/primitives/integer.py +86 -0
  177. package/releng/meson/mesonbuild/interpreter/primitives/range.py +38 -0
  178. package/releng/meson/mesonbuild/interpreter/primitives/string.py +247 -0
  179. package/releng/meson/mesonbuild/interpreter/type_checking.py +853 -0
  180. package/releng/meson/mesonbuild/interpreterbase/__init__.py +126 -0
  181. package/releng/meson/mesonbuild/interpreterbase/_unholder.py +25 -0
  182. package/releng/meson/mesonbuild/interpreterbase/baseobjects.py +174 -0
  183. package/releng/meson/mesonbuild/interpreterbase/decorators.py +806 -0
  184. package/releng/meson/mesonbuild/interpreterbase/disabler.py +35 -0
  185. package/releng/meson/mesonbuild/interpreterbase/exceptions.py +22 -0
  186. package/releng/meson/mesonbuild/interpreterbase/helpers.py +67 -0
  187. package/releng/meson/mesonbuild/interpreterbase/interpreterbase.py +665 -0
  188. package/releng/meson/mesonbuild/interpreterbase/operator.py +32 -0
  189. package/releng/meson/mesonbuild/linkers/__init__.py +20 -0
  190. package/releng/meson/mesonbuild/linkers/base.py +39 -0
  191. package/releng/meson/mesonbuild/linkers/detect.py +229 -0
  192. package/releng/meson/mesonbuild/linkers/linkers.py +1614 -0
  193. package/releng/meson/mesonbuild/mcompile.py +380 -0
  194. package/releng/meson/mesonbuild/mconf.py +368 -0
  195. package/releng/meson/mesonbuild/mdevenv.py +234 -0
  196. package/releng/meson/mesonbuild/mdist.py +376 -0
  197. package/releng/meson/mesonbuild/mesondata.py +38 -0
  198. package/releng/meson/mesonbuild/mesonlib.py +23 -0
  199. package/releng/meson/mesonbuild/mesonmain.py +289 -0
  200. package/releng/meson/mesonbuild/minit.py +204 -0
  201. package/releng/meson/mesonbuild/minstall.py +864 -0
  202. package/releng/meson/mesonbuild/mintro.py +667 -0
  203. package/releng/meson/mesonbuild/mlog.py +542 -0
  204. package/releng/meson/mesonbuild/modules/__init__.py +270 -0
  205. package/releng/meson/mesonbuild/modules/cmake.py +442 -0
  206. package/releng/meson/mesonbuild/modules/cuda.py +377 -0
  207. package/releng/meson/mesonbuild/modules/dlang.py +117 -0
  208. package/releng/meson/mesonbuild/modules/external_project.py +306 -0
  209. package/releng/meson/mesonbuild/modules/fs.py +323 -0
  210. package/releng/meson/mesonbuild/modules/gnome.py +2215 -0
  211. package/releng/meson/mesonbuild/modules/hotdoc.py +487 -0
  212. package/releng/meson/mesonbuild/modules/i18n.py +405 -0
  213. package/releng/meson/mesonbuild/modules/icestorm.py +123 -0
  214. package/releng/meson/mesonbuild/modules/java.py +112 -0
  215. package/releng/meson/mesonbuild/modules/keyval.py +65 -0
  216. package/releng/meson/mesonbuild/modules/modtest.py +33 -0
  217. package/releng/meson/mesonbuild/modules/pkgconfig.py +744 -0
  218. package/releng/meson/mesonbuild/modules/python.py +556 -0
  219. package/releng/meson/mesonbuild/modules/python3.py +85 -0
  220. package/releng/meson/mesonbuild/modules/qt.py +621 -0
  221. package/releng/meson/mesonbuild/modules/qt4.py +23 -0
  222. package/releng/meson/mesonbuild/modules/qt5.py +23 -0
  223. package/releng/meson/mesonbuild/modules/qt6.py +22 -0
  224. package/releng/meson/mesonbuild/modules/rust.py +355 -0
  225. package/releng/meson/mesonbuild/modules/simd.py +114 -0
  226. package/releng/meson/mesonbuild/modules/sourceset.py +291 -0
  227. package/releng/meson/mesonbuild/modules/wayland.py +151 -0
  228. package/releng/meson/mesonbuild/modules/windows.py +207 -0
  229. package/releng/meson/mesonbuild/mparser.py +1114 -0
  230. package/releng/meson/mesonbuild/msetup.py +365 -0
  231. package/releng/meson/mesonbuild/msubprojects.py +764 -0
  232. package/releng/meson/mesonbuild/mtest.py +2201 -0
  233. package/releng/meson/mesonbuild/munstable_coredata.py +107 -0
  234. package/releng/meson/mesonbuild/optinterpreter.py +276 -0
  235. package/releng/meson/mesonbuild/programs.py +367 -0
  236. package/releng/meson/mesonbuild/rewriter.py +1075 -0
  237. package/releng/meson/mesonbuild/scripts/__init__.py +10 -0
  238. package/releng/meson/mesonbuild/scripts/clangformat.py +55 -0
  239. package/releng/meson/mesonbuild/scripts/clangtidy.py +30 -0
  240. package/releng/meson/mesonbuild/scripts/cleantrees.py +35 -0
  241. package/releng/meson/mesonbuild/scripts/cmake_run_ctgt.py +103 -0
  242. package/releng/meson/mesonbuild/scripts/cmd_or_ps.ps1 +17 -0
  243. package/releng/meson/mesonbuild/scripts/copy.py +19 -0
  244. package/releng/meson/mesonbuild/scripts/coverage.py +214 -0
  245. package/releng/meson/mesonbuild/scripts/delwithsuffix.py +27 -0
  246. package/releng/meson/mesonbuild/scripts/depfixer.py +495 -0
  247. package/releng/meson/mesonbuild/scripts/depscan.py +198 -0
  248. package/releng/meson/mesonbuild/scripts/dirchanger.py +20 -0
  249. package/releng/meson/mesonbuild/scripts/env2mfile.py +402 -0
  250. package/releng/meson/mesonbuild/scripts/externalproject.py +106 -0
  251. package/releng/meson/mesonbuild/scripts/gettext.py +86 -0
  252. package/releng/meson/mesonbuild/scripts/gtkdochelper.py +286 -0
  253. package/releng/meson/mesonbuild/scripts/hotdochelper.py +40 -0
  254. package/releng/meson/mesonbuild/scripts/itstool.py +77 -0
  255. package/releng/meson/mesonbuild/scripts/meson_exe.py +115 -0
  256. package/releng/meson/mesonbuild/scripts/msgfmthelper.py +29 -0
  257. package/releng/meson/mesonbuild/scripts/pycompile.py +54 -0
  258. package/releng/meson/mesonbuild/scripts/python_info.py +121 -0
  259. package/releng/meson/mesonbuild/scripts/regen_checker.py +55 -0
  260. package/releng/meson/mesonbuild/scripts/run_tool.py +58 -0
  261. package/releng/meson/mesonbuild/scripts/scanbuild.py +57 -0
  262. package/releng/meson/mesonbuild/scripts/symbolextractor.py +322 -0
  263. package/releng/meson/mesonbuild/scripts/tags.py +44 -0
  264. package/releng/meson/mesonbuild/scripts/test_loaded_modules.py +14 -0
  265. package/releng/meson/mesonbuild/scripts/uninstall.py +41 -0
  266. package/releng/meson/mesonbuild/scripts/vcstagger.py +35 -0
  267. package/releng/meson/mesonbuild/scripts/yasm.py +24 -0
  268. package/releng/meson/mesonbuild/templates/__init__.py +0 -0
  269. package/releng/meson/mesonbuild/templates/cpptemplates.py +143 -0
  270. package/releng/meson/mesonbuild/templates/cstemplates.py +90 -0
  271. package/releng/meson/mesonbuild/templates/ctemplates.py +126 -0
  272. package/releng/meson/mesonbuild/templates/cudatemplates.py +143 -0
  273. package/releng/meson/mesonbuild/templates/dlangtemplates.py +109 -0
  274. package/releng/meson/mesonbuild/templates/fortrantemplates.py +101 -0
  275. package/releng/meson/mesonbuild/templates/javatemplates.py +94 -0
  276. package/releng/meson/mesonbuild/templates/mesontemplates.py +70 -0
  277. package/releng/meson/mesonbuild/templates/objcpptemplates.py +126 -0
  278. package/releng/meson/mesonbuild/templates/objctemplates.py +126 -0
  279. package/releng/meson/mesonbuild/templates/rusttemplates.py +79 -0
  280. package/releng/meson/mesonbuild/templates/samplefactory.py +41 -0
  281. package/releng/meson/mesonbuild/templates/sampleimpl.py +160 -0
  282. package/releng/meson/mesonbuild/templates/valatemplates.py +82 -0
  283. package/releng/meson/mesonbuild/utils/__init__.py +0 -0
  284. package/releng/meson/mesonbuild/utils/core.py +166 -0
  285. package/releng/meson/mesonbuild/utils/platform.py +27 -0
  286. package/releng/meson/mesonbuild/utils/posix.py +32 -0
  287. package/releng/meson/mesonbuild/utils/universal.py +2445 -0
  288. package/releng/meson/mesonbuild/utils/vsenv.py +126 -0
  289. package/releng/meson/mesonbuild/utils/win32.py +29 -0
  290. package/releng/meson/mesonbuild/wrap/__init__.py +59 -0
  291. package/releng/meson/mesonbuild/wrap/wrap.py +846 -0
  292. package/releng/meson/mesonbuild/wrap/wraptool.py +198 -0
  293. package/releng/meson-scripts/BSDmakefile +6 -0
  294. package/releng/meson-scripts/Makefile +16 -0
  295. package/releng/meson-scripts/configure +18 -0
  296. package/releng/meson-scripts/configure.bat +22 -0
  297. package/releng/meson-scripts/make.bat +23 -0
  298. package/releng/meson_configure.py +506 -0
  299. package/releng/meson_make.py +131 -0
  300. package/releng/mkdevkit.py +107 -0
  301. package/releng/mkfatmacho.py +54 -0
  302. package/releng/post-process-oabi.py +97 -0
  303. package/releng/progress.py +14 -0
  304. package/releng/sync-from-upstream.py +185 -0
  305. package/releng/tomlkit/tomlkit/__init__.py +59 -0
  306. package/releng/tomlkit/tomlkit/_compat.py +22 -0
  307. package/releng/tomlkit/tomlkit/_types.py +83 -0
  308. package/releng/tomlkit/tomlkit/_utils.py +158 -0
  309. package/releng/tomlkit/tomlkit/api.py +308 -0
  310. package/releng/tomlkit/tomlkit/container.py +875 -0
  311. package/releng/tomlkit/tomlkit/exceptions.py +227 -0
  312. package/releng/tomlkit/tomlkit/items.py +1967 -0
  313. package/releng/tomlkit/tomlkit/parser.py +1141 -0
  314. package/releng/tomlkit/tomlkit/py.typed +0 -0
  315. package/releng/tomlkit/tomlkit/source.py +180 -0
  316. package/releng/tomlkit/tomlkit/toml_char.py +52 -0
  317. package/releng/tomlkit/tomlkit/toml_document.py +7 -0
  318. package/releng/tomlkit/tomlkit/toml_file.py +58 -0
  319. package/releng/winenv.py +140 -0
  320. package/scripts/adjust-version.py +19 -0
  321. package/scripts/detect-version.py +40 -0
  322. package/scripts/fetch-abi-bits.py +343 -0
  323. package/scripts/install.js +23 -0
  324. package/scripts/package.py +15 -0
  325. package/src/addon.cc +76 -0
  326. package/src/application.cc +148 -0
  327. package/src/application.h +31 -0
  328. package/src/authentication.cc +174 -0
  329. package/src/authentication.h +24 -0
  330. package/src/bus.cc +167 -0
  331. package/src/bus.h +33 -0
  332. package/src/cancellable.cc +117 -0
  333. package/src/cancellable.h +31 -0
  334. package/src/child.cc +150 -0
  335. package/src/child.h +32 -0
  336. package/src/crash.cc +122 -0
  337. package/src/crash.h +30 -0
  338. package/src/device.cc +1302 -0
  339. package/src/device.h +55 -0
  340. package/src/device_manager.cc +362 -0
  341. package/src/device_manager.h +35 -0
  342. package/src/endpoint_parameters.cc +171 -0
  343. package/src/endpoint_parameters.h +28 -0
  344. package/src/glib_context.cc +62 -0
  345. package/src/glib_context.h +29 -0
  346. package/src/glib_object.cc +25 -0
  347. package/src/glib_object.h +37 -0
  348. package/src/iostream.cc +247 -0
  349. package/src/iostream.h +30 -0
  350. package/src/meson.build +26 -0
  351. package/src/operation.h +94 -0
  352. package/src/portal_membership.cc +100 -0
  353. package/src/portal_membership.h +26 -0
  354. package/src/portal_service.cc +401 -0
  355. package/src/portal_service.h +40 -0
  356. package/src/process.cc +135 -0
  357. package/src/process.h +30 -0
  358. package/src/relay.cc +139 -0
  359. package/src/relay.h +31 -0
  360. package/src/runtime.cc +443 -0
  361. package/src/runtime.h +64 -0
  362. package/src/script.cc +301 -0
  363. package/src/script.h +36 -0
  364. package/src/session.cc +860 -0
  365. package/src/session.h +42 -0
  366. package/src/signals.cc +334 -0
  367. package/src/signals.h +47 -0
  368. package/src/spawn.cc +95 -0
  369. package/src/spawn.h +27 -0
  370. package/src/usage_monitor.h +117 -0
  371. package/src/uv_context.cc +118 -0
  372. package/src/uv_context.h +40 -0
  373. package/src/win_delay_load_hook.cc +63 -0
  374. package/subprojects/frida-core.wrap +8 -0
  375. package/subprojects/nan.wrap +9 -0
  376. package/subprojects/packagefiles/nan.patch +13 -0
  377. package/test/data/index.ts +13 -0
  378. package/test/data/unixvictim-linux-x86 +0 -0
  379. package/test/data/unixvictim-linux-x86_64 +0 -0
  380. package/test/data/unixvictim-macos +0 -0
  381. package/test/device.ts +27 -0
  382. package/test/device_manager.ts +16 -0
  383. package/test/labrat.ts +32 -0
  384. package/test/script.ts +176 -0
  385. package/test/session.ts +73 -0
  386. package/tsconfig.json +18 -0
@@ -0,0 +1,82 @@
1
+ if(MESON_PS_LOADED)
2
+ return()
3
+ endif()
4
+
5
+ set(MESON_PS_LOADED ON)
6
+
7
+ cmake_policy(PUSH)
8
+ cmake_policy(SET CMP0054 NEW) # https://cmake.org/cmake/help/latest/policy/CMP0054.html
9
+
10
+ # Dummy macros that have a special meaning in the meson code
11
+ macro(meson_ps_execute_delayed_calls)
12
+ endmacro()
13
+
14
+ macro(meson_ps_reload_vars)
15
+ endmacro()
16
+
17
+ macro(meson_ps_disabled_function)
18
+ message(WARNING "The function '${ARGV0}' is disabled in the context of CMake subprojects.\n"
19
+ "This should not be an issue but may lead to compilation errors.")
20
+ endmacro()
21
+
22
+ # Helper macro to inspect the current CMake state
23
+ macro(meson_ps_inspect_vars)
24
+ set(MESON_PS_CMAKE_CURRENT_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}")
25
+ set(MESON_PS_CMAKE_CURRENT_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
26
+ meson_ps_execute_delayed_calls()
27
+ endmacro()
28
+
29
+
30
+ # Override some system functions with custom code and forward the args
31
+ # to the original function
32
+ macro(add_custom_command)
33
+ meson_ps_inspect_vars()
34
+ _add_custom_command(${ARGV})
35
+ endmacro()
36
+
37
+ macro(add_custom_target)
38
+ meson_ps_inspect_vars()
39
+ _add_custom_target(${ARGV})
40
+ endmacro()
41
+
42
+ macro(set_property)
43
+ meson_ps_inspect_vars()
44
+ _set_property(${ARGV})
45
+ endmacro()
46
+
47
+ function(set_source_files_properties)
48
+ set(FILES)
49
+ set(I 0)
50
+ set(PROPERTIES OFF)
51
+
52
+ while(I LESS ARGC)
53
+ if(NOT PROPERTIES)
54
+ if("${ARGV${I}}" STREQUAL "PROPERTIES")
55
+ set(PROPERTIES ON)
56
+ else()
57
+ list(APPEND FILES "${ARGV${I}}")
58
+ endif()
59
+
60
+ math(EXPR I "${I} + 1")
61
+ else()
62
+ set(ID_IDX ${I})
63
+ math(EXPR PROP_IDX "${ID_IDX} + 1")
64
+
65
+ set(ID "${ARGV${ID_IDX}}")
66
+ set(PROP "${ARGV${PROP_IDX}}")
67
+
68
+ set_property(SOURCE ${FILES} PROPERTY "${ID}" "${PROP}")
69
+ math(EXPR I "${I} + 2")
70
+ endif()
71
+ endwhile()
72
+ endfunction()
73
+
74
+ # Disable some functions that would mess up the CMake meson integration
75
+ macro(target_precompile_headers)
76
+ meson_ps_disabled_function(target_precompile_headers)
77
+ endmacro()
78
+
79
+ set(MESON_PS_DELAYED_CALLS add_custom_command;add_custom_target;set_property)
80
+ meson_ps_reload_vars()
81
+
82
+ cmake_policy(POP)
@@ -0,0 +1,241 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+ # Copyright 2019 The Meson development team
3
+
4
+ from __future__ import annotations
5
+
6
+ import subprocess as S
7
+ from threading import Thread
8
+ import typing as T
9
+ import re
10
+ import os
11
+
12
+ from .. import mlog
13
+ from ..mesonlib import PerMachine, Popen_safe, version_compare, is_windows, OptionKey
14
+ from ..programs import find_external_program, NonExistingExternalProgram
15
+
16
+ if T.TYPE_CHECKING:
17
+ from pathlib import Path
18
+
19
+ from ..environment import Environment
20
+ from ..mesonlib import MachineChoice
21
+ from ..programs import ExternalProgram
22
+
23
+ TYPE_result = T.Tuple[int, T.Optional[str], T.Optional[str]]
24
+ TYPE_cache_key = T.Tuple[str, T.Tuple[str, ...], str, T.FrozenSet[T.Tuple[str, str]]]
25
+
26
+ class CMakeExecutor:
27
+ # The class's copy of the CMake path. Avoids having to search for it
28
+ # multiple times in the same Meson invocation.
29
+ class_cmakebin: PerMachine[T.Optional[ExternalProgram]] = PerMachine(None, None)
30
+ class_cmakevers: PerMachine[T.Optional[str]] = PerMachine(None, None)
31
+ class_cmake_cache: T.Dict[T.Any, TYPE_result] = {}
32
+
33
+ def __init__(self, environment: 'Environment', version: str, for_machine: MachineChoice, silent: bool = False):
34
+ self.min_version = version
35
+ self.environment = environment
36
+ self.for_machine = for_machine
37
+ self.cmakebin, self.cmakevers = self.find_cmake_binary(self.environment, silent=silent)
38
+ self.always_capture_stderr = True
39
+ self.print_cmout = False
40
+ self.prefix_paths: T.List[str] = []
41
+ self.extra_cmake_args: T.List[str] = []
42
+
43
+ if self.cmakebin is None:
44
+ return
45
+
46
+ if not version_compare(self.cmakevers, self.min_version):
47
+ mlog.warning(
48
+ 'The version of CMake', mlog.bold(self.cmakebin.get_path()),
49
+ 'is', mlog.bold(self.cmakevers), 'but version', mlog.bold(self.min_version),
50
+ 'is required')
51
+ self.cmakebin = None
52
+ return
53
+
54
+ self.prefix_paths = self.environment.coredata.options[OptionKey('cmake_prefix_path', machine=self.for_machine)].value
55
+ if self.prefix_paths:
56
+ self.extra_cmake_args += ['-DCMAKE_PREFIX_PATH={}'.format(';'.join(self.prefix_paths))]
57
+
58
+ def find_cmake_binary(self, environment: 'Environment', silent: bool = False) -> T.Tuple[T.Optional['ExternalProgram'], T.Optional[str]]:
59
+ # Only search for CMake the first time and store the result in the class
60
+ # definition
61
+ if isinstance(CMakeExecutor.class_cmakebin[self.for_machine], NonExistingExternalProgram):
62
+ mlog.debug(f'CMake binary for {self.for_machine} is cached as not found')
63
+ return None, None
64
+ elif CMakeExecutor.class_cmakebin[self.for_machine] is not None:
65
+ mlog.debug(f'CMake binary for {self.for_machine} is cached.')
66
+ else:
67
+ assert CMakeExecutor.class_cmakebin[self.for_machine] is None
68
+
69
+ mlog.debug(f'CMake binary for {self.for_machine} is not cached')
70
+ for potential_cmakebin in find_external_program(
71
+ environment, self.for_machine, 'cmake', 'CMake',
72
+ environment.default_cmake, allow_default_for_cross=False):
73
+ version_if_ok = self.check_cmake(potential_cmakebin)
74
+ if not version_if_ok:
75
+ continue
76
+ if not silent:
77
+ mlog.log('Found CMake:', mlog.bold(potential_cmakebin.get_path()),
78
+ f'({version_if_ok})')
79
+ CMakeExecutor.class_cmakebin[self.for_machine] = potential_cmakebin
80
+ CMakeExecutor.class_cmakevers[self.for_machine] = version_if_ok
81
+ break
82
+ else:
83
+ if not silent:
84
+ mlog.log('Found CMake:', mlog.red('NO'))
85
+ # Set to False instead of None to signify that we've already
86
+ # searched for it and not found it
87
+ CMakeExecutor.class_cmakebin[self.for_machine] = NonExistingExternalProgram()
88
+ CMakeExecutor.class_cmakevers[self.for_machine] = None
89
+ return None, None
90
+
91
+ return CMakeExecutor.class_cmakebin[self.for_machine], CMakeExecutor.class_cmakevers[self.for_machine]
92
+
93
+ def check_cmake(self, cmakebin: 'ExternalProgram') -> T.Optional[str]:
94
+ if not cmakebin.found():
95
+ mlog.log(f'Did not find CMake {cmakebin.name!r}')
96
+ return None
97
+ try:
98
+ cmd = cmakebin.get_command()
99
+ p, out = Popen_safe(cmd + ['--version'])[0:2]
100
+ if p.returncode != 0:
101
+ mlog.warning('Found CMake {!r} but couldn\'t run it'
102
+ ''.format(' '.join(cmd)))
103
+ return None
104
+ except FileNotFoundError:
105
+ mlog.warning('We thought we found CMake {!r} but now it\'s not there. How odd!'
106
+ ''.format(' '.join(cmd)))
107
+ return None
108
+ except PermissionError:
109
+ msg = 'Found CMake {!r} but didn\'t have permissions to run it.'.format(' '.join(cmd))
110
+ if not is_windows():
111
+ msg += '\n\nOn Unix-like systems this is often caused by scripts that are not executable.'
112
+ mlog.warning(msg)
113
+ return None
114
+
115
+ cmvers = re.search(r'(cmake|cmake3)\s*version\s*([\d.]+)', out)
116
+ if cmvers is not None:
117
+ return cmvers.group(2)
118
+ mlog.warning(f'We thought we found CMake {cmd!r}, but it was missing the expected '
119
+ 'version string in its output.')
120
+ return None
121
+
122
+ def set_exec_mode(self, print_cmout: T.Optional[bool] = None, always_capture_stderr: T.Optional[bool] = None) -> None:
123
+ if print_cmout is not None:
124
+ self.print_cmout = print_cmout
125
+ if always_capture_stderr is not None:
126
+ self.always_capture_stderr = always_capture_stderr
127
+
128
+ def _cache_key(self, args: T.List[str], build_dir: Path, env: T.Optional[T.Dict[str, str]]) -> TYPE_cache_key:
129
+ fenv = frozenset(env.items()) if env is not None else frozenset()
130
+ targs = tuple(args)
131
+ return (self.cmakebin.get_path(), targs, build_dir.as_posix(), fenv)
132
+
133
+ def _call_cmout_stderr(self, args: T.List[str], build_dir: Path, env: T.Optional[T.Dict[str, str]]) -> TYPE_result:
134
+ cmd = self.cmakebin.get_command() + args
135
+ proc = S.Popen(cmd, stdout=S.PIPE, stderr=S.PIPE, cwd=str(build_dir), env=env) # TODO [PYTHON_37]: drop Path conversion
136
+
137
+ # stdout and stderr MUST be read at the same time to avoid pipe
138
+ # blocking issues. The easiest way to do this is with a separate
139
+ # thread for one of the pipes.
140
+ def print_stdout() -> None:
141
+ while True:
142
+ line = proc.stdout.readline()
143
+ if not line:
144
+ break
145
+ mlog.log(line.decode(errors='ignore').strip('\n'))
146
+ proc.stdout.close()
147
+
148
+ t = Thread(target=print_stdout)
149
+ t.start()
150
+
151
+ try:
152
+ # Read stderr line by line and log non trace lines
153
+ raw_trace = ''
154
+ tline_start_reg = re.compile(r'^\s*(.*\.(cmake|txt))\(([0-9]+)\):\s*(\w+)\(.*$')
155
+ inside_multiline_trace = False
156
+ while True:
157
+ line_raw = proc.stderr.readline()
158
+ if not line_raw:
159
+ break
160
+ line = line_raw.decode(errors='ignore')
161
+ if tline_start_reg.match(line):
162
+ raw_trace += line
163
+ inside_multiline_trace = not line.endswith(' )\n')
164
+ elif inside_multiline_trace:
165
+ raw_trace += line
166
+ else:
167
+ mlog.warning(line.strip('\n'))
168
+
169
+ finally:
170
+ proc.stderr.close()
171
+ t.join()
172
+ proc.wait()
173
+
174
+ return proc.returncode, None, raw_trace
175
+
176
+ def _call_cmout(self, args: T.List[str], build_dir: Path, env: T.Optional[T.Dict[str, str]]) -> TYPE_result:
177
+ cmd = self.cmakebin.get_command() + args
178
+ proc = S.Popen(cmd, stdout=S.PIPE, stderr=S.STDOUT, cwd=str(build_dir), env=env) # TODO [PYTHON_37]: drop Path conversion
179
+ while True:
180
+ line = proc.stdout.readline()
181
+ if not line:
182
+ break
183
+ mlog.log(line.decode(errors='ignore').strip('\n'))
184
+ proc.stdout.close()
185
+ proc.wait()
186
+ return proc.returncode, None, None
187
+
188
+ def _call_quiet(self, args: T.List[str], build_dir: Path, env: T.Optional[T.Dict[str, str]]) -> TYPE_result:
189
+ build_dir.mkdir(parents=True, exist_ok=True)
190
+ cmd = self.cmakebin.get_command() + args
191
+ ret = S.run(cmd, env=env, cwd=str(build_dir), close_fds=False,
192
+ stdout=S.PIPE, stderr=S.PIPE, universal_newlines=False) # TODO [PYTHON_37]: drop Path conversion
193
+ rc = ret.returncode
194
+ out = ret.stdout.decode(errors='ignore')
195
+ err = ret.stderr.decode(errors='ignore')
196
+ return rc, out, err
197
+
198
+ def _call_impl(self, args: T.List[str], build_dir: Path, env: T.Optional[T.Dict[str, str]]) -> TYPE_result:
199
+ mlog.debug(f'Calling CMake ({self.cmakebin.get_command()}) in {build_dir} with:')
200
+ for i in args:
201
+ mlog.debug(f' - "{i}"')
202
+ if not self.print_cmout:
203
+ return self._call_quiet(args, build_dir, env)
204
+ else:
205
+ if self.always_capture_stderr:
206
+ return self._call_cmout_stderr(args, build_dir, env)
207
+ else:
208
+ return self._call_cmout(args, build_dir, env)
209
+
210
+ def call(self, args: T.List[str], build_dir: Path, env: T.Optional[T.Dict[str, str]] = None, disable_cache: bool = False) -> TYPE_result:
211
+ if env is None:
212
+ env = os.environ.copy()
213
+
214
+ args = args + self.extra_cmake_args
215
+ if disable_cache:
216
+ return self._call_impl(args, build_dir, env)
217
+
218
+ # First check if cached, if not call the real cmake function
219
+ cache = CMakeExecutor.class_cmake_cache
220
+ key = self._cache_key(args, build_dir, env)
221
+ if key not in cache:
222
+ cache[key] = self._call_impl(args, build_dir, env)
223
+ return cache[key]
224
+
225
+ def found(self) -> bool:
226
+ return self.cmakebin is not None
227
+
228
+ def version(self) -> str:
229
+ return self.cmakevers
230
+
231
+ def executable_path(self) -> str:
232
+ return self.cmakebin.get_path()
233
+
234
+ def get_command(self) -> T.List[str]:
235
+ return self.cmakebin.get_command()
236
+
237
+ def get_cmake_prefix_paths(self) -> T.List[str]:
238
+ return self.prefix_paths
239
+
240
+ def machine_choice(self) -> MachineChoice:
241
+ return self.for_machine
@@ -0,0 +1,324 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+ # Copyright 2019 The Meson development team
3
+
4
+ from __future__ import annotations
5
+
6
+ from .common import CMakeException, CMakeBuildFile, CMakeConfiguration
7
+ import typing as T
8
+ from .. import mlog
9
+ from pathlib import Path
10
+ import json
11
+ import re
12
+
13
+ STRIP_KEYS = ['cmake', 'reply', 'backtrace', 'backtraceGraph', 'version']
14
+
15
+ class CMakeFileAPI:
16
+ def __init__(self, build_dir: Path):
17
+ self.build_dir = build_dir
18
+ self.api_base_dir = self.build_dir / '.cmake' / 'api' / 'v1'
19
+ self.request_dir = self.api_base_dir / 'query' / 'client-meson'
20
+ self.reply_dir = self.api_base_dir / 'reply'
21
+ self.cmake_sources: T.List[CMakeBuildFile] = []
22
+ self.cmake_configurations: T.List[CMakeConfiguration] = []
23
+ self.project_version = ''
24
+ self.kind_resolver_map = {
25
+ 'codemodel': self._parse_codemodel,
26
+ 'cache': self._parse_cache,
27
+ 'cmakeFiles': self._parse_cmakeFiles,
28
+ }
29
+
30
+ def get_cmake_sources(self) -> T.List[CMakeBuildFile]:
31
+ return self.cmake_sources
32
+
33
+ def get_cmake_configurations(self) -> T.List[CMakeConfiguration]:
34
+ return self.cmake_configurations
35
+
36
+ def get_project_version(self) -> str:
37
+ return self.project_version
38
+
39
+ def setup_request(self) -> None:
40
+ self.request_dir.mkdir(parents=True, exist_ok=True)
41
+
42
+ query = {
43
+ 'requests': [
44
+ {'kind': 'codemodel', 'version': {'major': 2, 'minor': 0}},
45
+ {'kind': 'cache', 'version': {'major': 2, 'minor': 0}},
46
+ {'kind': 'cmakeFiles', 'version': {'major': 1, 'minor': 0}},
47
+ ]
48
+ }
49
+
50
+ query_file = self.request_dir / 'query.json'
51
+ query_file.write_text(json.dumps(query, indent=2), encoding='utf-8')
52
+
53
+ def load_reply(self) -> None:
54
+ if not self.reply_dir.is_dir():
55
+ raise CMakeException('No response from the CMake file API')
56
+
57
+ root = None
58
+ reg_index = re.compile(r'^index-.*\.json$')
59
+ for i in self.reply_dir.iterdir():
60
+ if reg_index.match(i.name):
61
+ root = i
62
+ break
63
+
64
+ if not root:
65
+ raise CMakeException('Failed to find the CMake file API index')
66
+
67
+ index = self._reply_file_content(root) # Load the root index
68
+ index = self._strip_data(index) # Avoid loading duplicate files
69
+ index = self._resolve_references(index) # Load everything
70
+ index = self._strip_data(index) # Strip unused data (again for loaded files)
71
+
72
+ # Debug output
73
+ debug_json = self.build_dir / '..' / 'fileAPI.json'
74
+ debug_json = debug_json.resolve()
75
+ debug_json.write_text(json.dumps(index, indent=2), encoding='utf-8')
76
+ mlog.cmd_ci_include(debug_json.as_posix())
77
+
78
+ # parse the JSON
79
+ for i in index['objects']:
80
+ assert isinstance(i, dict)
81
+ assert 'kind' in i
82
+ assert i['kind'] in self.kind_resolver_map
83
+
84
+ self.kind_resolver_map[i['kind']](i)
85
+
86
+ def _parse_codemodel(self, data: T.Dict[str, T.Any]) -> None:
87
+ assert 'configurations' in data
88
+ assert 'paths' in data
89
+
90
+ source_dir = data['paths']['source']
91
+ build_dir = data['paths']['build']
92
+
93
+ # The file API output differs quite a bit from the server
94
+ # output. It is more flat than the server output and makes
95
+ # heavy use of references. Here these references are
96
+ # resolved and the resulting data structure is identical
97
+ # to the CMake serve output.
98
+
99
+ def helper_parse_dir(dir_entry: T.Dict[str, T.Any]) -> T.Tuple[Path, Path]:
100
+ src_dir = Path(dir_entry.get('source', '.'))
101
+ bld_dir = Path(dir_entry.get('build', '.'))
102
+ src_dir = src_dir if src_dir.is_absolute() else source_dir / src_dir
103
+ bld_dir = bld_dir if bld_dir.is_absolute() else build_dir / bld_dir
104
+ src_dir = src_dir.resolve()
105
+ bld_dir = bld_dir.resolve()
106
+
107
+ return src_dir, bld_dir
108
+
109
+ def parse_sources(comp_group: T.Dict[str, T.Any], tgt: T.Dict[str, T.Any]) -> T.Tuple[T.List[Path], T.List[Path], T.List[int]]:
110
+ gen = []
111
+ src = []
112
+ idx = []
113
+
114
+ src_list_raw = tgt.get('sources', [])
115
+ for i in comp_group.get('sourceIndexes', []):
116
+ if i >= len(src_list_raw) or 'path' not in src_list_raw[i]:
117
+ continue
118
+ if src_list_raw[i].get('isGenerated', False):
119
+ gen += [Path(src_list_raw[i]['path'])]
120
+ else:
121
+ src += [Path(src_list_raw[i]['path'])]
122
+ idx += [i]
123
+
124
+ return src, gen, idx
125
+
126
+ def parse_target(tgt: T.Dict[str, T.Any]) -> T.Dict[str, T.Any]:
127
+ src_dir, bld_dir = helper_parse_dir(cnf.get('paths', {}))
128
+
129
+ # Parse install paths (if present)
130
+ install_paths = []
131
+ if 'install' in tgt:
132
+ prefix = Path(tgt['install']['prefix']['path'])
133
+ install_paths = [prefix / x['path'] for x in tgt['install']['destinations']]
134
+ install_paths = list(set(install_paths))
135
+
136
+ # On the first look, it looks really nice that the CMake devs have
137
+ # decided to use arrays for the linker flags. However, this feeling
138
+ # soon turns into despair when you realize that there only one entry
139
+ # per type in most cases, and we still have to do manual string splitting.
140
+ link_flags = []
141
+ link_libs = []
142
+ for i in tgt.get('link', {}).get('commandFragments', []):
143
+ if i['role'] == 'flags':
144
+ link_flags += [i['fragment']]
145
+ elif i['role'] == 'libraries':
146
+ link_libs += [i['fragment']]
147
+ elif i['role'] == 'libraryPath':
148
+ link_flags += ['-L{}'.format(i['fragment'])]
149
+ elif i['role'] == 'frameworkPath':
150
+ link_flags += ['-F{}'.format(i['fragment'])]
151
+ for i in tgt.get('archive', {}).get('commandFragments', []):
152
+ if i['role'] == 'flags':
153
+ link_flags += [i['fragment']]
154
+
155
+ # TODO The `dependencies` entry is new in the file API.
156
+ # maybe we can make use of that in addition to the
157
+ # implicit dependency detection
158
+ tgt_data = {
159
+ 'artifacts': [Path(x.get('path', '')) for x in tgt.get('artifacts', [])],
160
+ 'sourceDirectory': src_dir,
161
+ 'buildDirectory': bld_dir,
162
+ 'name': tgt.get('name', ''),
163
+ 'fullName': tgt.get('nameOnDisk', ''),
164
+ 'hasInstallRule': 'install' in tgt,
165
+ 'installPaths': install_paths,
166
+ 'linkerLanguage': tgt.get('link', {}).get('language', 'CXX'),
167
+ 'linkLibraries': ' '.join(link_libs), # See previous comment block why we join the array
168
+ 'linkFlags': ' '.join(link_flags), # See previous comment block why we join the array
169
+ 'type': tgt.get('type', 'EXECUTABLE'),
170
+ 'fileGroups': [],
171
+ }
172
+
173
+ processed_src_idx = []
174
+ for cg in tgt.get('compileGroups', []):
175
+ # Again, why an array, when there is usually only one element
176
+ # and arguments are separated with spaces...
177
+ flags = []
178
+ for i in cg.get('compileCommandFragments', []):
179
+ flags += [i['fragment']]
180
+
181
+ cg_data = {
182
+ 'defines': [x.get('define', '') for x in cg.get('defines', [])],
183
+ 'compileFlags': ' '.join(flags),
184
+ 'language': cg.get('language', 'C'),
185
+ 'isGenerated': None, # Set later, flag is stored per source file
186
+ 'sources': [],
187
+ 'includePath': cg.get('includes', []),
188
+ }
189
+
190
+ normal_src, generated_src, src_idx = parse_sources(cg, tgt)
191
+ if normal_src:
192
+ cg_data = dict(cg_data)
193
+ cg_data['isGenerated'] = False
194
+ cg_data['sources'] = normal_src
195
+ tgt_data['fileGroups'] += [cg_data]
196
+ if generated_src:
197
+ cg_data = dict(cg_data)
198
+ cg_data['isGenerated'] = True
199
+ cg_data['sources'] = generated_src
200
+ tgt_data['fileGroups'] += [cg_data]
201
+ processed_src_idx += src_idx
202
+
203
+ # Object libraries have no compile groups, only source groups.
204
+ # So we add all the source files to a dummy source group that were
205
+ # not found in the previous loop
206
+ normal_src = []
207
+ generated_src = []
208
+ for idx, src in enumerate(tgt.get('sources', [])):
209
+ if idx in processed_src_idx:
210
+ continue
211
+
212
+ if src.get('isGenerated', False):
213
+ generated_src += [src['path']]
214
+ else:
215
+ normal_src += [src['path']]
216
+
217
+ if normal_src:
218
+ tgt_data['fileGroups'] += [{
219
+ 'isGenerated': False,
220
+ 'sources': normal_src,
221
+ }]
222
+ if generated_src:
223
+ tgt_data['fileGroups'] += [{
224
+ 'isGenerated': True,
225
+ 'sources': generated_src,
226
+ }]
227
+ return tgt_data
228
+
229
+ def parse_project(pro: T.Dict[str, T.Any]) -> T.Dict[str, T.Any]:
230
+ # Only look at the first directory specified in directoryIndexes
231
+ # TODO Figure out what the other indexes are there for
232
+ p_src_dir = source_dir
233
+ p_bld_dir = build_dir
234
+ try:
235
+ p_src_dir, p_bld_dir = helper_parse_dir(cnf['directories'][pro['directoryIndexes'][0]])
236
+ except (IndexError, KeyError):
237
+ pass
238
+
239
+ pro_data = {
240
+ 'name': pro.get('name', ''),
241
+ 'sourceDirectory': p_src_dir,
242
+ 'buildDirectory': p_bld_dir,
243
+ 'targets': [],
244
+ }
245
+
246
+ for ref in pro.get('targetIndexes', []):
247
+ tgt = {}
248
+ try:
249
+ tgt = cnf['targets'][ref]
250
+ except (IndexError, KeyError):
251
+ pass
252
+ pro_data['targets'] += [parse_target(tgt)]
253
+
254
+ return pro_data
255
+
256
+ for cnf in data.get('configurations', []):
257
+ cnf_data = {
258
+ 'name': cnf.get('name', ''),
259
+ 'projects': [],
260
+ }
261
+
262
+ for pro in cnf.get('projects', []):
263
+ cnf_data['projects'] += [parse_project(pro)]
264
+
265
+ self.cmake_configurations += [CMakeConfiguration(cnf_data)]
266
+
267
+ def _parse_cmakeFiles(self, data: T.Dict[str, T.Any]) -> None:
268
+ assert 'inputs' in data
269
+ assert 'paths' in data
270
+
271
+ src_dir = Path(data['paths']['source'])
272
+
273
+ for i in data['inputs']:
274
+ path = Path(i['path'])
275
+ path = path if path.is_absolute() else src_dir / path
276
+ self.cmake_sources += [CMakeBuildFile(path, i.get('isCMake', False), i.get('isGenerated', False))]
277
+
278
+ def _parse_cache(self, data: T.Dict[str, T.Any]) -> None:
279
+ assert 'entries' in data
280
+
281
+ for e in data['entries']:
282
+ if e['name'] == 'CMAKE_PROJECT_VERSION':
283
+ self.project_version = e['value']
284
+
285
+ def _strip_data(self, data: T.Any) -> T.Any:
286
+ if isinstance(data, list):
287
+ for idx, i in enumerate(data):
288
+ data[idx] = self._strip_data(i)
289
+
290
+ elif isinstance(data, dict):
291
+ new = {}
292
+ for key, val in data.items():
293
+ if key not in STRIP_KEYS:
294
+ new[key] = self._strip_data(val)
295
+ data = new
296
+
297
+ return data
298
+
299
+ def _resolve_references(self, data: T.Any) -> T.Any:
300
+ if isinstance(data, list):
301
+ for idx, i in enumerate(data):
302
+ data[idx] = self._resolve_references(i)
303
+
304
+ elif isinstance(data, dict):
305
+ # Check for the "magic" reference entry and insert
306
+ # it into the root data dict
307
+ if 'jsonFile' in data:
308
+ data.update(self._reply_file_content(data['jsonFile']))
309
+
310
+ for key, val in data.items():
311
+ data[key] = self._resolve_references(val)
312
+
313
+ return data
314
+
315
+ def _reply_file_content(self, filename: Path) -> T.Dict[str, T.Any]:
316
+ real_path = self.reply_dir / filename
317
+ if not real_path.exists():
318
+ raise CMakeException(f'File "{real_path}" does not exist')
319
+
320
+ data = json.loads(real_path.read_text(encoding='utf-8'))
321
+ assert isinstance(data, dict)
322
+ for i in data.keys():
323
+ assert isinstance(i, str)
324
+ return data