frida 16.2.0 → 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,424 @@
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 .pkgconfig import PkgConfigDependency
8
+ from ..mesonlib import (Popen_safe, OptionKey, join_args, version_compare)
9
+ from ..programs import ExternalProgram
10
+ from .. import mlog
11
+ import re
12
+ import os
13
+ import json
14
+ import typing as T
15
+
16
+ if T.TYPE_CHECKING:
17
+ from ..environment import Environment
18
+
19
+
20
+ class DubDependency(ExternalDependency):
21
+ # dub program and version
22
+ class_dubbin: T.Optional[T.Tuple[ExternalProgram, str]] = None
23
+ class_dubbin_searched = False
24
+
25
+ def __init__(self, name: str, environment: 'Environment', kwargs: T.Dict[str, T.Any]):
26
+ super().__init__(DependencyTypeName('dub'), environment, kwargs, language='d')
27
+ self.name = name
28
+ from ..compilers.d import DCompiler, d_feature_args
29
+
30
+ _temp_comp = super().get_compiler()
31
+ assert isinstance(_temp_comp, DCompiler)
32
+ self.compiler = _temp_comp
33
+
34
+ if 'required' in kwargs:
35
+ self.required = kwargs.get('required')
36
+
37
+ if DubDependency.class_dubbin is None and not DubDependency.class_dubbin_searched:
38
+ DubDependency.class_dubbin = self._check_dub()
39
+ DubDependency.class_dubbin_searched = True
40
+ if DubDependency.class_dubbin is None:
41
+ if self.required:
42
+ raise DependencyException('DUB not found.')
43
+ self.is_found = False
44
+ return
45
+
46
+ (self.dubbin, dubver) = DubDependency.class_dubbin # pylint: disable=unpacking-non-sequence
47
+
48
+ assert isinstance(self.dubbin, ExternalProgram)
49
+
50
+ # Check if Dub version is compatible with Meson
51
+ if version_compare(dubver, '>1.31.1'):
52
+ if self.required:
53
+ raise DependencyException(
54
+ f"DUB version {dubver} is not compatible with Meson (can't locate artifacts in Dub cache)")
55
+ self.is_found = False
56
+ return
57
+
58
+ mlog.debug('Determining dependency {!r} with DUB executable '
59
+ '{!r}'.format(name, self.dubbin.get_path()))
60
+
61
+ # if an explicit version spec was stated, use this when querying Dub
62
+ main_pack_spec = name
63
+ if 'version' in kwargs:
64
+ version_spec = kwargs['version']
65
+ if isinstance(version_spec, list):
66
+ version_spec = " ".join(version_spec)
67
+ main_pack_spec = f'{name}@{version_spec}'
68
+
69
+ # we need to know the target architecture
70
+ dub_arch = self.compiler.arch
71
+
72
+ # we need to know the build type as well
73
+ dub_buildtype = str(environment.coredata.get_option(OptionKey('buildtype')))
74
+ # MESON types: choices=['plain', 'debug', 'debugoptimized', 'release', 'minsize', 'custom'])),
75
+ # DUB types: debug (default), plain, release, release-debug, release-nobounds, unittest, profile, profile-gc,
76
+ # docs, ddox, cov, unittest-cov, syntax and custom
77
+ if dub_buildtype == 'debugoptimized':
78
+ dub_buildtype = 'release-debug'
79
+ elif dub_buildtype == 'minsize':
80
+ dub_buildtype = 'release'
81
+
82
+ # Ask dub for the package
83
+ describe_cmd = [
84
+ 'describe', main_pack_spec, '--arch=' + dub_arch,
85
+ '--build=' + dub_buildtype, '--compiler=' + self.compiler.get_exelist()[-1]
86
+ ]
87
+ ret, res, err = self._call_dubbin(describe_cmd)
88
+
89
+ if ret != 0:
90
+ mlog.debug('DUB describe failed: ' + err)
91
+ if 'locally' in err:
92
+ fetch_cmd = ['dub', 'fetch', main_pack_spec]
93
+ mlog.error(mlog.bold(main_pack_spec), 'is not present locally. You may try the following command:')
94
+ mlog.log(mlog.bold(join_args(fetch_cmd)))
95
+ self.is_found = False
96
+ return
97
+
98
+ # A command that might be useful in case of missing DUB package
99
+ def dub_build_deep_command() -> str:
100
+ cmd = [
101
+ 'dub', 'run', 'dub-build-deep', '--yes', '--', main_pack_spec,
102
+ '--arch=' + dub_arch, '--compiler=' + self.compiler.get_exelist()[-1],
103
+ '--build=' + dub_buildtype
104
+ ]
105
+ return join_args(cmd)
106
+
107
+ dub_comp_id = self.compiler.get_id().replace('llvm', 'ldc').replace('gcc', 'gdc')
108
+ description = json.loads(res)
109
+
110
+ self.compile_args = []
111
+ self.link_args = self.raw_link_args = []
112
+
113
+ show_buildtype_warning = False
114
+
115
+ def find_package_target(pkg: T.Dict[str, str]) -> bool:
116
+ nonlocal show_buildtype_warning
117
+ # try to find a static library in a DUB folder corresponding to
118
+ # version, configuration, compiler, arch and build-type
119
+ # if can find, add to link_args.
120
+ # link_args order is meaningful, so this function MUST be called in the right order
121
+ pack_id = f'{pkg["name"]}@{pkg["version"]}'
122
+ (tgt_file, compatibilities) = self._find_compatible_package_target(description, pkg, dub_comp_id)
123
+ if tgt_file is None:
124
+ if not compatibilities:
125
+ mlog.error(mlog.bold(pack_id), 'not found')
126
+ elif 'compiler' not in compatibilities:
127
+ mlog.error(mlog.bold(pack_id), 'found but not compiled with ', mlog.bold(dub_comp_id))
128
+ elif dub_comp_id != 'gdc' and 'compiler_version' not in compatibilities:
129
+ mlog.error(mlog.bold(pack_id), 'found but not compiled with',
130
+ mlog.bold(f'{dub_comp_id}-{self.compiler.version}'))
131
+ elif 'arch' not in compatibilities:
132
+ mlog.error(mlog.bold(pack_id), 'found but not compiled for', mlog.bold(dub_arch))
133
+ elif 'platform' not in compatibilities:
134
+ mlog.error(mlog.bold(pack_id), 'found but not compiled for',
135
+ mlog.bold(description['platform'].join('.')))
136
+ elif 'configuration' not in compatibilities:
137
+ mlog.error(mlog.bold(pack_id), 'found but not compiled for the',
138
+ mlog.bold(pkg['configuration']), 'configuration')
139
+ else:
140
+ mlog.error(mlog.bold(pack_id), 'not found')
141
+
142
+ mlog.log('You may try the following command to install the necessary DUB libraries:')
143
+ mlog.log(mlog.bold(dub_build_deep_command()))
144
+
145
+ return False
146
+
147
+ if 'build_type' not in compatibilities:
148
+ mlog.warning(mlog.bold(pack_id), 'found but not compiled as', mlog.bold(dub_buildtype))
149
+ show_buildtype_warning = True
150
+
151
+ self.link_args.append(tgt_file)
152
+ return True
153
+
154
+ # Main algorithm:
155
+ # 1. Ensure that the target is a compatible library type (not dynamic)
156
+ # 2. Find a compatible built library for the main dependency
157
+ # 3. Do the same for each sub-dependency.
158
+ # link_args MUST be in the same order than the "linkDependencies" of the main target
159
+ # 4. Add other build settings (imports, versions etc.)
160
+
161
+ # 1
162
+ self.is_found = False
163
+ packages = {}
164
+ for pkg in description['packages']:
165
+ packages[pkg['name']] = pkg
166
+
167
+ if not pkg['active']:
168
+ continue
169
+
170
+ if pkg['targetType'] == 'dynamicLibrary':
171
+ mlog.error('DUB dynamic library dependencies are not supported.')
172
+ self.is_found = False
173
+ return
174
+
175
+ # check that the main dependency is indeed a library
176
+ if pkg['name'] == name:
177
+ self.is_found = True
178
+
179
+ if pkg['targetType'] not in ['library', 'sourceLibrary', 'staticLibrary']:
180
+ mlog.error(mlog.bold(name), "found but it isn't a library")
181
+ self.is_found = False
182
+ return
183
+
184
+ self.version = pkg['version']
185
+ self.pkg = pkg
186
+
187
+ # collect all targets
188
+ targets = {}
189
+ for tgt in description['targets']:
190
+ targets[tgt['rootPackage']] = tgt
191
+
192
+ if name not in targets:
193
+ self.is_found = False
194
+ if self.pkg['targetType'] == 'sourceLibrary':
195
+ # source libraries have no associated targets,
196
+ # but some build settings like import folders must be found from the package object.
197
+ # Current algo only get these from "buildSettings" in the target object.
198
+ # Let's save this for a future PR.
199
+ # (See openssl DUB package for example of sourceLibrary)
200
+ mlog.error('DUB targets of type', mlog.bold('sourceLibrary'), 'are not supported.')
201
+ else:
202
+ mlog.error('Could not find target description for', mlog.bold(main_pack_spec))
203
+
204
+ if not self.is_found:
205
+ mlog.error(f'Could not find {name} in DUB description')
206
+ return
207
+
208
+ # Current impl only supports static libraries
209
+ self.static = True
210
+
211
+ # 2
212
+ if not find_package_target(self.pkg):
213
+ self.is_found = False
214
+ return
215
+
216
+ # 3
217
+ for link_dep in targets[name]['linkDependencies']:
218
+ pkg = packages[link_dep]
219
+ if not find_package_target(pkg):
220
+ self.is_found = False
221
+ return
222
+
223
+ if show_buildtype_warning:
224
+ mlog.log('If it is not suitable, try the following command and reconfigure Meson with', mlog.bold('--clearcache'))
225
+ mlog.log(mlog.bold(dub_build_deep_command()))
226
+
227
+ # 4
228
+ bs = targets[name]['buildSettings']
229
+
230
+ for flag in bs['dflags']:
231
+ self.compile_args.append(flag)
232
+
233
+ for path in bs['importPaths']:
234
+ self.compile_args.append('-I' + path)
235
+
236
+ for path in bs['stringImportPaths']:
237
+ if 'import_dir' not in d_feature_args[self.compiler.id]:
238
+ break
239
+ flag = d_feature_args[self.compiler.id]['import_dir']
240
+ self.compile_args.append(f'{flag}={path}')
241
+
242
+ for ver in bs['versions']:
243
+ if 'version' not in d_feature_args[self.compiler.id]:
244
+ break
245
+ flag = d_feature_args[self.compiler.id]['version']
246
+ self.compile_args.append(f'{flag}={ver}')
247
+
248
+ if bs['mainSourceFile']:
249
+ self.compile_args.append(bs['mainSourceFile'])
250
+
251
+ # pass static libraries
252
+ # linkerFiles are added during step 3
253
+ # for file in bs['linkerFiles']:
254
+ # self.link_args.append(file)
255
+
256
+ for file in bs['sourceFiles']:
257
+ # sourceFiles may contain static libraries
258
+ if file.endswith('.lib') or file.endswith('.a'):
259
+ self.link_args.append(file)
260
+
261
+ for flag in bs['lflags']:
262
+ self.link_args.append(flag)
263
+
264
+ is_windows = self.env.machines.host.is_windows()
265
+ if is_windows:
266
+ winlibs = ['kernel32', 'user32', 'gdi32', 'winspool', 'shell32', 'ole32',
267
+ 'oleaut32', 'uuid', 'comdlg32', 'advapi32', 'ws2_32']
268
+
269
+ for lib in bs['libs']:
270
+ if os.name != 'nt':
271
+ # trying to add system libraries by pkg-config
272
+ pkgdep = PkgConfigDependency(lib, environment, {'required': 'true', 'silent': 'true'})
273
+ if pkgdep.is_found:
274
+ for arg in pkgdep.get_compile_args():
275
+ self.compile_args.append(arg)
276
+ for arg in pkgdep.get_link_args():
277
+ self.link_args.append(arg)
278
+ for arg in pkgdep.get_link_args(raw=True):
279
+ self.raw_link_args.append(arg)
280
+ continue
281
+
282
+ if is_windows and lib in winlibs:
283
+ self.link_args.append(lib + '.lib')
284
+ continue
285
+
286
+ # fallback
287
+ self.link_args.append('-l'+lib)
288
+
289
+ # This function finds the target of the provided JSON package, built for the right
290
+ # compiler, architecture, configuration...
291
+ # It returns (target|None, {compatibilities})
292
+ # If None is returned for target, compatibilities will list what other targets were found without full compatibility
293
+ def _find_compatible_package_target(self, jdesc: T.Dict[str, str], jpack: T.Dict[str, str], dub_comp_id: str) -> T.Tuple[str, T.Set[str]]:
294
+ dub_build_path = os.path.join(jpack['path'], '.dub', 'build')
295
+
296
+ if not os.path.exists(dub_build_path):
297
+ return (None, None)
298
+
299
+ # try to find a dir like library-debug-linux.posix-x86_64-ldc_2081-EF934983A3319F8F8FF2F0E107A363BA
300
+
301
+ # fields are:
302
+ # - configuration
303
+ # - build type
304
+ # - platform
305
+ # - architecture
306
+ # - compiler id (dmd, ldc, gdc)
307
+ # - compiler version or frontend id or frontend version?
308
+
309
+ conf = jpack['configuration']
310
+ build_type = jdesc['buildType']
311
+ platforms = jdesc['platform']
312
+ archs = jdesc['architecture']
313
+
314
+ # Get D frontend version implemented in the compiler, or the compiler version itself
315
+ # gdc doesn't support this
316
+ comp_versions = []
317
+
318
+ if dub_comp_id != 'gdc':
319
+ comp_versions.append(self.compiler.version)
320
+
321
+ ret, res = self._call_compbin(['--version'])[0:2]
322
+ if ret != 0:
323
+ mlog.error('Failed to run {!r}', mlog.bold(dub_comp_id))
324
+ return (None, None)
325
+ d_ver_reg = re.search('v[0-9].[0-9][0-9][0-9].[0-9]', res) # Ex.: v2.081.2
326
+
327
+ if d_ver_reg is not None:
328
+ frontend_version = d_ver_reg.group()
329
+ frontend_id = frontend_version.rsplit('.', 1)[0].replace(
330
+ 'v', '').replace('.', '') # Fix structure. Ex.: 2081
331
+ comp_versions.extend([frontend_version, frontend_id])
332
+
333
+ compatibilities: T.Set[str] = set()
334
+
335
+ # build_type is not in check_list because different build types might be compatible.
336
+ # We do show a WARNING that the build type is not the same.
337
+ # It might be critical in release builds, and acceptable otherwise
338
+ check_list = ('configuration', 'platform', 'arch', 'compiler', 'compiler_version')
339
+
340
+ for entry in os.listdir(dub_build_path):
341
+
342
+ target = os.path.join(dub_build_path, entry, jpack['targetFileName'])
343
+ if not os.path.exists(target):
344
+ # unless Dub and Meson are racing, the target file should be present
345
+ # when the directory is present
346
+ mlog.debug("WARNING: Could not find a Dub target: " + target)
347
+ continue
348
+
349
+ # we build a new set for each entry, because if this target is returned
350
+ # we want to return only the compatibilities associated to this target
351
+ # otherwise we could miss the WARNING about build_type
352
+ comps = set()
353
+
354
+ if conf in entry:
355
+ comps.add('configuration')
356
+
357
+ if build_type in entry:
358
+ comps.add('build_type')
359
+
360
+ if all(platform in entry for platform in platforms):
361
+ comps.add('platform')
362
+
363
+ if all(arch in entry for arch in archs):
364
+ comps.add('arch')
365
+
366
+ if dub_comp_id in entry:
367
+ comps.add('compiler')
368
+
369
+ if dub_comp_id == 'gdc' or any(cv in entry for cv in comp_versions):
370
+ comps.add('compiler_version')
371
+
372
+ if all(key in comps for key in check_list):
373
+ return (target, comps)
374
+ else:
375
+ compatibilities = set.union(compatibilities, comps)
376
+
377
+ return (None, compatibilities)
378
+
379
+ def _call_dubbin(self, args: T.List[str], env: T.Optional[T.Dict[str, str]] = None) -> T.Tuple[int, str, str]:
380
+ assert isinstance(self.dubbin, ExternalProgram)
381
+ p, out, err = Popen_safe(self.dubbin.get_command() + args, env=env)
382
+ return p.returncode, out.strip(), err.strip()
383
+
384
+ def _call_compbin(self, args: T.List[str], env: T.Optional[T.Dict[str, str]] = None) -> T.Tuple[int, str, str]:
385
+ p, out, err = Popen_safe(self.compiler.get_exelist() + args, env=env)
386
+ return p.returncode, out.strip(), err.strip()
387
+
388
+ def _check_dub(self) -> T.Optional[T.Tuple[ExternalProgram, str]]:
389
+
390
+ def find() -> T.Optional[T.Tuple[ExternalProgram, str]]:
391
+ dubbin = ExternalProgram('dub', silent=True)
392
+
393
+ if not dubbin.found():
394
+ return None
395
+
396
+ try:
397
+ p, out = Popen_safe(dubbin.get_command() + ['--version'])[0:2]
398
+ if p.returncode != 0:
399
+ mlog.warning('Found dub {!r} but couldn\'t run it'
400
+ ''.format(' '.join(dubbin.get_command())))
401
+ return None
402
+
403
+ except (FileNotFoundError, PermissionError):
404
+ return None
405
+
406
+ vermatch = re.search(r'DUB version (\d+\.\d+\.\d+.*), ', out.strip())
407
+ if vermatch:
408
+ dubver = vermatch.group(1)
409
+ else:
410
+ mlog.warning(f"Found dub {' '.join(dubbin.get_command())} but couldn't parse version in {out.strip()}")
411
+ return None
412
+
413
+ return (dubbin, dubver)
414
+
415
+ found = find()
416
+
417
+ if found is None:
418
+ mlog.log('Found DUB:', mlog.red('NO'))
419
+ else:
420
+ (dubbin, dubver) = found
421
+ mlog.log('Found DUB:', mlog.bold(dubbin.get_path()),
422
+ '(version %s)' % dubver)
423
+
424
+ return found
@@ -0,0 +1,146 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+ # Copyright 2013-2021 The Meson development team
3
+ # Copyright © 2021-2023 Intel Corporation
4
+
5
+ from __future__ import annotations
6
+
7
+ import functools
8
+ import typing as T
9
+
10
+ from .base import DependencyException, DependencyMethods
11
+ from .base import process_method_kw
12
+ from .base import BuiltinDependency, SystemDependency
13
+ from .cmake import CMakeDependency
14
+ from .framework import ExtraFrameworkDependency
15
+ from .pkgconfig import PkgConfigDependency
16
+
17
+ if T.TYPE_CHECKING:
18
+ from .base import ExternalDependency
19
+ from .configtool import ConfigToolDependency
20
+ from ..environment import Environment
21
+ from ..mesonlib import MachineChoice
22
+
23
+ DependencyGenerator = T.Callable[[], ExternalDependency]
24
+ FactoryFunc = T.Callable[
25
+ [
26
+ 'Environment',
27
+ MachineChoice,
28
+ T.Dict[str, T.Any],
29
+ T.List[DependencyMethods]
30
+ ],
31
+ T.List[DependencyGenerator]
32
+ ]
33
+
34
+ WrappedFactoryFunc = T.Callable[
35
+ [
36
+ 'Environment',
37
+ MachineChoice,
38
+ T.Dict[str, T.Any]
39
+ ],
40
+ T.List[DependencyGenerator]
41
+ ]
42
+
43
+ # This should be str, Environment, T.Dict[str, T.Any], T.Optional[str]
44
+ # But if you try that, you get error: Cannot infer type of lambda
45
+ CmakeDependencyFunc = T.Callable[..., CMakeDependency]
46
+
47
+ class DependencyFactory:
48
+
49
+ """Factory to get dependencies from multiple sources.
50
+
51
+ This class provides an initializer that takes a set of names and classes
52
+ for various kinds of dependencies. When the initialized object is called
53
+ it returns a list of callables return Dependency objects to try in order.
54
+
55
+ :name: The name of the dependency. This will be passed as the name
56
+ parameter of the each dependency unless it is overridden on a per
57
+ type basis.
58
+ :methods: An ordered list of DependencyMethods. This is the order
59
+ dependencies will be returned in unless they are removed by the
60
+ _process_method function
61
+ :*_name: This will overwrite the name passed to the corresponding class.
62
+ For example, if the name is 'zlib', but cmake calls the dependency
63
+ 'Z', then using `cmake_name='Z'` will pass the name as 'Z' to cmake.
64
+ :*_class: A *type* or callable that creates a class, and has the
65
+ signature of an ExternalDependency
66
+ :system_class: If you pass DependencyMethods.SYSTEM in methods, you must
67
+ set this argument.
68
+ """
69
+
70
+ def __init__(self, name: str, methods: T.List[DependencyMethods], *,
71
+ extra_kwargs: T.Optional[T.Dict[str, T.Any]] = None,
72
+ pkgconfig_name: T.Optional[str] = None,
73
+ pkgconfig_class: 'T.Type[PkgConfigDependency]' = PkgConfigDependency,
74
+ cmake_name: T.Optional[str] = None,
75
+ cmake_class: 'T.Union[T.Type[CMakeDependency], CmakeDependencyFunc]' = CMakeDependency,
76
+ configtool_class: 'T.Optional[T.Type[ConfigToolDependency]]' = None,
77
+ framework_name: T.Optional[str] = None,
78
+ framework_class: 'T.Type[ExtraFrameworkDependency]' = ExtraFrameworkDependency,
79
+ builtin_class: 'T.Type[BuiltinDependency]' = BuiltinDependency,
80
+ system_class: 'T.Type[SystemDependency]' = SystemDependency):
81
+
82
+ if DependencyMethods.CONFIG_TOOL in methods and not configtool_class:
83
+ raise DependencyException('A configtool must have a custom class')
84
+
85
+ self.extra_kwargs = extra_kwargs or {}
86
+ self.methods = methods
87
+ self.classes: T.Dict[
88
+ DependencyMethods,
89
+ T.Callable[['Environment', T.Dict[str, T.Any]], ExternalDependency]
90
+ ] = {
91
+ # Just attach the correct name right now, either the generic name
92
+ # or the method specific name.
93
+ DependencyMethods.EXTRAFRAMEWORK: functools.partial(framework_class, framework_name or name),
94
+ DependencyMethods.PKGCONFIG: functools.partial(pkgconfig_class, pkgconfig_name or name),
95
+ DependencyMethods.CMAKE: functools.partial(cmake_class, cmake_name or name),
96
+ DependencyMethods.SYSTEM: functools.partial(system_class, name),
97
+ DependencyMethods.BUILTIN: functools.partial(builtin_class, name),
98
+ DependencyMethods.CONFIG_TOOL: None,
99
+ }
100
+ if configtool_class is not None:
101
+ self.classes[DependencyMethods.CONFIG_TOOL] = functools.partial(configtool_class, name)
102
+
103
+ @staticmethod
104
+ def _process_method(method: DependencyMethods, env: 'Environment', for_machine: MachineChoice) -> bool:
105
+ """Report whether a method is valid or not.
106
+
107
+ If the method is valid, return true, otherwise return false. This is
108
+ used in a list comprehension to filter methods that are not possible.
109
+
110
+ By default this only remove EXTRAFRAMEWORK dependencies for non-mac platforms.
111
+ """
112
+ # Extra frameworks are only valid for macOS and other apple products
113
+ if (method is DependencyMethods.EXTRAFRAMEWORK and
114
+ not env.machines[for_machine].is_darwin()):
115
+ return False
116
+ return True
117
+
118
+ def __call__(self, env: 'Environment', for_machine: MachineChoice,
119
+ kwargs: T.Dict[str, T.Any]) -> T.List['DependencyGenerator']:
120
+ """Return a list of Dependencies with the arguments already attached."""
121
+ methods = process_method_kw(self.methods, kwargs)
122
+ nwargs = self.extra_kwargs.copy()
123
+ nwargs.update(kwargs)
124
+
125
+ return [functools.partial(self.classes[m], env, nwargs) for m in methods
126
+ if self._process_method(m, env, for_machine)]
127
+
128
+
129
+ def factory_methods(methods: T.Set[DependencyMethods]) -> T.Callable[['FactoryFunc'], 'WrappedFactoryFunc']:
130
+ """Decorator for handling methods for dependency factory functions.
131
+
132
+ This helps to make factory functions self documenting
133
+ >>> @factory_methods([DependencyMethods.PKGCONFIG, DependencyMethods.CMAKE])
134
+ >>> def factory(env: Environment, for_machine: MachineChoice, kwargs: T.Dict[str, T.Any], methods: T.List[DependencyMethods]) -> T.List['DependencyGenerator']:
135
+ >>> pass
136
+ """
137
+
138
+ def inner(func: 'FactoryFunc') -> 'WrappedFactoryFunc':
139
+
140
+ @functools.wraps(func)
141
+ def wrapped(env: 'Environment', for_machine: MachineChoice, kwargs: T.Dict[str, T.Any]) -> T.List['DependencyGenerator']:
142
+ return func(env, for_machine, kwargs, process_method_kw(methods, kwargs))
143
+
144
+ return wrapped
145
+
146
+ return inner
@@ -0,0 +1,111 @@
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 DependencyTypeName, ExternalDependency, DependencyException
7
+ from ..mesonlib import MesonException, Version, stringlistify
8
+ from .. import mlog
9
+ from pathlib import Path
10
+ import typing as T
11
+
12
+ if T.TYPE_CHECKING:
13
+ from ..environment import Environment
14
+
15
+ class ExtraFrameworkDependency(ExternalDependency):
16
+ system_framework_paths: T.Optional[T.List[str]] = None
17
+
18
+ def __init__(self, name: str, env: 'Environment', kwargs: T.Dict[str, T.Any], language: T.Optional[str] = None) -> None:
19
+ paths = stringlistify(kwargs.get('paths', []))
20
+ super().__init__(DependencyTypeName('extraframeworks'), env, kwargs, language=language)
21
+ self.name = name
22
+ # Full path to framework directory
23
+ self.framework_path: T.Optional[str] = None
24
+ if not self.clib_compiler:
25
+ raise DependencyException('No C-like compilers are available')
26
+ if self.system_framework_paths is None:
27
+ try:
28
+ self.system_framework_paths = self.clib_compiler.find_framework_paths(self.env)
29
+ except MesonException as e:
30
+ if 'non-clang' in str(e):
31
+ # Apple frameworks can only be found (and used) with the
32
+ # system compiler. It is not available so bail immediately.
33
+ self.is_found = False
34
+ return
35
+ raise
36
+ self.detect(name, paths)
37
+
38
+ def detect(self, name: str, paths: T.List[str]) -> None:
39
+ if not paths:
40
+ paths = self.system_framework_paths
41
+ for p in paths:
42
+ mlog.debug(f'Looking for framework {name} in {p}')
43
+ # We need to know the exact framework path because it's used by the
44
+ # Qt5 dependency class, and for setting the include path. We also
45
+ # want to avoid searching in an invalid framework path which wastes
46
+ # time and can cause a false positive.
47
+ framework_path = self._get_framework_path(p, name)
48
+ if framework_path is None:
49
+ continue
50
+ # We want to prefer the specified paths (in order) over the system
51
+ # paths since these are "extra" frameworks.
52
+ # For example, Python2's framework is in /System/Library/Frameworks and
53
+ # Python3's framework is in /Library/Frameworks, but both are called
54
+ # Python.framework. We need to know for sure that the framework was
55
+ # found in the path we expect.
56
+ allow_system = p in self.system_framework_paths
57
+ args = self.clib_compiler.find_framework(name, self.env, [p], allow_system)
58
+ if args is None:
59
+ continue
60
+ self.link_args = args
61
+ self.framework_path = framework_path.as_posix()
62
+ self.compile_args = ['-F' + self.framework_path]
63
+ # We need to also add -I includes to the framework because all
64
+ # cross-platform projects such as OpenGL, Python, Qt, GStreamer,
65
+ # etc do not use "framework includes":
66
+ # https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPFrameworks/Tasks/IncludingFrameworks.html
67
+ incdir = self._get_framework_include_path(framework_path)
68
+ if incdir:
69
+ self.compile_args += ['-idirafter' + incdir]
70
+ self.is_found = True
71
+ return
72
+
73
+ def _get_framework_path(self, path: str, name: str) -> T.Optional[Path]:
74
+ p = Path(path)
75
+ lname = name.lower()
76
+ for d in p.glob('*.framework/'):
77
+ if lname == d.name.rsplit('.', 1)[0].lower():
78
+ return d
79
+ return None
80
+
81
+ def _get_framework_latest_version(self, path: Path) -> str:
82
+ versions: T.List[Version] = []
83
+ for each in path.glob('Versions/*'):
84
+ # macOS filesystems are usually case-insensitive
85
+ if each.name.lower() == 'current':
86
+ continue
87
+ versions.append(Version(each.name))
88
+ if len(versions) == 0:
89
+ # most system frameworks do not have a 'Versions' directory
90
+ return 'Headers'
91
+ return 'Versions/{}/Headers'.format(sorted(versions)[-1]._s)
92
+
93
+ def _get_framework_include_path(self, path: Path) -> T.Optional[str]:
94
+ # According to the spec, 'Headers' must always be a symlink to the
95
+ # Headers directory inside the currently-selected version of the
96
+ # framework, but sometimes frameworks are broken. Look in 'Versions'
97
+ # for the currently-selected version or pick the latest one.
98
+ trials = ('Headers', 'Versions/Current/Headers',
99
+ self._get_framework_latest_version(path))
100
+ for each in trials:
101
+ trial = path / each
102
+ if trial.is_dir():
103
+ return trial.as_posix()
104
+ return None
105
+
106
+ def log_info(self) -> str:
107
+ return self.framework_path or ''
108
+
109
+ @staticmethod
110
+ def log_tried() -> str:
111
+ return 'framework'