frida 16.2.1 → 16.2.3

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,656 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+ # Copyright 2013-2021 The Meson development team
3
+
4
+ from __future__ import annotations
5
+
6
+ from .base import ExternalDependency, DependencyException, DependencyTypeName
7
+ from ..mesonlib import is_windows, MesonException, PerMachine, stringlistify, extract_as_list
8
+ from ..cmake import CMakeExecutor, CMakeTraceParser, CMakeException, CMakeToolchain, CMakeExecScope, check_cmake_args, resolve_cmake_trace_targets, cmake_is_debug
9
+ from .. import mlog
10
+ import importlib.resources
11
+ from pathlib import Path
12
+ import functools
13
+ import re
14
+ import os
15
+ import shutil
16
+ import textwrap
17
+ import typing as T
18
+
19
+ if T.TYPE_CHECKING:
20
+ from ..cmake import CMakeTarget
21
+ from ..environment import Environment
22
+ from ..envconfig import MachineInfo
23
+ from ..interpreter.type_checking import PkgConfigDefineType
24
+
25
+ class CMakeInfo(T.NamedTuple):
26
+ module_paths: T.List[str]
27
+ cmake_root: str
28
+ archs: T.List[str]
29
+ common_paths: T.List[str]
30
+
31
+ class CMakeDependency(ExternalDependency):
32
+ # The class's copy of the CMake path. Avoids having to search for it
33
+ # multiple times in the same Meson invocation.
34
+ class_cmakeinfo: PerMachine[T.Optional[CMakeInfo]] = PerMachine(None, None)
35
+ # Version string for the minimum CMake version
36
+ class_cmake_version = '>=3.4'
37
+ # CMake generators to try (empty for no generator)
38
+ class_cmake_generators = ['', 'Ninja', 'Unix Makefiles', 'Visual Studio 10 2010']
39
+ class_working_generator: T.Optional[str] = None
40
+
41
+ def _gen_exception(self, msg: str) -> DependencyException:
42
+ return DependencyException(f'Dependency {self.name} not found: {msg}')
43
+
44
+ def _main_cmake_file(self) -> str:
45
+ return 'CMakeLists.txt'
46
+
47
+ def _extra_cmake_opts(self) -> T.List[str]:
48
+ return []
49
+
50
+ def _map_module_list(self, modules: T.List[T.Tuple[str, bool]], components: T.List[T.Tuple[str, bool]]) -> T.List[T.Tuple[str, bool]]:
51
+ # Map the input module list to something else
52
+ # This function will only be executed AFTER the initial CMake
53
+ # interpreter pass has completed. Thus variables defined in the
54
+ # CMakeLists.txt can be accessed here.
55
+ #
56
+ # Both the modules and components inputs contain the original lists.
57
+ return modules
58
+
59
+ def _map_component_list(self, modules: T.List[T.Tuple[str, bool]], components: T.List[T.Tuple[str, bool]]) -> T.List[T.Tuple[str, bool]]:
60
+ # Map the input components list to something else. This
61
+ # function will be executed BEFORE the initial CMake interpreter
62
+ # pass. Thus variables from the CMakeLists.txt can NOT be accessed.
63
+ #
64
+ # Both the modules and components inputs contain the original lists.
65
+ return components
66
+
67
+ def _original_module_name(self, module: str) -> str:
68
+ # Reverse the module mapping done by _map_module_list for
69
+ # one module
70
+ return module
71
+
72
+ def __init__(self, name: str, environment: 'Environment', kwargs: T.Dict[str, T.Any], language: T.Optional[str] = None, force_use_global_compilers: bool = False) -> None:
73
+ # Gather a list of all languages to support
74
+ self.language_list: T.List[str] = []
75
+ if language is None or force_use_global_compilers:
76
+ compilers = None
77
+ if kwargs.get('native', False):
78
+ compilers = environment.coredata.compilers.build
79
+ else:
80
+ compilers = environment.coredata.compilers.host
81
+
82
+ candidates = ['c', 'cpp', 'fortran', 'objc', 'objcxx']
83
+ self.language_list += [x for x in candidates if x in compilers]
84
+ else:
85
+ self.language_list += [language]
86
+
87
+ # Add additional languages if required
88
+ if 'fortran' in self.language_list:
89
+ self.language_list += ['c']
90
+
91
+ # Ensure that the list is unique
92
+ self.language_list = list(set(self.language_list))
93
+
94
+ super().__init__(DependencyTypeName('cmake'), environment, kwargs, language=language)
95
+ self.name = name
96
+ self.is_libtool = False
97
+
98
+ # Where all CMake "build dirs" are located
99
+ self.cmake_root_dir = environment.scratch_dir
100
+
101
+ # T.List of successfully found modules
102
+ self.found_modules: T.List[str] = []
103
+
104
+ # Store a copy of the CMake path on the object itself so it is
105
+ # stored in the pickled coredata and recovered.
106
+ #
107
+ # TODO further evaluate always using MachineChoice.BUILD
108
+ self.cmakebin = CMakeExecutor(environment, CMakeDependency.class_cmake_version, self.for_machine, silent=self.silent)
109
+ if not self.cmakebin.found():
110
+ msg = f'CMake binary for machine {self.for_machine} not found. Giving up.'
111
+ if self.required:
112
+ raise DependencyException(msg)
113
+ mlog.debug(msg)
114
+ return
115
+
116
+ # Setup the trace parser
117
+ self.traceparser = CMakeTraceParser(self.cmakebin.version(), self._get_build_dir(), self.env)
118
+
119
+ cm_args = stringlistify(extract_as_list(kwargs, 'cmake_args'))
120
+ cm_args = check_cmake_args(cm_args)
121
+ if CMakeDependency.class_cmakeinfo[self.for_machine] is None:
122
+ CMakeDependency.class_cmakeinfo[self.for_machine] = self._get_cmake_info(cm_args)
123
+ cmakeinfo = CMakeDependency.class_cmakeinfo[self.for_machine]
124
+ if cmakeinfo is None:
125
+ raise self._gen_exception('Unable to obtain CMake system information')
126
+ self.cmakeinfo = cmakeinfo
127
+
128
+ package_version = kwargs.get('cmake_package_version', '')
129
+ if not isinstance(package_version, str):
130
+ raise DependencyException('Keyword "cmake_package_version" must be a string.')
131
+ components = [(x, True) for x in stringlistify(extract_as_list(kwargs, 'components'))]
132
+ modules = [(x, True) for x in stringlistify(extract_as_list(kwargs, 'modules'))]
133
+ modules += [(x, False) for x in stringlistify(extract_as_list(kwargs, 'optional_modules'))]
134
+ cm_path = stringlistify(extract_as_list(kwargs, 'cmake_module_path'))
135
+ cm_path = [x if os.path.isabs(x) else os.path.join(environment.get_source_dir(), x) for x in cm_path]
136
+ if cm_path:
137
+ cm_args.append('-DCMAKE_MODULE_PATH=' + ';'.join(cm_path))
138
+ if not self._preliminary_find_check(name, cm_path, self.cmakebin.get_cmake_prefix_paths(), environment.machines[self.for_machine]):
139
+ mlog.debug('Preliminary CMake check failed. Aborting.')
140
+ return
141
+ self._detect_dep(name, package_version, modules, components, cm_args)
142
+
143
+ def __repr__(self) -> str:
144
+ return f'<{self.__class__.__name__} {self.name}: {self.is_found} {self.version_reqs}>'
145
+
146
+ def _get_cmake_info(self, cm_args: T.List[str]) -> T.Optional[CMakeInfo]:
147
+ mlog.debug("Extracting basic cmake information")
148
+
149
+ # Try different CMake generators since specifying no generator may fail
150
+ # in cygwin for some reason
151
+ gen_list = []
152
+ # First try the last working generator
153
+ if CMakeDependency.class_working_generator is not None:
154
+ gen_list += [CMakeDependency.class_working_generator]
155
+ gen_list += CMakeDependency.class_cmake_generators
156
+
157
+ temp_parser = CMakeTraceParser(self.cmakebin.version(), self._get_build_dir(), self.env)
158
+ toolchain = CMakeToolchain(self.cmakebin, self.env, self.for_machine, CMakeExecScope.DEPENDENCY, self._get_build_dir())
159
+ toolchain.write()
160
+
161
+ for i in gen_list:
162
+ mlog.debug('Try CMake generator: {}'.format(i if len(i) > 0 else 'auto'))
163
+
164
+ # Prepare options
165
+ cmake_opts = temp_parser.trace_args() + toolchain.get_cmake_args() + ['.']
166
+ cmake_opts += cm_args
167
+ if len(i) > 0:
168
+ cmake_opts = ['-G', i] + cmake_opts
169
+
170
+ # Run CMake
171
+ ret1, out1, err1 = self._call_cmake(cmake_opts, 'CMakePathInfo.txt')
172
+
173
+ # Current generator was successful
174
+ if ret1 == 0:
175
+ CMakeDependency.class_working_generator = i
176
+ break
177
+
178
+ mlog.debug(f'CMake failed to gather system information for generator {i} with error code {ret1}')
179
+ mlog.debug(f'OUT:\n{out1}\n\n\nERR:\n{err1}\n\n')
180
+
181
+ # Check if any generator succeeded
182
+ if ret1 != 0:
183
+ return None
184
+
185
+ try:
186
+ temp_parser.parse(err1)
187
+ except MesonException:
188
+ return None
189
+
190
+ def process_paths(l: T.List[str]) -> T.Set[str]:
191
+ if is_windows():
192
+ # Cannot split on ':' on Windows because its in the drive letter
193
+ tmp = [x.split(os.pathsep) for x in l]
194
+ else:
195
+ # https://github.com/mesonbuild/meson/issues/7294
196
+ tmp = [re.split(r':|;', x) for x in l]
197
+ flattened = [x for sublist in tmp for x in sublist]
198
+ return set(flattened)
199
+
200
+ # Extract the variables and sanity check them
201
+ root_paths_set = process_paths(temp_parser.get_cmake_var('MESON_FIND_ROOT_PATH'))
202
+ root_paths_set.update(process_paths(temp_parser.get_cmake_var('MESON_CMAKE_SYSROOT')))
203
+ root_paths = sorted(root_paths_set)
204
+ root_paths = [x for x in root_paths if os.path.isdir(x)]
205
+ module_paths_set = process_paths(temp_parser.get_cmake_var('MESON_PATHS_LIST'))
206
+ rooted_paths: T.List[str] = []
207
+ for j in [Path(x) for x in root_paths]:
208
+ for p in [Path(x) for x in module_paths_set]:
209
+ rooted_paths.append(str(j / p.relative_to(p.anchor)))
210
+ module_paths = sorted(module_paths_set.union(rooted_paths))
211
+ module_paths = [x for x in module_paths if os.path.isdir(x)]
212
+ archs = temp_parser.get_cmake_var('MESON_ARCH_LIST')
213
+
214
+ common_paths = ['lib', 'lib32', 'lib64', 'libx32', 'share', '']
215
+ for i in archs:
216
+ common_paths += [os.path.join('lib', i)]
217
+
218
+ res = CMakeInfo(
219
+ module_paths=module_paths,
220
+ cmake_root=temp_parser.get_cmake_var('MESON_CMAKE_ROOT')[0],
221
+ archs=archs,
222
+ common_paths=common_paths,
223
+ )
224
+
225
+ mlog.debug(f' -- Module search paths: {res.module_paths}')
226
+ mlog.debug(f' -- CMake root: {res.cmake_root}')
227
+ mlog.debug(f' -- CMake architectures: {res.archs}')
228
+ mlog.debug(f' -- CMake lib search paths: {res.common_paths}')
229
+
230
+ return res
231
+
232
+ @staticmethod
233
+ @functools.lru_cache(maxsize=None)
234
+ def _cached_listdir(path: str) -> T.Tuple[T.Tuple[str, str], ...]:
235
+ try:
236
+ return tuple((x, str(x).lower()) for x in os.listdir(path))
237
+ except OSError:
238
+ return tuple()
239
+
240
+ @staticmethod
241
+ @functools.lru_cache(maxsize=None)
242
+ def _cached_isdir(path: str) -> bool:
243
+ try:
244
+ return os.path.isdir(path)
245
+ except OSError:
246
+ return False
247
+
248
+ def _preliminary_find_check(self, name: str, module_path: T.List[str], prefix_path: T.List[str], machine: 'MachineInfo') -> bool:
249
+ lname = str(name).lower()
250
+
251
+ # Checks <path>, <path>/cmake, <path>/CMake
252
+ def find_module(path: str) -> bool:
253
+ for i in [path, os.path.join(path, 'cmake'), os.path.join(path, 'CMake')]:
254
+ if not self._cached_isdir(i):
255
+ continue
256
+
257
+ # Check the directory case insensitive
258
+ content = self._cached_listdir(i)
259
+ candidates = ['Find{}.cmake', '{}Config.cmake', '{}-config.cmake']
260
+ candidates = [x.format(name).lower() for x in candidates]
261
+ if any(x[1] in candidates for x in content):
262
+ return True
263
+ return False
264
+
265
+ # Search in <path>/(lib/<arch>|lib*|share) for cmake files
266
+ def search_lib_dirs(path: str) -> bool:
267
+ for i in [os.path.join(path, x) for x in self.cmakeinfo.common_paths]:
268
+ if not self._cached_isdir(i):
269
+ continue
270
+
271
+ # Check <path>/(lib/<arch>|lib*|share)/cmake/<name>*/
272
+ cm_dir = os.path.join(i, 'cmake')
273
+ if self._cached_isdir(cm_dir):
274
+ content = self._cached_listdir(cm_dir)
275
+ content = tuple(x for x in content if x[1].startswith(lname))
276
+ for k in content:
277
+ if find_module(os.path.join(cm_dir, k[0])):
278
+ return True
279
+
280
+ # <path>/(lib/<arch>|lib*|share)/<name>*/
281
+ # <path>/(lib/<arch>|lib*|share)/<name>*/(cmake|CMake)/
282
+ content = self._cached_listdir(i)
283
+ content = tuple(x for x in content if x[1].startswith(lname))
284
+ for k in content:
285
+ if find_module(os.path.join(i, k[0])):
286
+ return True
287
+
288
+ return False
289
+
290
+ # Check the user provided and system module paths
291
+ for i in module_path + [os.path.join(self.cmakeinfo.cmake_root, 'Modules')]:
292
+ if find_module(i):
293
+ return True
294
+
295
+ # Check the user provided prefix paths
296
+ for i in prefix_path:
297
+ if search_lib_dirs(i):
298
+ return True
299
+
300
+ # Check PATH
301
+ system_env: T.List[str] = []
302
+ for i in os.environ.get('PATH', '').split(os.pathsep):
303
+ if i.endswith('/bin') or i.endswith('\\bin'):
304
+ i = i[:-4]
305
+ if i.endswith('/sbin') or i.endswith('\\sbin'):
306
+ i = i[:-5]
307
+ system_env += [i]
308
+
309
+ # Check the system paths
310
+ for i in self.cmakeinfo.module_paths + system_env:
311
+ if find_module(i):
312
+ return True
313
+
314
+ if search_lib_dirs(i):
315
+ return True
316
+
317
+ content = self._cached_listdir(i)
318
+ content = tuple(x for x in content if x[1].startswith(lname))
319
+ for k in content:
320
+ if search_lib_dirs(os.path.join(i, k[0])):
321
+ return True
322
+
323
+ # Mac framework support
324
+ if machine.is_darwin():
325
+ for j in [f'{lname}.framework', f'{lname}.app']:
326
+ for k in content:
327
+ if k[1] != j:
328
+ continue
329
+ if find_module(os.path.join(i, k[0], 'Resources')) or find_module(os.path.join(i, k[0], 'Version')):
330
+ return True
331
+
332
+ # Check the environment path
333
+ env_path = os.environ.get(f'{name}_DIR')
334
+ if env_path and find_module(env_path):
335
+ return True
336
+
337
+ # Check the Linux CMake registry
338
+ linux_reg = Path.home() / '.cmake' / 'packages'
339
+ for p in [linux_reg / name, linux_reg / lname]:
340
+ if p.exists():
341
+ return True
342
+
343
+ return False
344
+
345
+ def _detect_dep(self, name: str, package_version: str, modules: T.List[T.Tuple[str, bool]], components: T.List[T.Tuple[str, bool]], args: T.List[str]) -> None:
346
+ # Detect a dependency with CMake using the '--find-package' mode
347
+ # and the trace output (stderr)
348
+ #
349
+ # When the trace output is enabled CMake prints all functions with
350
+ # parameters to stderr as they are executed. Since CMake 3.4.0
351
+ # variables ("${VAR}") are also replaced in the trace output.
352
+ mlog.debug('\nDetermining dependency {!r} with CMake executable '
353
+ '{!r}'.format(name, self.cmakebin.executable_path()))
354
+
355
+ # Try different CMake generators since specifying no generator may fail
356
+ # in cygwin for some reason
357
+ gen_list = []
358
+ # First try the last working generator
359
+ if CMakeDependency.class_working_generator is not None:
360
+ gen_list += [CMakeDependency.class_working_generator]
361
+ gen_list += CMakeDependency.class_cmake_generators
362
+
363
+ # Map the components
364
+ comp_mapped = self._map_component_list(modules, components)
365
+ toolchain = CMakeToolchain(self.cmakebin, self.env, self.for_machine, CMakeExecScope.DEPENDENCY, self._get_build_dir())
366
+ toolchain.write()
367
+
368
+ for i in gen_list:
369
+ mlog.debug('Try CMake generator: {}'.format(i if len(i) > 0 else 'auto'))
370
+
371
+ # Prepare options
372
+ cmake_opts = []
373
+ cmake_opts += [f'-DNAME={name}']
374
+ cmake_opts += ['-DARCHS={}'.format(';'.join(self.cmakeinfo.archs))]
375
+ cmake_opts += [f'-DVERSION={package_version}']
376
+ cmake_opts += ['-DCOMPS={}'.format(';'.join([x[0] for x in comp_mapped]))]
377
+ cmake_opts += ['-DSTATIC={}'.format('ON' if self.static else 'OFF')]
378
+ cmake_opts += args
379
+ cmake_opts += self.traceparser.trace_args()
380
+ cmake_opts += toolchain.get_cmake_args()
381
+ cmake_opts += self._extra_cmake_opts()
382
+ cmake_opts += ['.']
383
+ if len(i) > 0:
384
+ cmake_opts = ['-G', i] + cmake_opts
385
+
386
+ # Run CMake
387
+ ret1, out1, err1 = self._call_cmake(cmake_opts, self._main_cmake_file())
388
+
389
+ # Current generator was successful
390
+ if ret1 == 0:
391
+ CMakeDependency.class_working_generator = i
392
+ break
393
+
394
+ mlog.debug(f'CMake failed for generator {i} and package {name} with error code {ret1}')
395
+ mlog.debug(f'OUT:\n{out1}\n\n\nERR:\n{err1}\n\n')
396
+
397
+ # Check if any generator succeeded
398
+ if ret1 != 0:
399
+ return
400
+
401
+ try:
402
+ self.traceparser.parse(err1)
403
+ except CMakeException as e:
404
+ e2 = self._gen_exception(str(e))
405
+ if self.required:
406
+ raise
407
+ else:
408
+ self.compile_args = []
409
+ self.link_args = []
410
+ self.is_found = False
411
+ self.reason = e2
412
+ return
413
+
414
+ # Whether the package is found or not is always stored in PACKAGE_FOUND
415
+ self.is_found = self.traceparser.var_to_bool('PACKAGE_FOUND')
416
+ if not self.is_found:
417
+ return
418
+
419
+ # Try to detect the version
420
+ vers_raw = self.traceparser.get_cmake_var('PACKAGE_VERSION')
421
+
422
+ if len(vers_raw) > 0:
423
+ self.version = vers_raw[0]
424
+ self.version.strip('"\' ')
425
+
426
+ # Post-process module list. Used in derived classes to modify the
427
+ # module list (append prepend a string, etc.).
428
+ modules = self._map_module_list(modules, components)
429
+ autodetected_module_list = False
430
+
431
+ # Try guessing a CMake target if none is provided
432
+ if len(modules) == 0:
433
+ for i in self.traceparser.targets:
434
+ tg = i.lower()
435
+ lname = name.lower()
436
+ if f'{lname}::{lname}' == tg or lname == tg.replace('::', ''):
437
+ mlog.debug(f'Guessed CMake target \'{i}\'')
438
+ modules = [(i, True)]
439
+ autodetected_module_list = True
440
+ break
441
+
442
+ # Failed to guess a target --> try the old-style method
443
+ if len(modules) == 0:
444
+ # Warn when there might be matching imported targets but no automatic match was used
445
+ partial_modules: T.List[CMakeTarget] = []
446
+ for k, v in self.traceparser.targets.items():
447
+ tg = k.lower()
448
+ lname = name.lower()
449
+ if tg.startswith(f'{lname}::'):
450
+ partial_modules += [v]
451
+ if partial_modules:
452
+ mlog.warning(textwrap.dedent(f'''\
453
+ Could not find and exact match for the CMake dependency {name}.
454
+
455
+ However, Meson found the following partial matches:
456
+
457
+ {[x.name for x in partial_modules]}
458
+
459
+ Using imported is recommended, since this approach is less error prone
460
+ and better supported by Meson. Consider explicitly specifying one of
461
+ these in the dependency call with:
462
+
463
+ dependency('{name}', modules: ['{name}::<name>', ...])
464
+
465
+ Meson will now continue to use the old-style {name}_LIBRARIES CMake
466
+ variables to extract the dependency information since no explicit
467
+ target is currently specified.
468
+
469
+ '''))
470
+ mlog.debug('More info for the partial match targets:')
471
+ for tgt in partial_modules:
472
+ mlog.debug(tgt)
473
+
474
+ incDirs = [x for x in self.traceparser.get_cmake_var('PACKAGE_INCLUDE_DIRS') if x]
475
+ defs = [x for x in self.traceparser.get_cmake_var('PACKAGE_DEFINITIONS') if x]
476
+ libs_raw = [x for x in self.traceparser.get_cmake_var('PACKAGE_LIBRARIES') if x]
477
+
478
+ # CMake has a "fun" API, where certain keywords describing
479
+ # configurations can be in the *_LIBRARIES variables. See:
480
+ # - https://github.com/mesonbuild/meson/issues/9197
481
+ # - https://gitlab.freedesktop.org/libnice/libnice/-/issues/140
482
+ # - https://cmake.org/cmake/help/latest/command/target_link_libraries.html#overview (the last point in the section)
483
+ libs: T.List[str] = []
484
+ cfg_matches = True
485
+ is_debug = cmake_is_debug(self.env)
486
+ cm_tag_map = {'debug': is_debug, 'optimized': not is_debug, 'general': True}
487
+ for i in libs_raw:
488
+ if i.lower() in cm_tag_map:
489
+ cfg_matches = cm_tag_map[i.lower()]
490
+ continue
491
+ if cfg_matches:
492
+ libs += [i]
493
+ # According to the CMake docs, a keyword only works for the
494
+ # directly the following item and all items without a keyword
495
+ # are implicitly `general`
496
+ cfg_matches = True
497
+
498
+ # Try to use old style variables if no module is specified
499
+ if len(libs) > 0:
500
+ self.compile_args = [f'-I{x}' for x in incDirs] + defs
501
+ self.link_args = []
502
+ for j in libs:
503
+ rtgt = resolve_cmake_trace_targets(j, self.traceparser, self.env, clib_compiler=self.clib_compiler)
504
+ self.link_args += rtgt.libraries
505
+ self.compile_args += [f'-I{x}' for x in rtgt.include_directories]
506
+ self.compile_args += rtgt.public_compile_opts
507
+ mlog.debug(f'using old-style CMake variables for dependency {name}')
508
+ mlog.debug(f'Include Dirs: {incDirs}')
509
+ mlog.debug(f'Compiler Definitions: {defs}')
510
+ mlog.debug(f'Libraries: {libs}')
511
+ return
512
+
513
+ # Even the old-style approach failed. Nothing else we can do here
514
+ self.is_found = False
515
+ raise self._gen_exception('CMake: failed to guess a CMake target for {}.\n'
516
+ 'Try to explicitly specify one or more targets with the "modules" property.\n'
517
+ 'Valid targets are:\n{}'.format(name, list(self.traceparser.targets.keys())))
518
+
519
+ # Set dependencies with CMake targets
520
+ # recognise arguments we should pass directly to the linker
521
+ incDirs = []
522
+ compileOptions = []
523
+ libraries = []
524
+
525
+ for i, required in modules:
526
+ if i not in self.traceparser.targets:
527
+ if not required:
528
+ mlog.warning('CMake: T.Optional module', mlog.bold(self._original_module_name(i)), 'for', mlog.bold(name), 'was not found')
529
+ continue
530
+ raise self._gen_exception('CMake: invalid module {} for {}.\n'
531
+ 'Try to explicitly specify one or more targets with the "modules" property.\n'
532
+ 'Valid targets are:\n{}'.format(self._original_module_name(i), name, list(self.traceparser.targets.keys())))
533
+
534
+ if not autodetected_module_list:
535
+ self.found_modules += [i]
536
+
537
+ rtgt = resolve_cmake_trace_targets(i, self.traceparser, self.env,
538
+ clib_compiler=self.clib_compiler,
539
+ not_found_warning=lambda x:
540
+ mlog.warning('CMake: Dependency', mlog.bold(x), 'for', mlog.bold(name), 'was not found')
541
+ )
542
+ incDirs += rtgt.include_directories
543
+ compileOptions += rtgt.public_compile_opts
544
+ libraries += rtgt.libraries + rtgt.link_flags
545
+
546
+ # Make sure all elements in the lists are unique and sorted
547
+ incDirs = sorted(set(incDirs))
548
+ compileOptions = sorted(set(compileOptions))
549
+ libraries = sorted(set(libraries))
550
+
551
+ mlog.debug(f'Include Dirs: {incDirs}')
552
+ mlog.debug(f'Compiler Options: {compileOptions}')
553
+ mlog.debug(f'Libraries: {libraries}')
554
+
555
+ self.compile_args = compileOptions + [f'-I{x}' for x in incDirs]
556
+ self.link_args = libraries
557
+
558
+ def _get_build_dir(self) -> Path:
559
+ build_dir = Path(self.cmake_root_dir) / f'cmake_{self.name}'
560
+ build_dir.mkdir(parents=True, exist_ok=True)
561
+ return build_dir
562
+
563
+ def _setup_cmake_dir(self, cmake_file: str) -> Path:
564
+ # Setup the CMake build environment and return the "build" directory
565
+ build_dir = self._get_build_dir()
566
+
567
+ # Remove old CMake cache so we can try out multiple generators
568
+ cmake_cache = build_dir / 'CMakeCache.txt'
569
+ cmake_files = build_dir / 'CMakeFiles'
570
+ if cmake_cache.exists():
571
+ cmake_cache.unlink()
572
+ shutil.rmtree(cmake_files.as_posix(), ignore_errors=True)
573
+
574
+ # Insert language parameters into the CMakeLists.txt and write new CMakeLists.txt
575
+ cmake_txt = importlib.resources.read_text('mesonbuild.dependencies.data', cmake_file, encoding = 'utf-8')
576
+
577
+ # In general, some Fortran CMake find_package() also require C language enabled,
578
+ # even if nothing from C is directly used. An easy Fortran example that fails
579
+ # without C language is
580
+ # find_package(Threads)
581
+ # To make this general to
582
+ # any other language that might need this, we use a list for all
583
+ # languages and expand in the cmake Project(... LANGUAGES ...) statement.
584
+ from ..cmake import language_map
585
+ cmake_language = [language_map[x] for x in self.language_list if x in language_map]
586
+ if not cmake_language:
587
+ cmake_language += ['NONE']
588
+
589
+ cmake_txt = textwrap.dedent("""
590
+ cmake_minimum_required(VERSION ${{CMAKE_VERSION}})
591
+ project(MesonTemp LANGUAGES {})
592
+ """).format(' '.join(cmake_language)) + cmake_txt
593
+
594
+ cm_file = build_dir / 'CMakeLists.txt'
595
+ cm_file.write_text(cmake_txt, encoding='utf-8')
596
+ mlog.cmd_ci_include(cm_file.absolute().as_posix())
597
+
598
+ return build_dir
599
+
600
+ def _call_cmake(self,
601
+ args: T.List[str],
602
+ cmake_file: str,
603
+ env: T.Optional[T.Dict[str, str]] = None) -> T.Tuple[int, T.Optional[str], T.Optional[str]]:
604
+ build_dir = self._setup_cmake_dir(cmake_file)
605
+ return self.cmakebin.call(args, build_dir, env=env)
606
+
607
+ @staticmethod
608
+ def log_tried() -> str:
609
+ return 'cmake'
610
+
611
+ def log_details(self) -> str:
612
+ modules = [self._original_module_name(x) for x in self.found_modules]
613
+ modules = sorted(set(modules))
614
+ if modules:
615
+ return 'modules: ' + ', '.join(modules)
616
+ return ''
617
+
618
+ def get_variable(self, *, cmake: T.Optional[str] = None, pkgconfig: T.Optional[str] = None,
619
+ configtool: T.Optional[str] = None, internal: T.Optional[str] = None,
620
+ default_value: T.Optional[str] = None,
621
+ pkgconfig_define: PkgConfigDefineType = None) -> str:
622
+ if cmake and self.traceparser is not None:
623
+ try:
624
+ v = self.traceparser.vars[cmake]
625
+ except KeyError:
626
+ pass
627
+ else:
628
+ # CMake does NOT have a list datatype. We have no idea whether
629
+ # anything is a string or a string-separated-by-; Internally,
630
+ # we treat them as the latter and represent everything as a
631
+ # list, because it is convenient when we are mostly handling
632
+ # imported targets, which have various properties that are
633
+ # actually lists.
634
+ #
635
+ # As a result we need to convert them back to strings when grabbing
636
+ # raw variables the user requested.
637
+ return ';'.join(v)
638
+ if default_value is not None:
639
+ return default_value
640
+ raise DependencyException(f'Could not get cmake variable and no default provided for {self!r}')
641
+
642
+
643
+ class CMakeDependencyFactory:
644
+
645
+ def __init__(self, name: T.Optional[str] = None, modules: T.Optional[T.List[str]] = None):
646
+ self.name = name
647
+ self.modules = modules
648
+
649
+ def __call__(self, name: str, env: Environment, kwargs: T.Dict[str, T.Any], language: T.Optional[str] = None, force_use_global_compilers: bool = False) -> CMakeDependency:
650
+ if self.modules:
651
+ kwargs['modules'] = self.modules
652
+ return CMakeDependency(self.name or name, env, kwargs, language, force_use_global_compilers)
653
+
654
+ @staticmethod
655
+ def log_tried() -> str:
656
+ return CMakeDependency.log_tried()