frida 16.2.1 → 16.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (386) hide show
  1. package/BSDmakefile +6 -0
  2. package/Makefile +16 -0
  3. package/README.md +14 -11
  4. package/configure +18 -0
  5. package/configure.bat +22 -0
  6. package/dist/native.js +0 -8
  7. package/lib/application.ts +98 -0
  8. package/lib/authentication.ts +3 -0
  9. package/lib/build.py +50 -0
  10. package/lib/bus.ts +30 -0
  11. package/lib/cancellable.ts +33 -0
  12. package/lib/child.ts +15 -0
  13. package/lib/crash.ts +11 -0
  14. package/lib/device.ts +329 -0
  15. package/lib/device_manager.ts +69 -0
  16. package/lib/endpoint_parameters.ts +56 -0
  17. package/lib/icon.ts +15 -0
  18. package/lib/index.ts +311 -0
  19. package/lib/iostream.ts +78 -0
  20. package/lib/meson.build +53 -0
  21. package/lib/native.ts +9 -0
  22. package/lib/portal_membership.ts +10 -0
  23. package/lib/portal_service.ts +105 -0
  24. package/lib/process.ts +57 -0
  25. package/lib/relay.ts +44 -0
  26. package/lib/script.ts +352 -0
  27. package/lib/session.ts +113 -0
  28. package/lib/signals.ts +45 -0
  29. package/lib/socket_address.ts +35 -0
  30. package/lib/spawn.ts +4 -0
  31. package/lib/system_parameters.ts +78 -0
  32. package/make.bat +23 -0
  33. package/meson.build +160 -0
  34. package/meson.options +11 -0
  35. package/package.json +27 -6
  36. package/releng/deps.py +1133 -0
  37. package/releng/deps.toml +391 -0
  38. package/releng/devkit-assets/frida-core-example-unix.c +188 -0
  39. package/releng/devkit-assets/frida-core-example-windows.c +197 -0
  40. package/releng/devkit-assets/frida-core-example.sln +28 -0
  41. package/releng/devkit-assets/frida-core-example.vcxproj +157 -0
  42. package/releng/devkit-assets/frida-core-example.vcxproj.filters +27 -0
  43. package/releng/devkit-assets/frida-gum-example-unix.c +122 -0
  44. package/releng/devkit-assets/frida-gum-example-windows.c +132 -0
  45. package/releng/devkit-assets/frida-gum-example.sln +28 -0
  46. package/releng/devkit-assets/frida-gum-example.vcxproj +157 -0
  47. package/releng/devkit-assets/frida-gum-example.vcxproj.filters +27 -0
  48. package/releng/devkit-assets/frida-gumjs-example-unix.c +84 -0
  49. package/releng/devkit-assets/frida-gumjs-example-windows.c +91 -0
  50. package/releng/devkit-assets/frida-gumjs-example.sln +28 -0
  51. package/releng/devkit-assets/frida-gumjs-example.vcxproj +157 -0
  52. package/releng/devkit-assets/frida-gumjs-example.vcxproj.filters +27 -0
  53. package/releng/devkit.py +535 -0
  54. package/releng/env.py +420 -0
  55. package/releng/env_android.py +150 -0
  56. package/releng/env_apple.py +176 -0
  57. package/releng/env_generic.py +373 -0
  58. package/releng/frida_version.py +69 -0
  59. package/releng/machine_file.py +44 -0
  60. package/releng/machine_spec.py +290 -0
  61. package/releng/meson/meson.py +27 -0
  62. package/releng/meson/mesonbuild/__init__.py +0 -0
  63. package/releng/meson/mesonbuild/_pathlib.py +63 -0
  64. package/releng/meson/mesonbuild/_typing.py +69 -0
  65. package/releng/meson/mesonbuild/arglist.py +321 -0
  66. package/releng/meson/mesonbuild/ast/__init__.py +23 -0
  67. package/releng/meson/mesonbuild/ast/interpreter.py +441 -0
  68. package/releng/meson/mesonbuild/ast/introspection.py +374 -0
  69. package/releng/meson/mesonbuild/ast/postprocess.py +109 -0
  70. package/releng/meson/mesonbuild/ast/printer.py +620 -0
  71. package/releng/meson/mesonbuild/ast/visitor.py +161 -0
  72. package/releng/meson/mesonbuild/backend/__init__.py +0 -0
  73. package/releng/meson/mesonbuild/backend/backends.py +2047 -0
  74. package/releng/meson/mesonbuild/backend/ninjabackend.py +3808 -0
  75. package/releng/meson/mesonbuild/backend/nonebackend.py +26 -0
  76. package/releng/meson/mesonbuild/backend/vs2010backend.py +2078 -0
  77. package/releng/meson/mesonbuild/backend/vs2012backend.py +35 -0
  78. package/releng/meson/mesonbuild/backend/vs2013backend.py +34 -0
  79. package/releng/meson/mesonbuild/backend/vs2015backend.py +35 -0
  80. package/releng/meson/mesonbuild/backend/vs2017backend.py +59 -0
  81. package/releng/meson/mesonbuild/backend/vs2019backend.py +54 -0
  82. package/releng/meson/mesonbuild/backend/vs2022backend.py +54 -0
  83. package/releng/meson/mesonbuild/backend/xcodebackend.py +1781 -0
  84. package/releng/meson/mesonbuild/build.py +3249 -0
  85. package/releng/meson/mesonbuild/cargo/__init__.py +5 -0
  86. package/releng/meson/mesonbuild/cargo/builder.py +238 -0
  87. package/releng/meson/mesonbuild/cargo/cfg.py +274 -0
  88. package/releng/meson/mesonbuild/cargo/interpreter.py +733 -0
  89. package/releng/meson/mesonbuild/cargo/manifest.py +227 -0
  90. package/releng/meson/mesonbuild/cargo/version.py +95 -0
  91. package/releng/meson/mesonbuild/cmake/__init__.py +28 -0
  92. package/releng/meson/mesonbuild/cmake/common.py +331 -0
  93. package/releng/meson/mesonbuild/cmake/data/__init__.py +0 -0
  94. package/releng/meson/mesonbuild/cmake/data/preload.cmake +82 -0
  95. package/releng/meson/mesonbuild/cmake/executor.py +241 -0
  96. package/releng/meson/mesonbuild/cmake/fileapi.py +324 -0
  97. package/releng/meson/mesonbuild/cmake/generator.py +186 -0
  98. package/releng/meson/mesonbuild/cmake/interpreter.py +1267 -0
  99. package/releng/meson/mesonbuild/cmake/toolchain.py +248 -0
  100. package/releng/meson/mesonbuild/cmake/traceparser.py +814 -0
  101. package/releng/meson/mesonbuild/cmake/tracetargets.py +161 -0
  102. package/releng/meson/mesonbuild/compilers/__init__.py +86 -0
  103. package/releng/meson/mesonbuild/compilers/asm.py +307 -0
  104. package/releng/meson/mesonbuild/compilers/c.py +788 -0
  105. package/releng/meson/mesonbuild/compilers/c_function_attributes.py +143 -0
  106. package/releng/meson/mesonbuild/compilers/compilers.py +1388 -0
  107. package/releng/meson/mesonbuild/compilers/cpp.py +1035 -0
  108. package/releng/meson/mesonbuild/compilers/cs.py +136 -0
  109. package/releng/meson/mesonbuild/compilers/cuda.py +806 -0
  110. package/releng/meson/mesonbuild/compilers/cython.py +91 -0
  111. package/releng/meson/mesonbuild/compilers/d.py +861 -0
  112. package/releng/meson/mesonbuild/compilers/detect.py +1396 -0
  113. package/releng/meson/mesonbuild/compilers/fortran.py +523 -0
  114. package/releng/meson/mesonbuild/compilers/java.py +113 -0
  115. package/releng/meson/mesonbuild/compilers/mixins/__init__.py +0 -0
  116. package/releng/meson/mesonbuild/compilers/mixins/arm.py +167 -0
  117. package/releng/meson/mesonbuild/compilers/mixins/ccrx.py +113 -0
  118. package/releng/meson/mesonbuild/compilers/mixins/clang.py +170 -0
  119. package/releng/meson/mesonbuild/compilers/mixins/clike.py +1330 -0
  120. package/releng/meson/mesonbuild/compilers/mixins/compcert.py +117 -0
  121. package/releng/meson/mesonbuild/compilers/mixins/elbrus.py +93 -0
  122. package/releng/meson/mesonbuild/compilers/mixins/emscripten.py +89 -0
  123. package/releng/meson/mesonbuild/compilers/mixins/gnu.py +629 -0
  124. package/releng/meson/mesonbuild/compilers/mixins/intel.py +167 -0
  125. package/releng/meson/mesonbuild/compilers/mixins/islinker.py +120 -0
  126. package/releng/meson/mesonbuild/compilers/mixins/metrowerks.py +279 -0
  127. package/releng/meson/mesonbuild/compilers/mixins/pgi.py +88 -0
  128. package/releng/meson/mesonbuild/compilers/mixins/ti.py +130 -0
  129. package/releng/meson/mesonbuild/compilers/mixins/visualstudio.py +458 -0
  130. package/releng/meson/mesonbuild/compilers/mixins/xc16.py +111 -0
  131. package/releng/meson/mesonbuild/compilers/objc.py +120 -0
  132. package/releng/meson/mesonbuild/compilers/objcpp.py +102 -0
  133. package/releng/meson/mesonbuild/compilers/rust.py +230 -0
  134. package/releng/meson/mesonbuild/compilers/swift.py +131 -0
  135. package/releng/meson/mesonbuild/compilers/vala.py +121 -0
  136. package/releng/meson/mesonbuild/coredata.py +1532 -0
  137. package/releng/meson/mesonbuild/dependencies/__init__.py +252 -0
  138. package/releng/meson/mesonbuild/dependencies/base.py +663 -0
  139. package/releng/meson/mesonbuild/dependencies/boost.py +1083 -0
  140. package/releng/meson/mesonbuild/dependencies/cmake.py +656 -0
  141. package/releng/meson/mesonbuild/dependencies/coarrays.py +80 -0
  142. package/releng/meson/mesonbuild/dependencies/configtool.py +163 -0
  143. package/releng/meson/mesonbuild/dependencies/cuda.py +295 -0
  144. package/releng/meson/mesonbuild/dependencies/data/CMakeLists.txt +102 -0
  145. package/releng/meson/mesonbuild/dependencies/data/CMakeListsLLVM.txt +204 -0
  146. package/releng/meson/mesonbuild/dependencies/data/CMakePathInfo.txt +31 -0
  147. package/releng/meson/mesonbuild/dependencies/data/__init__.py +0 -0
  148. package/releng/meson/mesonbuild/dependencies/detect.py +225 -0
  149. package/releng/meson/mesonbuild/dependencies/dev.py +707 -0
  150. package/releng/meson/mesonbuild/dependencies/dub.py +424 -0
  151. package/releng/meson/mesonbuild/dependencies/factory.py +146 -0
  152. package/releng/meson/mesonbuild/dependencies/framework.py +111 -0
  153. package/releng/meson/mesonbuild/dependencies/hdf5.py +168 -0
  154. package/releng/meson/mesonbuild/dependencies/misc.py +618 -0
  155. package/releng/meson/mesonbuild/dependencies/mpi.py +231 -0
  156. package/releng/meson/mesonbuild/dependencies/pkgconfig.py +570 -0
  157. package/releng/meson/mesonbuild/dependencies/platform.py +52 -0
  158. package/releng/meson/mesonbuild/dependencies/python.py +431 -0
  159. package/releng/meson/mesonbuild/dependencies/qt.py +484 -0
  160. package/releng/meson/mesonbuild/dependencies/scalapack.py +142 -0
  161. package/releng/meson/mesonbuild/dependencies/ui.py +281 -0
  162. package/releng/meson/mesonbuild/depfile.py +82 -0
  163. package/releng/meson/mesonbuild/envconfig.py +480 -0
  164. package/releng/meson/mesonbuild/environment.py +987 -0
  165. package/releng/meson/mesonbuild/interpreter/__init__.py +47 -0
  166. package/releng/meson/mesonbuild/interpreter/compiler.py +900 -0
  167. package/releng/meson/mesonbuild/interpreter/dependencyfallbacks.py +386 -0
  168. package/releng/meson/mesonbuild/interpreter/interpreter.py +3595 -0
  169. package/releng/meson/mesonbuild/interpreter/interpreterobjects.py +1096 -0
  170. package/releng/meson/mesonbuild/interpreter/kwargs.py +479 -0
  171. package/releng/meson/mesonbuild/interpreter/mesonmain.py +487 -0
  172. package/releng/meson/mesonbuild/interpreter/primitives/__init__.py +29 -0
  173. package/releng/meson/mesonbuild/interpreter/primitives/array.py +108 -0
  174. package/releng/meson/mesonbuild/interpreter/primitives/boolean.py +52 -0
  175. package/releng/meson/mesonbuild/interpreter/primitives/dict.py +88 -0
  176. package/releng/meson/mesonbuild/interpreter/primitives/integer.py +86 -0
  177. package/releng/meson/mesonbuild/interpreter/primitives/range.py +38 -0
  178. package/releng/meson/mesonbuild/interpreter/primitives/string.py +247 -0
  179. package/releng/meson/mesonbuild/interpreter/type_checking.py +853 -0
  180. package/releng/meson/mesonbuild/interpreterbase/__init__.py +126 -0
  181. package/releng/meson/mesonbuild/interpreterbase/_unholder.py +25 -0
  182. package/releng/meson/mesonbuild/interpreterbase/baseobjects.py +174 -0
  183. package/releng/meson/mesonbuild/interpreterbase/decorators.py +806 -0
  184. package/releng/meson/mesonbuild/interpreterbase/disabler.py +35 -0
  185. package/releng/meson/mesonbuild/interpreterbase/exceptions.py +22 -0
  186. package/releng/meson/mesonbuild/interpreterbase/helpers.py +67 -0
  187. package/releng/meson/mesonbuild/interpreterbase/interpreterbase.py +665 -0
  188. package/releng/meson/mesonbuild/interpreterbase/operator.py +32 -0
  189. package/releng/meson/mesonbuild/linkers/__init__.py +20 -0
  190. package/releng/meson/mesonbuild/linkers/base.py +39 -0
  191. package/releng/meson/mesonbuild/linkers/detect.py +229 -0
  192. package/releng/meson/mesonbuild/linkers/linkers.py +1614 -0
  193. package/releng/meson/mesonbuild/mcompile.py +380 -0
  194. package/releng/meson/mesonbuild/mconf.py +368 -0
  195. package/releng/meson/mesonbuild/mdevenv.py +234 -0
  196. package/releng/meson/mesonbuild/mdist.py +376 -0
  197. package/releng/meson/mesonbuild/mesondata.py +38 -0
  198. package/releng/meson/mesonbuild/mesonlib.py +23 -0
  199. package/releng/meson/mesonbuild/mesonmain.py +289 -0
  200. package/releng/meson/mesonbuild/minit.py +204 -0
  201. package/releng/meson/mesonbuild/minstall.py +864 -0
  202. package/releng/meson/mesonbuild/mintro.py +667 -0
  203. package/releng/meson/mesonbuild/mlog.py +542 -0
  204. package/releng/meson/mesonbuild/modules/__init__.py +270 -0
  205. package/releng/meson/mesonbuild/modules/cmake.py +442 -0
  206. package/releng/meson/mesonbuild/modules/cuda.py +377 -0
  207. package/releng/meson/mesonbuild/modules/dlang.py +117 -0
  208. package/releng/meson/mesonbuild/modules/external_project.py +306 -0
  209. package/releng/meson/mesonbuild/modules/fs.py +323 -0
  210. package/releng/meson/mesonbuild/modules/gnome.py +2215 -0
  211. package/releng/meson/mesonbuild/modules/hotdoc.py +487 -0
  212. package/releng/meson/mesonbuild/modules/i18n.py +405 -0
  213. package/releng/meson/mesonbuild/modules/icestorm.py +123 -0
  214. package/releng/meson/mesonbuild/modules/java.py +112 -0
  215. package/releng/meson/mesonbuild/modules/keyval.py +65 -0
  216. package/releng/meson/mesonbuild/modules/modtest.py +33 -0
  217. package/releng/meson/mesonbuild/modules/pkgconfig.py +744 -0
  218. package/releng/meson/mesonbuild/modules/python.py +556 -0
  219. package/releng/meson/mesonbuild/modules/python3.py +85 -0
  220. package/releng/meson/mesonbuild/modules/qt.py +621 -0
  221. package/releng/meson/mesonbuild/modules/qt4.py +23 -0
  222. package/releng/meson/mesonbuild/modules/qt5.py +23 -0
  223. package/releng/meson/mesonbuild/modules/qt6.py +22 -0
  224. package/releng/meson/mesonbuild/modules/rust.py +355 -0
  225. package/releng/meson/mesonbuild/modules/simd.py +114 -0
  226. package/releng/meson/mesonbuild/modules/sourceset.py +291 -0
  227. package/releng/meson/mesonbuild/modules/wayland.py +151 -0
  228. package/releng/meson/mesonbuild/modules/windows.py +207 -0
  229. package/releng/meson/mesonbuild/mparser.py +1114 -0
  230. package/releng/meson/mesonbuild/msetup.py +365 -0
  231. package/releng/meson/mesonbuild/msubprojects.py +764 -0
  232. package/releng/meson/mesonbuild/mtest.py +2201 -0
  233. package/releng/meson/mesonbuild/munstable_coredata.py +107 -0
  234. package/releng/meson/mesonbuild/optinterpreter.py +276 -0
  235. package/releng/meson/mesonbuild/programs.py +367 -0
  236. package/releng/meson/mesonbuild/rewriter.py +1075 -0
  237. package/releng/meson/mesonbuild/scripts/__init__.py +10 -0
  238. package/releng/meson/mesonbuild/scripts/clangformat.py +55 -0
  239. package/releng/meson/mesonbuild/scripts/clangtidy.py +30 -0
  240. package/releng/meson/mesonbuild/scripts/cleantrees.py +35 -0
  241. package/releng/meson/mesonbuild/scripts/cmake_run_ctgt.py +103 -0
  242. package/releng/meson/mesonbuild/scripts/cmd_or_ps.ps1 +17 -0
  243. package/releng/meson/mesonbuild/scripts/copy.py +19 -0
  244. package/releng/meson/mesonbuild/scripts/coverage.py +214 -0
  245. package/releng/meson/mesonbuild/scripts/delwithsuffix.py +27 -0
  246. package/releng/meson/mesonbuild/scripts/depfixer.py +495 -0
  247. package/releng/meson/mesonbuild/scripts/depscan.py +198 -0
  248. package/releng/meson/mesonbuild/scripts/dirchanger.py +20 -0
  249. package/releng/meson/mesonbuild/scripts/env2mfile.py +402 -0
  250. package/releng/meson/mesonbuild/scripts/externalproject.py +106 -0
  251. package/releng/meson/mesonbuild/scripts/gettext.py +86 -0
  252. package/releng/meson/mesonbuild/scripts/gtkdochelper.py +286 -0
  253. package/releng/meson/mesonbuild/scripts/hotdochelper.py +40 -0
  254. package/releng/meson/mesonbuild/scripts/itstool.py +77 -0
  255. package/releng/meson/mesonbuild/scripts/meson_exe.py +115 -0
  256. package/releng/meson/mesonbuild/scripts/msgfmthelper.py +29 -0
  257. package/releng/meson/mesonbuild/scripts/pycompile.py +54 -0
  258. package/releng/meson/mesonbuild/scripts/python_info.py +121 -0
  259. package/releng/meson/mesonbuild/scripts/regen_checker.py +55 -0
  260. package/releng/meson/mesonbuild/scripts/run_tool.py +58 -0
  261. package/releng/meson/mesonbuild/scripts/scanbuild.py +57 -0
  262. package/releng/meson/mesonbuild/scripts/symbolextractor.py +322 -0
  263. package/releng/meson/mesonbuild/scripts/tags.py +44 -0
  264. package/releng/meson/mesonbuild/scripts/test_loaded_modules.py +14 -0
  265. package/releng/meson/mesonbuild/scripts/uninstall.py +41 -0
  266. package/releng/meson/mesonbuild/scripts/vcstagger.py +35 -0
  267. package/releng/meson/mesonbuild/scripts/yasm.py +24 -0
  268. package/releng/meson/mesonbuild/templates/__init__.py +0 -0
  269. package/releng/meson/mesonbuild/templates/cpptemplates.py +143 -0
  270. package/releng/meson/mesonbuild/templates/cstemplates.py +90 -0
  271. package/releng/meson/mesonbuild/templates/ctemplates.py +126 -0
  272. package/releng/meson/mesonbuild/templates/cudatemplates.py +143 -0
  273. package/releng/meson/mesonbuild/templates/dlangtemplates.py +109 -0
  274. package/releng/meson/mesonbuild/templates/fortrantemplates.py +101 -0
  275. package/releng/meson/mesonbuild/templates/javatemplates.py +94 -0
  276. package/releng/meson/mesonbuild/templates/mesontemplates.py +70 -0
  277. package/releng/meson/mesonbuild/templates/objcpptemplates.py +126 -0
  278. package/releng/meson/mesonbuild/templates/objctemplates.py +126 -0
  279. package/releng/meson/mesonbuild/templates/rusttemplates.py +79 -0
  280. package/releng/meson/mesonbuild/templates/samplefactory.py +41 -0
  281. package/releng/meson/mesonbuild/templates/sampleimpl.py +160 -0
  282. package/releng/meson/mesonbuild/templates/valatemplates.py +82 -0
  283. package/releng/meson/mesonbuild/utils/__init__.py +0 -0
  284. package/releng/meson/mesonbuild/utils/core.py +166 -0
  285. package/releng/meson/mesonbuild/utils/platform.py +27 -0
  286. package/releng/meson/mesonbuild/utils/posix.py +32 -0
  287. package/releng/meson/mesonbuild/utils/universal.py +2445 -0
  288. package/releng/meson/mesonbuild/utils/vsenv.py +126 -0
  289. package/releng/meson/mesonbuild/utils/win32.py +29 -0
  290. package/releng/meson/mesonbuild/wrap/__init__.py +59 -0
  291. package/releng/meson/mesonbuild/wrap/wrap.py +846 -0
  292. package/releng/meson/mesonbuild/wrap/wraptool.py +198 -0
  293. package/releng/meson-scripts/BSDmakefile +6 -0
  294. package/releng/meson-scripts/Makefile +16 -0
  295. package/releng/meson-scripts/configure +18 -0
  296. package/releng/meson-scripts/configure.bat +22 -0
  297. package/releng/meson-scripts/make.bat +23 -0
  298. package/releng/meson_configure.py +506 -0
  299. package/releng/meson_make.py +131 -0
  300. package/releng/mkdevkit.py +107 -0
  301. package/releng/mkfatmacho.py +54 -0
  302. package/releng/post-process-oabi.py +97 -0
  303. package/releng/progress.py +14 -0
  304. package/releng/sync-from-upstream.py +185 -0
  305. package/releng/tomlkit/tomlkit/__init__.py +59 -0
  306. package/releng/tomlkit/tomlkit/_compat.py +22 -0
  307. package/releng/tomlkit/tomlkit/_types.py +83 -0
  308. package/releng/tomlkit/tomlkit/_utils.py +158 -0
  309. package/releng/tomlkit/tomlkit/api.py +308 -0
  310. package/releng/tomlkit/tomlkit/container.py +875 -0
  311. package/releng/tomlkit/tomlkit/exceptions.py +227 -0
  312. package/releng/tomlkit/tomlkit/items.py +1967 -0
  313. package/releng/tomlkit/tomlkit/parser.py +1141 -0
  314. package/releng/tomlkit/tomlkit/py.typed +0 -0
  315. package/releng/tomlkit/tomlkit/source.py +180 -0
  316. package/releng/tomlkit/tomlkit/toml_char.py +52 -0
  317. package/releng/tomlkit/tomlkit/toml_document.py +7 -0
  318. package/releng/tomlkit/tomlkit/toml_file.py +58 -0
  319. package/releng/winenv.py +140 -0
  320. package/scripts/adjust-version.py +19 -0
  321. package/scripts/detect-version.py +40 -0
  322. package/scripts/fetch-abi-bits.py +343 -0
  323. package/scripts/install.js +23 -0
  324. package/scripts/package.py +15 -0
  325. package/src/addon.cc +76 -0
  326. package/src/application.cc +148 -0
  327. package/src/application.h +31 -0
  328. package/src/authentication.cc +174 -0
  329. package/src/authentication.h +24 -0
  330. package/src/bus.cc +167 -0
  331. package/src/bus.h +33 -0
  332. package/src/cancellable.cc +117 -0
  333. package/src/cancellable.h +31 -0
  334. package/src/child.cc +150 -0
  335. package/src/child.h +32 -0
  336. package/src/crash.cc +122 -0
  337. package/src/crash.h +30 -0
  338. package/src/device.cc +1302 -0
  339. package/src/device.h +55 -0
  340. package/src/device_manager.cc +362 -0
  341. package/src/device_manager.h +35 -0
  342. package/src/endpoint_parameters.cc +171 -0
  343. package/src/endpoint_parameters.h +28 -0
  344. package/src/glib_context.cc +62 -0
  345. package/src/glib_context.h +29 -0
  346. package/src/glib_object.cc +25 -0
  347. package/src/glib_object.h +37 -0
  348. package/src/iostream.cc +247 -0
  349. package/src/iostream.h +30 -0
  350. package/src/meson.build +26 -0
  351. package/src/operation.h +94 -0
  352. package/src/portal_membership.cc +100 -0
  353. package/src/portal_membership.h +26 -0
  354. package/src/portal_service.cc +401 -0
  355. package/src/portal_service.h +40 -0
  356. package/src/process.cc +135 -0
  357. package/src/process.h +30 -0
  358. package/src/relay.cc +139 -0
  359. package/src/relay.h +31 -0
  360. package/src/runtime.cc +443 -0
  361. package/src/runtime.h +64 -0
  362. package/src/script.cc +301 -0
  363. package/src/script.h +36 -0
  364. package/src/session.cc +860 -0
  365. package/src/session.h +42 -0
  366. package/src/signals.cc +334 -0
  367. package/src/signals.h +47 -0
  368. package/src/spawn.cc +95 -0
  369. package/src/spawn.h +27 -0
  370. package/src/usage_monitor.h +117 -0
  371. package/src/uv_context.cc +118 -0
  372. package/src/uv_context.h +40 -0
  373. package/src/win_delay_load_hook.cc +63 -0
  374. package/subprojects/frida-core.wrap +8 -0
  375. package/subprojects/nan.wrap +9 -0
  376. package/subprojects/packagefiles/nan.patch +13 -0
  377. package/test/data/index.ts +13 -0
  378. package/test/data/unixvictim-linux-x86 +0 -0
  379. package/test/data/unixvictim-linux-x86_64 +0 -0
  380. package/test/data/unixvictim-macos +0 -0
  381. package/test/device.ts +27 -0
  382. package/test/device_manager.ts +16 -0
  383. package/test/labrat.ts +32 -0
  384. package/test/script.ts +176 -0
  385. package/test/session.ts +73 -0
  386. package/tsconfig.json +18 -0
@@ -0,0 +1,484 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+ # Copyright 2013-2017 The Meson development team
3
+ # Copyright © 2021-2023 Intel Corporation
4
+
5
+ from __future__ import annotations
6
+
7
+ """Dependency finders for the Qt framework."""
8
+
9
+ import abc
10
+ import re
11
+ import os
12
+ import typing as T
13
+
14
+ from .base import DependencyException, DependencyMethods
15
+ from .configtool import ConfigToolDependency
16
+ from .detect import packages
17
+ from .framework import ExtraFrameworkDependency
18
+ from .pkgconfig import PkgConfigDependency
19
+ from .factory import DependencyFactory
20
+ from .. import mlog
21
+ from .. import mesonlib
22
+
23
+ if T.TYPE_CHECKING:
24
+ from ..compilers import Compiler
25
+ from ..envconfig import MachineInfo
26
+ from ..environment import Environment
27
+ from ..dependencies import MissingCompiler
28
+
29
+
30
+ def _qt_get_private_includes(mod_inc_dir: str, module: str, mod_version: str) -> T.List[str]:
31
+ # usually Qt5 puts private headers in /QT_INSTALL_HEADERS/module/VERSION/module/private
32
+ # except for at least QtWebkit and Enginio where the module version doesn't match Qt version
33
+ # as an example with Qt 5.10.1 on linux you would get:
34
+ # /usr/include/qt5/QtCore/5.10.1/QtCore/private/
35
+ # /usr/include/qt5/QtWidgets/5.10.1/QtWidgets/private/
36
+ # /usr/include/qt5/QtWebKit/5.212.0/QtWebKit/private/
37
+
38
+ # on Qt4 when available private folder is directly in module folder
39
+ # like /usr/include/QtCore/private/
40
+ if int(mod_version.split('.')[0]) < 5:
41
+ return []
42
+
43
+ private_dir = os.path.join(mod_inc_dir, mod_version)
44
+ # fallback, let's try to find a directory with the latest version
45
+ if os.path.isdir(mod_inc_dir) and not os.path.exists(private_dir):
46
+ dirs = [filename for filename in os.listdir(mod_inc_dir)
47
+ if os.path.isdir(os.path.join(mod_inc_dir, filename))]
48
+
49
+ for dirname in sorted(dirs, reverse=True):
50
+ if len(dirname.split('.')) == 3:
51
+ private_dir = dirname
52
+ break
53
+ return [private_dir, os.path.join(private_dir, 'Qt' + module)]
54
+
55
+
56
+ def get_qmake_host_bins(qvars: T.Dict[str, str]) -> str:
57
+ # Prefer QT_HOST_BINS (qt5, correct for cross and native compiling)
58
+ # but fall back to QT_INSTALL_BINS (qt4)
59
+ if 'QT_HOST_BINS' in qvars:
60
+ return qvars['QT_HOST_BINS']
61
+ return qvars['QT_INSTALL_BINS']
62
+
63
+
64
+ def get_qmake_host_libexecs(qvars: T.Dict[str, str]) -> T.Optional[str]:
65
+ if 'QT_HOST_LIBEXECS' in qvars:
66
+ return qvars['QT_HOST_LIBEXECS']
67
+ return qvars.get('QT_INSTALL_LIBEXECS')
68
+
69
+
70
+ def _get_modules_lib_suffix(version: str, info: 'MachineInfo', is_debug: bool) -> str:
71
+ """Get the module suffix based on platform and debug type."""
72
+ suffix = ''
73
+ if info.is_windows():
74
+ if is_debug:
75
+ suffix += 'd'
76
+ if version.startswith('4'):
77
+ suffix += '4'
78
+ if info.is_darwin():
79
+ if is_debug:
80
+ suffix += '_debug'
81
+ if mesonlib.version_compare(version, '>= 5.14.0'):
82
+ if info.is_android():
83
+ if info.cpu_family == 'x86':
84
+ suffix += '_x86'
85
+ elif info.cpu_family == 'x86_64':
86
+ suffix += '_x86_64'
87
+ elif info.cpu_family == 'arm':
88
+ suffix += '_armeabi-v7a'
89
+ elif info.cpu_family == 'aarch64':
90
+ suffix += '_arm64-v8a'
91
+ else:
92
+ mlog.warning(f'Android target arch "{info.cpu_family}"" for Qt5 is unknown, '
93
+ 'module detection may not work')
94
+ return suffix
95
+
96
+
97
+ class QtExtraFrameworkDependency(ExtraFrameworkDependency):
98
+ def __init__(self, name: str, env: 'Environment', kwargs: T.Dict[str, T.Any], qvars: T.Dict[str, str], language: T.Optional[str] = None):
99
+ super().__init__(name, env, kwargs, language=language)
100
+ self.mod_name = name[2:]
101
+ self.qt_extra_include_directory = qvars['QT_INSTALL_HEADERS']
102
+
103
+ def get_compile_args(self, with_private_headers: bool = False, qt_version: str = "0") -> T.List[str]:
104
+ if self.found():
105
+ mod_inc_dir = os.path.join(self.framework_path, 'Headers')
106
+ args = ['-I' + mod_inc_dir]
107
+ if with_private_headers:
108
+ args += ['-I' + dirname for dirname in _qt_get_private_includes(mod_inc_dir, self.mod_name, qt_version)]
109
+ if self.qt_extra_include_directory:
110
+ args += ['-I' + self.qt_extra_include_directory]
111
+ return args
112
+ return []
113
+
114
+
115
+ class _QtBase:
116
+
117
+ """Mixin class for shared components between PkgConfig and Qmake."""
118
+
119
+ link_args: T.List[str]
120
+ clib_compiler: T.Union['MissingCompiler', 'Compiler']
121
+ env: 'Environment'
122
+ libexecdir: T.Optional[str] = None
123
+ version: str
124
+
125
+ def __init__(self, name: str, kwargs: T.Dict[str, T.Any]):
126
+ self.name = name
127
+ self.qtname = name.capitalize()
128
+ self.qtver = name[-1]
129
+ if self.qtver == "4":
130
+ self.qtpkgname = 'Qt'
131
+ else:
132
+ self.qtpkgname = self.qtname
133
+
134
+ self.private_headers = T.cast('bool', kwargs.get('private_headers', False))
135
+
136
+ self.requested_modules = mesonlib.stringlistify(mesonlib.extract_as_list(kwargs, 'modules'))
137
+ if not self.requested_modules:
138
+ raise DependencyException('No ' + self.qtname + ' modules specified.')
139
+
140
+ self.qtmain = T.cast('bool', kwargs.get('main', False))
141
+ if not isinstance(self.qtmain, bool):
142
+ raise DependencyException('"main" argument must be a boolean')
143
+
144
+ def _link_with_qt_winmain(self, is_debug: bool, libdir: T.Union[str, T.List[str]]) -> bool:
145
+ libdir = mesonlib.listify(libdir) # TODO: shouldn't be necessary
146
+ base_name = self.get_qt_winmain_base_name(is_debug)
147
+ qt_winmain = self.clib_compiler.find_library(base_name, self.env, libdir)
148
+ if qt_winmain:
149
+ self.link_args.append(qt_winmain[0])
150
+ return True
151
+ return False
152
+
153
+ def get_qt_winmain_base_name(self, is_debug: bool) -> str:
154
+ return 'qtmaind' if is_debug else 'qtmain'
155
+
156
+ def get_exe_args(self, compiler: 'Compiler') -> T.List[str]:
157
+ # Originally this was -fPIE but nowadays the default
158
+ # for upstream and distros seems to be -reduce-relocations
159
+ # which requires -fPIC. This may cause a performance
160
+ # penalty when using self-built Qt or on platforms
161
+ # where -fPIC is not required. If this is an issue
162
+ # for you, patches are welcome.
163
+ return compiler.get_pic_args()
164
+
165
+ def log_details(self) -> str:
166
+ return f'modules: {", ".join(sorted(self.requested_modules))}'
167
+
168
+
169
+ class QtPkgConfigDependency(_QtBase, PkgConfigDependency, metaclass=abc.ABCMeta):
170
+
171
+ """Specialization of the PkgConfigDependency for Qt."""
172
+
173
+ def __init__(self, name: str, env: 'Environment', kwargs: T.Dict[str, T.Any]):
174
+ _QtBase.__init__(self, name, kwargs)
175
+
176
+ # Always use QtCore as the "main" dependency, since it has the extra
177
+ # pkg-config variables that a user would expect to get. If "Core" is
178
+ # not a requested module, delete the compile and link arguments to
179
+ # avoid linking with something they didn't ask for
180
+ PkgConfigDependency.__init__(self, self.qtpkgname + 'Core', env, kwargs)
181
+ if 'Core' not in self.requested_modules:
182
+ self.compile_args = []
183
+ self.link_args = []
184
+
185
+ for m in self.requested_modules:
186
+ mod = PkgConfigDependency(self.qtpkgname + m, self.env, kwargs, language=self.language)
187
+ if not mod.found():
188
+ self.is_found = False
189
+ return
190
+ if self.private_headers:
191
+ qt_inc_dir = mod.get_variable(pkgconfig='includedir')
192
+ mod_private_dir = os.path.join(qt_inc_dir, 'Qt' + m)
193
+ if not os.path.isdir(mod_private_dir):
194
+ # At least some versions of homebrew don't seem to set this
195
+ # up correctly. /usr/local/opt/qt/include/Qt + m_name is a
196
+ # symlink to /usr/local/opt/qt/include, but the pkg-config
197
+ # file points to /usr/local/Cellar/qt/x.y.z/Headers/, and
198
+ # the Qt + m_name there is not a symlink, it's a file
199
+ mod_private_dir = qt_inc_dir
200
+ mod_private_inc = _qt_get_private_includes(mod_private_dir, m, mod.version)
201
+ for directory in mod_private_inc:
202
+ mod.compile_args.append('-I' + directory)
203
+ self._add_sub_dependency([lambda: mod])
204
+
205
+ if self.env.machines[self.for_machine].is_windows() and self.qtmain:
206
+ # Check if we link with debug binaries
207
+ debug_lib_name = self.qtpkgname + 'Core' + _get_modules_lib_suffix(self.version, self.env.machines[self.for_machine], True)
208
+ is_debug = False
209
+ for arg in self.get_link_args():
210
+ if arg == f'-l{debug_lib_name}' or arg.endswith(f'{debug_lib_name}.lib') or arg.endswith(f'{debug_lib_name}.a'):
211
+ is_debug = True
212
+ break
213
+ libdir = self.get_variable(pkgconfig='libdir')
214
+ if not self._link_with_qt_winmain(is_debug, libdir):
215
+ self.is_found = False
216
+ return
217
+
218
+ self.bindir = self.get_pkgconfig_host_bins(self)
219
+ if not self.bindir:
220
+ # If exec_prefix is not defined, the pkg-config file is broken
221
+ prefix = self.get_variable(pkgconfig='exec_prefix')
222
+ if prefix:
223
+ self.bindir = os.path.join(prefix, 'bin')
224
+
225
+ self.libexecdir = self.get_pkgconfig_host_libexecs(self)
226
+
227
+ @staticmethod
228
+ @abc.abstractmethod
229
+ def get_pkgconfig_host_bins(core: PkgConfigDependency) -> T.Optional[str]:
230
+ pass
231
+
232
+ @staticmethod
233
+ @abc.abstractmethod
234
+ def get_pkgconfig_host_libexecs(core: PkgConfigDependency) -> T.Optional[str]:
235
+ pass
236
+
237
+ @abc.abstractmethod
238
+ def get_private_includes(self, mod_inc_dir: str, module: str) -> T.List[str]:
239
+ pass
240
+
241
+ def log_info(self) -> str:
242
+ return 'pkg-config'
243
+
244
+
245
+ class QmakeQtDependency(_QtBase, ConfigToolDependency, metaclass=abc.ABCMeta):
246
+
247
+ """Find Qt using Qmake as a config-tool."""
248
+
249
+ version: str
250
+ version_arg = '-v'
251
+
252
+ def __init__(self, name: str, env: 'Environment', kwargs: T.Dict[str, T.Any]):
253
+ _QtBase.__init__(self, name, kwargs)
254
+ self.tool_name = f'qmake{self.qtver}'
255
+ self.tools = [f'qmake{self.qtver}', f'qmake-{self.name}', 'qmake']
256
+
257
+ # Add additional constraints that the Qt version is met, but preserve
258
+ # any version requirements the user has set as well. For example, if Qt5
259
+ # is requested, add "">= 5, < 6", but if the user has ">= 5.6", don't
260
+ # lose that.
261
+ kwargs = kwargs.copy()
262
+ _vers = mesonlib.listify(kwargs.get('version', []))
263
+ _vers.extend([f'>= {self.qtver}', f'< {int(self.qtver) + 1}'])
264
+ kwargs['version'] = _vers
265
+
266
+ ConfigToolDependency.__init__(self, name, env, kwargs)
267
+ if not self.found():
268
+ return
269
+
270
+ # Query library path, header path, and binary path
271
+ stdo = self.get_config_value(['-query'], 'args')
272
+ qvars: T.Dict[str, str] = {}
273
+ for line in stdo:
274
+ line = line.strip()
275
+ if line == '':
276
+ continue
277
+ k, v = line.split(':', 1)
278
+ qvars[k] = v
279
+ # Qt on macOS uses a framework, but Qt for iOS/tvOS does not
280
+ xspec = qvars.get('QMAKE_XSPEC', '')
281
+ if self.env.machines.host.is_darwin() and not any(s in xspec for s in ['ios', 'tvos']):
282
+ mlog.debug("Building for macOS, looking for framework")
283
+ self._framework_detect(qvars, self.requested_modules, kwargs)
284
+ # Sometimes Qt is built not as a framework (for instance, when using conan pkg manager)
285
+ # skip and fall back to normal procedure then
286
+ if self.is_found:
287
+ return
288
+ else:
289
+ mlog.debug("Building for macOS, couldn't find framework, falling back to library search")
290
+ incdir = qvars['QT_INSTALL_HEADERS']
291
+ self.compile_args.append('-I' + incdir)
292
+ libdir = qvars['QT_INSTALL_LIBS']
293
+ # Used by qt.compilers_detect()
294
+ self.bindir = get_qmake_host_bins(qvars)
295
+ self.libexecdir = get_qmake_host_libexecs(qvars)
296
+
297
+ # Use the buildtype by default, but look at the b_vscrt option if the
298
+ # compiler supports it.
299
+ is_debug = self.env.coredata.get_option(mesonlib.OptionKey('buildtype')) == 'debug'
300
+ if mesonlib.OptionKey('b_vscrt') in self.env.coredata.options:
301
+ if self.env.coredata.options[mesonlib.OptionKey('b_vscrt')].value in {'mdd', 'mtd'}:
302
+ is_debug = True
303
+ modules_lib_suffix = _get_modules_lib_suffix(self.version, self.env.machines[self.for_machine], is_debug)
304
+
305
+ for module in self.requested_modules:
306
+ mincdir = os.path.join(incdir, 'Qt' + module)
307
+ self.compile_args.append('-I' + mincdir)
308
+
309
+ if module == 'QuickTest':
310
+ define_base = 'QMLTEST'
311
+ elif module == 'Test':
312
+ define_base = 'TESTLIB'
313
+ else:
314
+ define_base = module.upper()
315
+ self.compile_args.append(f'-DQT_{define_base}_LIB')
316
+
317
+ if self.private_headers:
318
+ priv_inc = self.get_private_includes(mincdir, module)
319
+ for directory in priv_inc:
320
+ self.compile_args.append('-I' + directory)
321
+ libfiles = self.clib_compiler.find_library(
322
+ self.qtpkgname + module + modules_lib_suffix, self.env,
323
+ mesonlib.listify(libdir)) # TODO: shouldn't be necessary
324
+ if libfiles:
325
+ libfile = libfiles[0]
326
+ else:
327
+ mlog.log("Could not find:", module,
328
+ self.qtpkgname + module + modules_lib_suffix,
329
+ 'in', libdir)
330
+ self.is_found = False
331
+ break
332
+ self.link_args.append(libfile)
333
+
334
+ if self.env.machines[self.for_machine].is_windows() and self.qtmain:
335
+ if not self._link_with_qt_winmain(is_debug, libdir):
336
+ self.is_found = False
337
+
338
+ def _sanitize_version(self, version: str) -> str:
339
+ m = re.search(rf'({self.qtver}(\.\d+)+)', version)
340
+ if m:
341
+ return m.group(0).rstrip('.')
342
+ return version
343
+
344
+ def get_variable_args(self, variable_name: str) -> T.List[str]:
345
+ return ['-query', f'{variable_name}']
346
+
347
+ @abc.abstractmethod
348
+ def get_private_includes(self, mod_inc_dir: str, module: str) -> T.List[str]:
349
+ pass
350
+
351
+ def _framework_detect(self, qvars: T.Dict[str, str], modules: T.List[str], kwargs: T.Dict[str, T.Any]) -> None:
352
+ libdir = qvars['QT_INSTALL_LIBS']
353
+
354
+ # ExtraFrameworkDependency doesn't support any methods
355
+ fw_kwargs = kwargs.copy()
356
+ fw_kwargs.pop('method', None)
357
+ fw_kwargs['paths'] = [libdir]
358
+
359
+ for m in modules:
360
+ fname = 'Qt' + m
361
+ mlog.debug('Looking for qt framework ' + fname)
362
+ fwdep = QtExtraFrameworkDependency(fname, self.env, fw_kwargs, qvars, language=self.language)
363
+ if fwdep.found():
364
+ self.compile_args.append('-F' + libdir)
365
+ self.compile_args += fwdep.get_compile_args(with_private_headers=self.private_headers,
366
+ qt_version=self.version)
367
+ self.link_args += fwdep.get_link_args()
368
+ else:
369
+ self.is_found = False
370
+ break
371
+ else:
372
+ self.is_found = True
373
+ # Used by self.compilers_detect()
374
+ self.bindir = get_qmake_host_bins(qvars)
375
+ self.libexecdir = get_qmake_host_libexecs(qvars)
376
+
377
+ def log_info(self) -> str:
378
+ return 'qmake'
379
+
380
+
381
+ class Qt6WinMainMixin:
382
+
383
+ def get_qt_winmain_base_name(self, is_debug: bool) -> str:
384
+ return 'Qt6EntryPointd' if is_debug else 'Qt6EntryPoint'
385
+
386
+
387
+ class Qt4ConfigToolDependency(QmakeQtDependency):
388
+
389
+ def get_private_includes(self, mod_inc_dir: str, module: str) -> T.List[str]:
390
+ return []
391
+
392
+
393
+ class Qt5ConfigToolDependency(QmakeQtDependency):
394
+
395
+ def get_private_includes(self, mod_inc_dir: str, module: str) -> T.List[str]:
396
+ return _qt_get_private_includes(mod_inc_dir, module, self.version)
397
+
398
+
399
+ class Qt6ConfigToolDependency(Qt6WinMainMixin, QmakeQtDependency):
400
+
401
+ def get_private_includes(self, mod_inc_dir: str, module: str) -> T.List[str]:
402
+ return _qt_get_private_includes(mod_inc_dir, module, self.version)
403
+
404
+
405
+ class Qt4PkgConfigDependency(QtPkgConfigDependency):
406
+
407
+ @staticmethod
408
+ def get_pkgconfig_host_bins(core: PkgConfigDependency) -> T.Optional[str]:
409
+ # Only return one bins dir, because the tools are generally all in one
410
+ # directory for Qt4, in Qt5, they must all be in one directory. Return
411
+ # the first one found among the bin variables, in case one tool is not
412
+ # configured to be built.
413
+ applications = ['moc', 'uic', 'rcc', 'lupdate', 'lrelease']
414
+ for application in applications:
415
+ try:
416
+ return os.path.dirname(core.get_variable(pkgconfig=f'{application}_location'))
417
+ except mesonlib.MesonException:
418
+ pass
419
+ return None
420
+
421
+ def get_private_includes(self, mod_inc_dir: str, module: str) -> T.List[str]:
422
+ return []
423
+
424
+ @staticmethod
425
+ def get_pkgconfig_host_libexecs(core: PkgConfigDependency) -> str:
426
+ return None
427
+
428
+
429
+ class Qt5PkgConfigDependency(QtPkgConfigDependency):
430
+
431
+ @staticmethod
432
+ def get_pkgconfig_host_bins(core: PkgConfigDependency) -> str:
433
+ return core.get_variable(pkgconfig='host_bins')
434
+
435
+ @staticmethod
436
+ def get_pkgconfig_host_libexecs(core: PkgConfigDependency) -> str:
437
+ return None
438
+
439
+ def get_private_includes(self, mod_inc_dir: str, module: str) -> T.List[str]:
440
+ return _qt_get_private_includes(mod_inc_dir, module, self.version)
441
+
442
+
443
+ class Qt6PkgConfigDependency(Qt6WinMainMixin, QtPkgConfigDependency):
444
+
445
+ def __init__(self, name: str, env: 'Environment', kwargs: T.Dict[str, T.Any]):
446
+ super().__init__(name, env, kwargs)
447
+ if not self.libexecdir:
448
+ mlog.debug(f'detected Qt6 {self.version} pkg-config dependency does not '
449
+ 'have proper tools support, ignoring')
450
+ self.is_found = False
451
+
452
+ @staticmethod
453
+ def get_pkgconfig_host_bins(core: PkgConfigDependency) -> str:
454
+ return core.get_variable(pkgconfig='bindir')
455
+
456
+ @staticmethod
457
+ def get_pkgconfig_host_libexecs(core: PkgConfigDependency) -> str:
458
+ # Qt6 pkg-config for Qt defines libexecdir from 6.3+
459
+ return core.get_variable(pkgconfig='libexecdir')
460
+
461
+ def get_private_includes(self, mod_inc_dir: str, module: str) -> T.List[str]:
462
+ return _qt_get_private_includes(mod_inc_dir, module, self.version)
463
+
464
+
465
+ packages['qt4'] = qt4_factory = DependencyFactory(
466
+ 'qt4',
467
+ [DependencyMethods.PKGCONFIG, DependencyMethods.CONFIG_TOOL],
468
+ pkgconfig_class=Qt4PkgConfigDependency,
469
+ configtool_class=Qt4ConfigToolDependency,
470
+ )
471
+
472
+ packages['qt5'] = qt5_factory = DependencyFactory(
473
+ 'qt5',
474
+ [DependencyMethods.PKGCONFIG, DependencyMethods.CONFIG_TOOL],
475
+ pkgconfig_class=Qt5PkgConfigDependency,
476
+ configtool_class=Qt5ConfigToolDependency,
477
+ )
478
+
479
+ packages['qt6'] = qt6_factory = DependencyFactory(
480
+ 'qt6',
481
+ [DependencyMethods.PKGCONFIG, DependencyMethods.CONFIG_TOOL],
482
+ pkgconfig_class=Qt6PkgConfigDependency,
483
+ configtool_class=Qt6ConfigToolDependency,
484
+ )
@@ -0,0 +1,142 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+ # Copyright 2013-2020 The Meson development team
3
+
4
+ from __future__ import annotations
5
+
6
+ from pathlib import Path
7
+ import functools
8
+ import os
9
+ import typing as T
10
+
11
+ from ..mesonlib import OptionKey
12
+ from .base import DependencyMethods
13
+ from .cmake import CMakeDependency
14
+ from .detect import packages
15
+ from .pkgconfig import PkgConfigDependency
16
+ from .factory import factory_methods
17
+
18
+ if T.TYPE_CHECKING:
19
+ from ..environment import Environment
20
+ from ..mesonlib import MachineChoice
21
+ from .factory import DependencyGenerator
22
+
23
+
24
+ @factory_methods({DependencyMethods.PKGCONFIG, DependencyMethods.CMAKE})
25
+ def scalapack_factory(env: 'Environment', for_machine: 'MachineChoice',
26
+ kwargs: T.Dict[str, T.Any],
27
+ methods: T.List[DependencyMethods]) -> T.List['DependencyGenerator']:
28
+ candidates: T.List['DependencyGenerator'] = []
29
+
30
+ if DependencyMethods.PKGCONFIG in methods:
31
+ static_opt = kwargs.get('static', env.coredata.get_option(OptionKey('prefer_static')))
32
+ mkl = 'mkl-static-lp64-iomp' if static_opt else 'mkl-dynamic-lp64-iomp'
33
+ candidates.append(functools.partial(
34
+ MKLPkgConfigDependency, mkl, env, kwargs))
35
+
36
+ for pkg in ['scalapack-openmpi', 'scalapack']:
37
+ candidates.append(functools.partial(
38
+ PkgConfigDependency, pkg, env, kwargs))
39
+
40
+ if DependencyMethods.CMAKE in methods:
41
+ candidates.append(functools.partial(
42
+ CMakeDependency, 'Scalapack', env, kwargs))
43
+
44
+ return candidates
45
+
46
+ packages['scalapack'] = scalapack_factory
47
+
48
+
49
+ class MKLPkgConfigDependency(PkgConfigDependency):
50
+
51
+ """PkgConfigDependency for Intel MKL.
52
+
53
+ MKL's pkg-config is pretty much borked in every way. We need to apply a
54
+ bunch of fixups to make it work correctly.
55
+ """
56
+
57
+ def __init__(self, name: str, env: 'Environment', kwargs: T.Dict[str, T.Any],
58
+ language: T.Optional[str] = None):
59
+ _m = os.environ.get('MKLROOT')
60
+ self.__mklroot = Path(_m).resolve() if _m else None
61
+
62
+ # We need to call down into the normal super() method even if we don't
63
+ # find mklroot, otherwise we won't have all of the instance variables
64
+ # initialized that meson expects.
65
+ super().__init__(name, env, kwargs, language=language)
66
+
67
+ # Doesn't work with gcc on windows, but does on Linux
68
+ if (not self.__mklroot or (env.machines[self.for_machine].is_windows()
69
+ and self.clib_compiler.id == 'gcc')):
70
+ self.is_found = False
71
+
72
+ # This can happen either because we're using GCC, we couldn't find the
73
+ # mklroot, or the pkg-config couldn't find it.
74
+ if not self.is_found:
75
+ return
76
+
77
+ assert self.version != '', 'This should not happen if we didn\'t return above'
78
+
79
+ if self.version == 'unknown':
80
+ # At least by 2020 the version is in the pkg-config, just not with
81
+ # the correct name
82
+ v = self.get_variable(pkgconfig='Version', default_value='')
83
+
84
+ if not v and self.__mklroot:
85
+ try:
86
+ v = (
87
+ self.__mklroot.as_posix()
88
+ .split('compilers_and_libraries_')[1]
89
+ .split('/', 1)[0]
90
+ )
91
+ except IndexError:
92
+ pass
93
+
94
+ if v:
95
+ assert isinstance(v, str)
96
+ self.version = v
97
+
98
+ def _set_libs(self) -> None:
99
+ super()._set_libs()
100
+
101
+ if self.env.machines[self.for_machine].is_windows():
102
+ suffix = '.lib'
103
+ elif self.static:
104
+ suffix = '.a'
105
+ else:
106
+ suffix = ''
107
+ libdir = self.__mklroot / 'lib/intel64'
108
+
109
+ if self.clib_compiler.id == 'gcc':
110
+ for i, a in enumerate(self.link_args):
111
+ # only replace in filename, not in directory names
112
+ dirname, basename = os.path.split(a)
113
+ if 'mkl_intel_lp64' in basename:
114
+ basename = basename.replace('intel', 'gf')
115
+ self.link_args[i] = '/' + os.path.join(dirname, basename)
116
+ # MKL pkg-config omits scalapack
117
+ # be sure "-L" and "-Wl" are first if present
118
+ i = 0
119
+ for j, a in enumerate(self.link_args):
120
+ if a.startswith(('-L', '-Wl')):
121
+ i = j + 1
122
+ elif j > 3:
123
+ break
124
+ if self.env.machines[self.for_machine].is_windows() or self.static:
125
+ self.link_args.insert(
126
+ i, str(libdir / ('mkl_scalapack_lp64' + suffix))
127
+ )
128
+ self.link_args.insert(
129
+ i + 1, str(libdir / ('mkl_blacs_intelmpi_lp64' + suffix))
130
+ )
131
+ else:
132
+ self.link_args.insert(i, '-lmkl_scalapack_lp64')
133
+ self.link_args.insert(i + 1, '-lmkl_blacs_intelmpi_lp64')
134
+
135
+ def _set_cargs(self) -> None:
136
+ allow_system = False
137
+ if self.language == 'fortran':
138
+ # gfortran doesn't appear to look in system paths for INCLUDE files,
139
+ # so don't allow pkg-config to suppress -I flags for system paths
140
+ allow_system = True
141
+ cflags = self.pkgconfig.cflags(self.name, allow_system, define_variable=(('prefix', self.__mklroot.as_posix()),))
142
+ self.compile_args = self._convert_mingw_paths(cflags)