frida 16.2.1 → 16.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (386) hide show
  1. package/BSDmakefile +6 -0
  2. package/Makefile +16 -0
  3. package/README.md +14 -11
  4. package/configure +18 -0
  5. package/configure.bat +22 -0
  6. package/dist/native.js +0 -8
  7. package/lib/application.ts +98 -0
  8. package/lib/authentication.ts +3 -0
  9. package/lib/build.py +50 -0
  10. package/lib/bus.ts +30 -0
  11. package/lib/cancellable.ts +33 -0
  12. package/lib/child.ts +15 -0
  13. package/lib/crash.ts +11 -0
  14. package/lib/device.ts +329 -0
  15. package/lib/device_manager.ts +69 -0
  16. package/lib/endpoint_parameters.ts +56 -0
  17. package/lib/icon.ts +15 -0
  18. package/lib/index.ts +311 -0
  19. package/lib/iostream.ts +78 -0
  20. package/lib/meson.build +53 -0
  21. package/lib/native.ts +9 -0
  22. package/lib/portal_membership.ts +10 -0
  23. package/lib/portal_service.ts +105 -0
  24. package/lib/process.ts +57 -0
  25. package/lib/relay.ts +44 -0
  26. package/lib/script.ts +352 -0
  27. package/lib/session.ts +113 -0
  28. package/lib/signals.ts +45 -0
  29. package/lib/socket_address.ts +35 -0
  30. package/lib/spawn.ts +4 -0
  31. package/lib/system_parameters.ts +78 -0
  32. package/make.bat +23 -0
  33. package/meson.build +160 -0
  34. package/meson.options +11 -0
  35. package/package.json +27 -6
  36. package/releng/deps.py +1133 -0
  37. package/releng/deps.toml +391 -0
  38. package/releng/devkit-assets/frida-core-example-unix.c +188 -0
  39. package/releng/devkit-assets/frida-core-example-windows.c +197 -0
  40. package/releng/devkit-assets/frida-core-example.sln +28 -0
  41. package/releng/devkit-assets/frida-core-example.vcxproj +157 -0
  42. package/releng/devkit-assets/frida-core-example.vcxproj.filters +27 -0
  43. package/releng/devkit-assets/frida-gum-example-unix.c +122 -0
  44. package/releng/devkit-assets/frida-gum-example-windows.c +132 -0
  45. package/releng/devkit-assets/frida-gum-example.sln +28 -0
  46. package/releng/devkit-assets/frida-gum-example.vcxproj +157 -0
  47. package/releng/devkit-assets/frida-gum-example.vcxproj.filters +27 -0
  48. package/releng/devkit-assets/frida-gumjs-example-unix.c +84 -0
  49. package/releng/devkit-assets/frida-gumjs-example-windows.c +91 -0
  50. package/releng/devkit-assets/frida-gumjs-example.sln +28 -0
  51. package/releng/devkit-assets/frida-gumjs-example.vcxproj +157 -0
  52. package/releng/devkit-assets/frida-gumjs-example.vcxproj.filters +27 -0
  53. package/releng/devkit.py +535 -0
  54. package/releng/env.py +420 -0
  55. package/releng/env_android.py +150 -0
  56. package/releng/env_apple.py +176 -0
  57. package/releng/env_generic.py +373 -0
  58. package/releng/frida_version.py +69 -0
  59. package/releng/machine_file.py +44 -0
  60. package/releng/machine_spec.py +290 -0
  61. package/releng/meson/meson.py +27 -0
  62. package/releng/meson/mesonbuild/__init__.py +0 -0
  63. package/releng/meson/mesonbuild/_pathlib.py +63 -0
  64. package/releng/meson/mesonbuild/_typing.py +69 -0
  65. package/releng/meson/mesonbuild/arglist.py +321 -0
  66. package/releng/meson/mesonbuild/ast/__init__.py +23 -0
  67. package/releng/meson/mesonbuild/ast/interpreter.py +441 -0
  68. package/releng/meson/mesonbuild/ast/introspection.py +374 -0
  69. package/releng/meson/mesonbuild/ast/postprocess.py +109 -0
  70. package/releng/meson/mesonbuild/ast/printer.py +620 -0
  71. package/releng/meson/mesonbuild/ast/visitor.py +161 -0
  72. package/releng/meson/mesonbuild/backend/__init__.py +0 -0
  73. package/releng/meson/mesonbuild/backend/backends.py +2047 -0
  74. package/releng/meson/mesonbuild/backend/ninjabackend.py +3808 -0
  75. package/releng/meson/mesonbuild/backend/nonebackend.py +26 -0
  76. package/releng/meson/mesonbuild/backend/vs2010backend.py +2078 -0
  77. package/releng/meson/mesonbuild/backend/vs2012backend.py +35 -0
  78. package/releng/meson/mesonbuild/backend/vs2013backend.py +34 -0
  79. package/releng/meson/mesonbuild/backend/vs2015backend.py +35 -0
  80. package/releng/meson/mesonbuild/backend/vs2017backend.py +59 -0
  81. package/releng/meson/mesonbuild/backend/vs2019backend.py +54 -0
  82. package/releng/meson/mesonbuild/backend/vs2022backend.py +54 -0
  83. package/releng/meson/mesonbuild/backend/xcodebackend.py +1781 -0
  84. package/releng/meson/mesonbuild/build.py +3249 -0
  85. package/releng/meson/mesonbuild/cargo/__init__.py +5 -0
  86. package/releng/meson/mesonbuild/cargo/builder.py +238 -0
  87. package/releng/meson/mesonbuild/cargo/cfg.py +274 -0
  88. package/releng/meson/mesonbuild/cargo/interpreter.py +733 -0
  89. package/releng/meson/mesonbuild/cargo/manifest.py +227 -0
  90. package/releng/meson/mesonbuild/cargo/version.py +95 -0
  91. package/releng/meson/mesonbuild/cmake/__init__.py +28 -0
  92. package/releng/meson/mesonbuild/cmake/common.py +331 -0
  93. package/releng/meson/mesonbuild/cmake/data/__init__.py +0 -0
  94. package/releng/meson/mesonbuild/cmake/data/preload.cmake +82 -0
  95. package/releng/meson/mesonbuild/cmake/executor.py +241 -0
  96. package/releng/meson/mesonbuild/cmake/fileapi.py +324 -0
  97. package/releng/meson/mesonbuild/cmake/generator.py +186 -0
  98. package/releng/meson/mesonbuild/cmake/interpreter.py +1267 -0
  99. package/releng/meson/mesonbuild/cmake/toolchain.py +248 -0
  100. package/releng/meson/mesonbuild/cmake/traceparser.py +814 -0
  101. package/releng/meson/mesonbuild/cmake/tracetargets.py +161 -0
  102. package/releng/meson/mesonbuild/compilers/__init__.py +86 -0
  103. package/releng/meson/mesonbuild/compilers/asm.py +307 -0
  104. package/releng/meson/mesonbuild/compilers/c.py +788 -0
  105. package/releng/meson/mesonbuild/compilers/c_function_attributes.py +143 -0
  106. package/releng/meson/mesonbuild/compilers/compilers.py +1388 -0
  107. package/releng/meson/mesonbuild/compilers/cpp.py +1035 -0
  108. package/releng/meson/mesonbuild/compilers/cs.py +136 -0
  109. package/releng/meson/mesonbuild/compilers/cuda.py +806 -0
  110. package/releng/meson/mesonbuild/compilers/cython.py +91 -0
  111. package/releng/meson/mesonbuild/compilers/d.py +861 -0
  112. package/releng/meson/mesonbuild/compilers/detect.py +1396 -0
  113. package/releng/meson/mesonbuild/compilers/fortran.py +523 -0
  114. package/releng/meson/mesonbuild/compilers/java.py +113 -0
  115. package/releng/meson/mesonbuild/compilers/mixins/__init__.py +0 -0
  116. package/releng/meson/mesonbuild/compilers/mixins/arm.py +167 -0
  117. package/releng/meson/mesonbuild/compilers/mixins/ccrx.py +113 -0
  118. package/releng/meson/mesonbuild/compilers/mixins/clang.py +170 -0
  119. package/releng/meson/mesonbuild/compilers/mixins/clike.py +1330 -0
  120. package/releng/meson/mesonbuild/compilers/mixins/compcert.py +117 -0
  121. package/releng/meson/mesonbuild/compilers/mixins/elbrus.py +93 -0
  122. package/releng/meson/mesonbuild/compilers/mixins/emscripten.py +89 -0
  123. package/releng/meson/mesonbuild/compilers/mixins/gnu.py +629 -0
  124. package/releng/meson/mesonbuild/compilers/mixins/intel.py +167 -0
  125. package/releng/meson/mesonbuild/compilers/mixins/islinker.py +120 -0
  126. package/releng/meson/mesonbuild/compilers/mixins/metrowerks.py +279 -0
  127. package/releng/meson/mesonbuild/compilers/mixins/pgi.py +88 -0
  128. package/releng/meson/mesonbuild/compilers/mixins/ti.py +130 -0
  129. package/releng/meson/mesonbuild/compilers/mixins/visualstudio.py +458 -0
  130. package/releng/meson/mesonbuild/compilers/mixins/xc16.py +111 -0
  131. package/releng/meson/mesonbuild/compilers/objc.py +120 -0
  132. package/releng/meson/mesonbuild/compilers/objcpp.py +102 -0
  133. package/releng/meson/mesonbuild/compilers/rust.py +230 -0
  134. package/releng/meson/mesonbuild/compilers/swift.py +131 -0
  135. package/releng/meson/mesonbuild/compilers/vala.py +121 -0
  136. package/releng/meson/mesonbuild/coredata.py +1532 -0
  137. package/releng/meson/mesonbuild/dependencies/__init__.py +252 -0
  138. package/releng/meson/mesonbuild/dependencies/base.py +663 -0
  139. package/releng/meson/mesonbuild/dependencies/boost.py +1083 -0
  140. package/releng/meson/mesonbuild/dependencies/cmake.py +656 -0
  141. package/releng/meson/mesonbuild/dependencies/coarrays.py +80 -0
  142. package/releng/meson/mesonbuild/dependencies/configtool.py +163 -0
  143. package/releng/meson/mesonbuild/dependencies/cuda.py +295 -0
  144. package/releng/meson/mesonbuild/dependencies/data/CMakeLists.txt +102 -0
  145. package/releng/meson/mesonbuild/dependencies/data/CMakeListsLLVM.txt +204 -0
  146. package/releng/meson/mesonbuild/dependencies/data/CMakePathInfo.txt +31 -0
  147. package/releng/meson/mesonbuild/dependencies/data/__init__.py +0 -0
  148. package/releng/meson/mesonbuild/dependencies/detect.py +225 -0
  149. package/releng/meson/mesonbuild/dependencies/dev.py +707 -0
  150. package/releng/meson/mesonbuild/dependencies/dub.py +424 -0
  151. package/releng/meson/mesonbuild/dependencies/factory.py +146 -0
  152. package/releng/meson/mesonbuild/dependencies/framework.py +111 -0
  153. package/releng/meson/mesonbuild/dependencies/hdf5.py +168 -0
  154. package/releng/meson/mesonbuild/dependencies/misc.py +618 -0
  155. package/releng/meson/mesonbuild/dependencies/mpi.py +231 -0
  156. package/releng/meson/mesonbuild/dependencies/pkgconfig.py +570 -0
  157. package/releng/meson/mesonbuild/dependencies/platform.py +52 -0
  158. package/releng/meson/mesonbuild/dependencies/python.py +431 -0
  159. package/releng/meson/mesonbuild/dependencies/qt.py +484 -0
  160. package/releng/meson/mesonbuild/dependencies/scalapack.py +142 -0
  161. package/releng/meson/mesonbuild/dependencies/ui.py +281 -0
  162. package/releng/meson/mesonbuild/depfile.py +82 -0
  163. package/releng/meson/mesonbuild/envconfig.py +480 -0
  164. package/releng/meson/mesonbuild/environment.py +987 -0
  165. package/releng/meson/mesonbuild/interpreter/__init__.py +47 -0
  166. package/releng/meson/mesonbuild/interpreter/compiler.py +900 -0
  167. package/releng/meson/mesonbuild/interpreter/dependencyfallbacks.py +386 -0
  168. package/releng/meson/mesonbuild/interpreter/interpreter.py +3595 -0
  169. package/releng/meson/mesonbuild/interpreter/interpreterobjects.py +1096 -0
  170. package/releng/meson/mesonbuild/interpreter/kwargs.py +479 -0
  171. package/releng/meson/mesonbuild/interpreter/mesonmain.py +487 -0
  172. package/releng/meson/mesonbuild/interpreter/primitives/__init__.py +29 -0
  173. package/releng/meson/mesonbuild/interpreter/primitives/array.py +108 -0
  174. package/releng/meson/mesonbuild/interpreter/primitives/boolean.py +52 -0
  175. package/releng/meson/mesonbuild/interpreter/primitives/dict.py +88 -0
  176. package/releng/meson/mesonbuild/interpreter/primitives/integer.py +86 -0
  177. package/releng/meson/mesonbuild/interpreter/primitives/range.py +38 -0
  178. package/releng/meson/mesonbuild/interpreter/primitives/string.py +247 -0
  179. package/releng/meson/mesonbuild/interpreter/type_checking.py +853 -0
  180. package/releng/meson/mesonbuild/interpreterbase/__init__.py +126 -0
  181. package/releng/meson/mesonbuild/interpreterbase/_unholder.py +25 -0
  182. package/releng/meson/mesonbuild/interpreterbase/baseobjects.py +174 -0
  183. package/releng/meson/mesonbuild/interpreterbase/decorators.py +806 -0
  184. package/releng/meson/mesonbuild/interpreterbase/disabler.py +35 -0
  185. package/releng/meson/mesonbuild/interpreterbase/exceptions.py +22 -0
  186. package/releng/meson/mesonbuild/interpreterbase/helpers.py +67 -0
  187. package/releng/meson/mesonbuild/interpreterbase/interpreterbase.py +665 -0
  188. package/releng/meson/mesonbuild/interpreterbase/operator.py +32 -0
  189. package/releng/meson/mesonbuild/linkers/__init__.py +20 -0
  190. package/releng/meson/mesonbuild/linkers/base.py +39 -0
  191. package/releng/meson/mesonbuild/linkers/detect.py +229 -0
  192. package/releng/meson/mesonbuild/linkers/linkers.py +1614 -0
  193. package/releng/meson/mesonbuild/mcompile.py +380 -0
  194. package/releng/meson/mesonbuild/mconf.py +368 -0
  195. package/releng/meson/mesonbuild/mdevenv.py +234 -0
  196. package/releng/meson/mesonbuild/mdist.py +376 -0
  197. package/releng/meson/mesonbuild/mesondata.py +38 -0
  198. package/releng/meson/mesonbuild/mesonlib.py +23 -0
  199. package/releng/meson/mesonbuild/mesonmain.py +289 -0
  200. package/releng/meson/mesonbuild/minit.py +204 -0
  201. package/releng/meson/mesonbuild/minstall.py +864 -0
  202. package/releng/meson/mesonbuild/mintro.py +667 -0
  203. package/releng/meson/mesonbuild/mlog.py +542 -0
  204. package/releng/meson/mesonbuild/modules/__init__.py +270 -0
  205. package/releng/meson/mesonbuild/modules/cmake.py +442 -0
  206. package/releng/meson/mesonbuild/modules/cuda.py +377 -0
  207. package/releng/meson/mesonbuild/modules/dlang.py +117 -0
  208. package/releng/meson/mesonbuild/modules/external_project.py +306 -0
  209. package/releng/meson/mesonbuild/modules/fs.py +323 -0
  210. package/releng/meson/mesonbuild/modules/gnome.py +2215 -0
  211. package/releng/meson/mesonbuild/modules/hotdoc.py +487 -0
  212. package/releng/meson/mesonbuild/modules/i18n.py +405 -0
  213. package/releng/meson/mesonbuild/modules/icestorm.py +123 -0
  214. package/releng/meson/mesonbuild/modules/java.py +112 -0
  215. package/releng/meson/mesonbuild/modules/keyval.py +65 -0
  216. package/releng/meson/mesonbuild/modules/modtest.py +33 -0
  217. package/releng/meson/mesonbuild/modules/pkgconfig.py +744 -0
  218. package/releng/meson/mesonbuild/modules/python.py +556 -0
  219. package/releng/meson/mesonbuild/modules/python3.py +85 -0
  220. package/releng/meson/mesonbuild/modules/qt.py +621 -0
  221. package/releng/meson/mesonbuild/modules/qt4.py +23 -0
  222. package/releng/meson/mesonbuild/modules/qt5.py +23 -0
  223. package/releng/meson/mesonbuild/modules/qt6.py +22 -0
  224. package/releng/meson/mesonbuild/modules/rust.py +355 -0
  225. package/releng/meson/mesonbuild/modules/simd.py +114 -0
  226. package/releng/meson/mesonbuild/modules/sourceset.py +291 -0
  227. package/releng/meson/mesonbuild/modules/wayland.py +151 -0
  228. package/releng/meson/mesonbuild/modules/windows.py +207 -0
  229. package/releng/meson/mesonbuild/mparser.py +1114 -0
  230. package/releng/meson/mesonbuild/msetup.py +365 -0
  231. package/releng/meson/mesonbuild/msubprojects.py +764 -0
  232. package/releng/meson/mesonbuild/mtest.py +2201 -0
  233. package/releng/meson/mesonbuild/munstable_coredata.py +107 -0
  234. package/releng/meson/mesonbuild/optinterpreter.py +276 -0
  235. package/releng/meson/mesonbuild/programs.py +367 -0
  236. package/releng/meson/mesonbuild/rewriter.py +1075 -0
  237. package/releng/meson/mesonbuild/scripts/__init__.py +10 -0
  238. package/releng/meson/mesonbuild/scripts/clangformat.py +55 -0
  239. package/releng/meson/mesonbuild/scripts/clangtidy.py +30 -0
  240. package/releng/meson/mesonbuild/scripts/cleantrees.py +35 -0
  241. package/releng/meson/mesonbuild/scripts/cmake_run_ctgt.py +103 -0
  242. package/releng/meson/mesonbuild/scripts/cmd_or_ps.ps1 +17 -0
  243. package/releng/meson/mesonbuild/scripts/copy.py +19 -0
  244. package/releng/meson/mesonbuild/scripts/coverage.py +214 -0
  245. package/releng/meson/mesonbuild/scripts/delwithsuffix.py +27 -0
  246. package/releng/meson/mesonbuild/scripts/depfixer.py +495 -0
  247. package/releng/meson/mesonbuild/scripts/depscan.py +198 -0
  248. package/releng/meson/mesonbuild/scripts/dirchanger.py +20 -0
  249. package/releng/meson/mesonbuild/scripts/env2mfile.py +402 -0
  250. package/releng/meson/mesonbuild/scripts/externalproject.py +106 -0
  251. package/releng/meson/mesonbuild/scripts/gettext.py +86 -0
  252. package/releng/meson/mesonbuild/scripts/gtkdochelper.py +286 -0
  253. package/releng/meson/mesonbuild/scripts/hotdochelper.py +40 -0
  254. package/releng/meson/mesonbuild/scripts/itstool.py +77 -0
  255. package/releng/meson/mesonbuild/scripts/meson_exe.py +115 -0
  256. package/releng/meson/mesonbuild/scripts/msgfmthelper.py +29 -0
  257. package/releng/meson/mesonbuild/scripts/pycompile.py +54 -0
  258. package/releng/meson/mesonbuild/scripts/python_info.py +121 -0
  259. package/releng/meson/mesonbuild/scripts/regen_checker.py +55 -0
  260. package/releng/meson/mesonbuild/scripts/run_tool.py +58 -0
  261. package/releng/meson/mesonbuild/scripts/scanbuild.py +57 -0
  262. package/releng/meson/mesonbuild/scripts/symbolextractor.py +322 -0
  263. package/releng/meson/mesonbuild/scripts/tags.py +44 -0
  264. package/releng/meson/mesonbuild/scripts/test_loaded_modules.py +14 -0
  265. package/releng/meson/mesonbuild/scripts/uninstall.py +41 -0
  266. package/releng/meson/mesonbuild/scripts/vcstagger.py +35 -0
  267. package/releng/meson/mesonbuild/scripts/yasm.py +24 -0
  268. package/releng/meson/mesonbuild/templates/__init__.py +0 -0
  269. package/releng/meson/mesonbuild/templates/cpptemplates.py +143 -0
  270. package/releng/meson/mesonbuild/templates/cstemplates.py +90 -0
  271. package/releng/meson/mesonbuild/templates/ctemplates.py +126 -0
  272. package/releng/meson/mesonbuild/templates/cudatemplates.py +143 -0
  273. package/releng/meson/mesonbuild/templates/dlangtemplates.py +109 -0
  274. package/releng/meson/mesonbuild/templates/fortrantemplates.py +101 -0
  275. package/releng/meson/mesonbuild/templates/javatemplates.py +94 -0
  276. package/releng/meson/mesonbuild/templates/mesontemplates.py +70 -0
  277. package/releng/meson/mesonbuild/templates/objcpptemplates.py +126 -0
  278. package/releng/meson/mesonbuild/templates/objctemplates.py +126 -0
  279. package/releng/meson/mesonbuild/templates/rusttemplates.py +79 -0
  280. package/releng/meson/mesonbuild/templates/samplefactory.py +41 -0
  281. package/releng/meson/mesonbuild/templates/sampleimpl.py +160 -0
  282. package/releng/meson/mesonbuild/templates/valatemplates.py +82 -0
  283. package/releng/meson/mesonbuild/utils/__init__.py +0 -0
  284. package/releng/meson/mesonbuild/utils/core.py +166 -0
  285. package/releng/meson/mesonbuild/utils/platform.py +27 -0
  286. package/releng/meson/mesonbuild/utils/posix.py +32 -0
  287. package/releng/meson/mesonbuild/utils/universal.py +2445 -0
  288. package/releng/meson/mesonbuild/utils/vsenv.py +126 -0
  289. package/releng/meson/mesonbuild/utils/win32.py +29 -0
  290. package/releng/meson/mesonbuild/wrap/__init__.py +59 -0
  291. package/releng/meson/mesonbuild/wrap/wrap.py +846 -0
  292. package/releng/meson/mesonbuild/wrap/wraptool.py +198 -0
  293. package/releng/meson-scripts/BSDmakefile +6 -0
  294. package/releng/meson-scripts/Makefile +16 -0
  295. package/releng/meson-scripts/configure +18 -0
  296. package/releng/meson-scripts/configure.bat +22 -0
  297. package/releng/meson-scripts/make.bat +23 -0
  298. package/releng/meson_configure.py +506 -0
  299. package/releng/meson_make.py +131 -0
  300. package/releng/mkdevkit.py +107 -0
  301. package/releng/mkfatmacho.py +54 -0
  302. package/releng/post-process-oabi.py +97 -0
  303. package/releng/progress.py +14 -0
  304. package/releng/sync-from-upstream.py +185 -0
  305. package/releng/tomlkit/tomlkit/__init__.py +59 -0
  306. package/releng/tomlkit/tomlkit/_compat.py +22 -0
  307. package/releng/tomlkit/tomlkit/_types.py +83 -0
  308. package/releng/tomlkit/tomlkit/_utils.py +158 -0
  309. package/releng/tomlkit/tomlkit/api.py +308 -0
  310. package/releng/tomlkit/tomlkit/container.py +875 -0
  311. package/releng/tomlkit/tomlkit/exceptions.py +227 -0
  312. package/releng/tomlkit/tomlkit/items.py +1967 -0
  313. package/releng/tomlkit/tomlkit/parser.py +1141 -0
  314. package/releng/tomlkit/tomlkit/py.typed +0 -0
  315. package/releng/tomlkit/tomlkit/source.py +180 -0
  316. package/releng/tomlkit/tomlkit/toml_char.py +52 -0
  317. package/releng/tomlkit/tomlkit/toml_document.py +7 -0
  318. package/releng/tomlkit/tomlkit/toml_file.py +58 -0
  319. package/releng/winenv.py +140 -0
  320. package/scripts/adjust-version.py +19 -0
  321. package/scripts/detect-version.py +40 -0
  322. package/scripts/fetch-abi-bits.py +343 -0
  323. package/scripts/install.js +23 -0
  324. package/scripts/package.py +15 -0
  325. package/src/addon.cc +76 -0
  326. package/src/application.cc +148 -0
  327. package/src/application.h +31 -0
  328. package/src/authentication.cc +174 -0
  329. package/src/authentication.h +24 -0
  330. package/src/bus.cc +167 -0
  331. package/src/bus.h +33 -0
  332. package/src/cancellable.cc +117 -0
  333. package/src/cancellable.h +31 -0
  334. package/src/child.cc +150 -0
  335. package/src/child.h +32 -0
  336. package/src/crash.cc +122 -0
  337. package/src/crash.h +30 -0
  338. package/src/device.cc +1302 -0
  339. package/src/device.h +55 -0
  340. package/src/device_manager.cc +362 -0
  341. package/src/device_manager.h +35 -0
  342. package/src/endpoint_parameters.cc +171 -0
  343. package/src/endpoint_parameters.h +28 -0
  344. package/src/glib_context.cc +62 -0
  345. package/src/glib_context.h +29 -0
  346. package/src/glib_object.cc +25 -0
  347. package/src/glib_object.h +37 -0
  348. package/src/iostream.cc +247 -0
  349. package/src/iostream.h +30 -0
  350. package/src/meson.build +26 -0
  351. package/src/operation.h +94 -0
  352. package/src/portal_membership.cc +100 -0
  353. package/src/portal_membership.h +26 -0
  354. package/src/portal_service.cc +401 -0
  355. package/src/portal_service.h +40 -0
  356. package/src/process.cc +135 -0
  357. package/src/process.h +30 -0
  358. package/src/relay.cc +139 -0
  359. package/src/relay.h +31 -0
  360. package/src/runtime.cc +443 -0
  361. package/src/runtime.h +64 -0
  362. package/src/script.cc +301 -0
  363. package/src/script.h +36 -0
  364. package/src/session.cc +860 -0
  365. package/src/session.h +42 -0
  366. package/src/signals.cc +334 -0
  367. package/src/signals.h +47 -0
  368. package/src/spawn.cc +95 -0
  369. package/src/spawn.h +27 -0
  370. package/src/usage_monitor.h +117 -0
  371. package/src/uv_context.cc +118 -0
  372. package/src/uv_context.h +40 -0
  373. package/src/win_delay_load_hook.cc +63 -0
  374. package/subprojects/frida-core.wrap +8 -0
  375. package/subprojects/nan.wrap +9 -0
  376. package/subprojects/packagefiles/nan.patch +13 -0
  377. package/test/data/index.ts +13 -0
  378. package/test/data/unixvictim-linux-x86 +0 -0
  379. package/test/data/unixvictim-linux-x86_64 +0 -0
  380. package/test/data/unixvictim-macos +0 -0
  381. package/test/device.ts +27 -0
  382. package/test/device_manager.ts +16 -0
  383. package/test/labrat.ts +32 -0
  384. package/test/script.ts +176 -0
  385. package/test/session.ts +73 -0
  386. package/tsconfig.json +18 -0
@@ -0,0 +1,707 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+ # Copyright 2013-2019 The Meson development team
3
+
4
+ from __future__ import annotations
5
+
6
+ import glob
7
+ import os
8
+ import re
9
+ import pathlib
10
+ import shutil
11
+ import subprocess
12
+ import typing as T
13
+ import functools
14
+
15
+ from mesonbuild.interpreterbase.decorators import FeatureDeprecated
16
+
17
+ from .. import mesonlib, mlog
18
+ from ..environment import get_llvm_tool_names
19
+ from ..mesonlib import version_compare, version_compare_many, search_version, stringlistify, extract_as_list
20
+ from .base import DependencyException, DependencyMethods, detect_compiler, strip_system_includedirs, strip_system_libdirs, SystemDependency, ExternalDependency, DependencyTypeName
21
+ from .cmake import CMakeDependency
22
+ from .configtool import ConfigToolDependency
23
+ from .detect import packages
24
+ from .factory import DependencyFactory
25
+ from .misc import threads_factory
26
+ from .pkgconfig import PkgConfigDependency
27
+
28
+ if T.TYPE_CHECKING:
29
+ from ..envconfig import MachineInfo
30
+ from ..environment import Environment
31
+ from ..mesonlib import MachineChoice
32
+ from typing_extensions import TypedDict
33
+
34
+ class JNISystemDependencyKW(TypedDict):
35
+ modules: T.List[str]
36
+ # FIXME: When dependency() moves to typed Kwargs, this should inherit
37
+ # from its TypedDict type.
38
+ version: T.Optional[str]
39
+
40
+
41
+ def get_shared_library_suffix(environment: 'Environment', for_machine: MachineChoice) -> str:
42
+ """This is only guaranteed to work for languages that compile to machine
43
+ code, not for languages like C# that use a bytecode and always end in .dll
44
+ """
45
+ m = environment.machines[for_machine]
46
+ if m.is_windows():
47
+ return '.dll'
48
+ elif m.is_darwin():
49
+ return '.dylib'
50
+ return '.so'
51
+
52
+
53
+ class GTestDependencySystem(SystemDependency):
54
+ def __init__(self, name: str, environment: 'Environment', kwargs: T.Dict[str, T.Any]) -> None:
55
+ super().__init__(name, environment, kwargs, language='cpp')
56
+ self.main = kwargs.get('main', False)
57
+ self.src_dirs = ['/usr/src/gtest/src', '/usr/src/googletest/googletest/src']
58
+ if not self._add_sub_dependency(threads_factory(environment, self.for_machine, {})):
59
+ self.is_found = False
60
+ return
61
+ self.detect()
62
+
63
+ def detect(self) -> None:
64
+ gtest_detect = self.clib_compiler.find_library("gtest", self.env, [])
65
+ gtest_main_detect = self.clib_compiler.find_library("gtest_main", self.env, [])
66
+ if gtest_detect and (not self.main or gtest_main_detect):
67
+ self.is_found = True
68
+ self.compile_args = []
69
+ self.link_args = gtest_detect
70
+ if self.main:
71
+ self.link_args += gtest_main_detect
72
+ self.sources = []
73
+ self.prebuilt = True
74
+ elif self.detect_srcdir():
75
+ self.is_found = True
76
+ self.compile_args = ['-I' + d for d in self.src_include_dirs]
77
+ self.link_args = []
78
+ if self.main:
79
+ self.sources = [self.all_src, self.main_src]
80
+ else:
81
+ self.sources = [self.all_src]
82
+ self.prebuilt = False
83
+ else:
84
+ self.is_found = False
85
+
86
+ def detect_srcdir(self) -> bool:
87
+ for s in self.src_dirs:
88
+ if os.path.exists(s):
89
+ self.src_dir = s
90
+ self.all_src = mesonlib.File.from_absolute_file(
91
+ os.path.join(self.src_dir, 'gtest-all.cc'))
92
+ self.main_src = mesonlib.File.from_absolute_file(
93
+ os.path.join(self.src_dir, 'gtest_main.cc'))
94
+ self.src_include_dirs = [os.path.normpath(os.path.join(self.src_dir, '..')),
95
+ os.path.normpath(os.path.join(self.src_dir, '../include')),
96
+ ]
97
+ return True
98
+ return False
99
+
100
+ def log_info(self) -> str:
101
+ if self.prebuilt:
102
+ return 'prebuilt'
103
+ else:
104
+ return 'building self'
105
+
106
+
107
+ class GTestDependencyPC(PkgConfigDependency):
108
+
109
+ def __init__(self, name: str, environment: 'Environment', kwargs: T.Dict[str, T.Any]):
110
+ assert name == 'gtest'
111
+ if kwargs.get('main'):
112
+ name = 'gtest_main'
113
+ super().__init__(name, environment, kwargs)
114
+
115
+
116
+ class GMockDependencySystem(SystemDependency):
117
+ def __init__(self, name: str, environment: 'Environment', kwargs: T.Dict[str, T.Any]) -> None:
118
+ super().__init__(name, environment, kwargs, language='cpp')
119
+ self.main = kwargs.get('main', False)
120
+ if not self._add_sub_dependency(threads_factory(environment, self.for_machine, {})):
121
+ self.is_found = False
122
+ return
123
+
124
+ # If we are getting main() from GMock, we definitely
125
+ # want to avoid linking in main() from GTest
126
+ gtest_kwargs = kwargs.copy()
127
+ if self.main:
128
+ gtest_kwargs['main'] = False
129
+
130
+ # GMock without GTest is pretty much useless
131
+ # this also mimics the structure given in WrapDB,
132
+ # where GMock always pulls in GTest
133
+ found = self._add_sub_dependency(gtest_factory(environment, self.for_machine, gtest_kwargs))
134
+ if not found:
135
+ self.is_found = False
136
+ return
137
+
138
+ # GMock may be a library or just source.
139
+ # Work with both.
140
+ gmock_detect = self.clib_compiler.find_library("gmock", self.env, [])
141
+ gmock_main_detect = self.clib_compiler.find_library("gmock_main", self.env, [])
142
+ if gmock_detect and (not self.main or gmock_main_detect):
143
+ self.is_found = True
144
+ self.link_args += gmock_detect
145
+ if self.main:
146
+ self.link_args += gmock_main_detect
147
+ self.prebuilt = True
148
+ return
149
+
150
+ for d in ['/usr/src/googletest/googlemock/src', '/usr/src/gmock/src', '/usr/src/gmock']:
151
+ if os.path.exists(d):
152
+ self.is_found = True
153
+ # Yes, we need both because there are multiple
154
+ # versions of gmock that do different things.
155
+ d2 = os.path.normpath(os.path.join(d, '..'))
156
+ self.compile_args += ['-I' + d, '-I' + d2, '-I' + os.path.join(d2, 'include')]
157
+ all_src = mesonlib.File.from_absolute_file(os.path.join(d, 'gmock-all.cc'))
158
+ main_src = mesonlib.File.from_absolute_file(os.path.join(d, 'gmock_main.cc'))
159
+ if self.main:
160
+ self.sources += [all_src, main_src]
161
+ else:
162
+ self.sources += [all_src]
163
+ self.prebuilt = False
164
+ return
165
+
166
+ self.is_found = False
167
+
168
+ def log_info(self) -> str:
169
+ if self.prebuilt:
170
+ return 'prebuilt'
171
+ else:
172
+ return 'building self'
173
+
174
+
175
+ class GMockDependencyPC(PkgConfigDependency):
176
+
177
+ def __init__(self, name: str, environment: 'Environment', kwargs: T.Dict[str, T.Any]):
178
+ assert name == 'gmock'
179
+ if kwargs.get('main'):
180
+ name = 'gmock_main'
181
+ super().__init__(name, environment, kwargs)
182
+
183
+
184
+ class LLVMDependencyConfigTool(ConfigToolDependency):
185
+ """
186
+ LLVM uses a special tool, llvm-config, which has arguments for getting
187
+ c args, cxx args, and ldargs as well as version.
188
+ """
189
+ tool_name = 'llvm-config'
190
+ __cpp_blacklist = {'-DNDEBUG'}
191
+
192
+ def __init__(self, name: str, environment: 'Environment', kwargs: T.Dict[str, T.Any]):
193
+ self.tools = get_llvm_tool_names('llvm-config')
194
+
195
+ # Fedora starting with Fedora 30 adds a suffix of the number
196
+ # of bits in the isa that llvm targets, for example, on x86_64
197
+ # and aarch64 the name will be llvm-config-64, on x86 and arm
198
+ # it will be llvm-config-32.
199
+ if environment.machines[self.get_for_machine_from_kwargs(kwargs)].is_64_bit:
200
+ self.tools.append('llvm-config-64')
201
+ else:
202
+ self.tools.append('llvm-config-32')
203
+
204
+ # It's necessary for LLVM <= 3.8 to use the C++ linker. For 3.9 and 4.0
205
+ # the C linker works fine if only using the C API.
206
+ super().__init__(name, environment, kwargs, language='cpp')
207
+ self.provided_modules: T.List[str] = []
208
+ self.required_modules: mesonlib.OrderedSet[str] = mesonlib.OrderedSet()
209
+ self.module_details: T.List[str] = []
210
+ if not self.is_found:
211
+ return
212
+
213
+ self.provided_modules = self.get_config_value(['--components'], 'modules')
214
+ modules = stringlistify(extract_as_list(kwargs, 'modules'))
215
+ self.check_components(modules)
216
+ opt_modules = stringlistify(extract_as_list(kwargs, 'optional_modules'))
217
+ self.check_components(opt_modules, required=False)
218
+
219
+ cargs = mesonlib.OrderedSet(self.get_config_value(['--cppflags'], 'compile_args'))
220
+ self.compile_args = list(cargs.difference(self.__cpp_blacklist))
221
+ self.compile_args = strip_system_includedirs(environment, self.for_machine, self.compile_args)
222
+
223
+ if version_compare(self.version, '>= 3.9'):
224
+ self._set_new_link_args(environment)
225
+ else:
226
+ self._set_old_link_args()
227
+ self.link_args = strip_system_libdirs(environment, self.for_machine, self.link_args)
228
+ self.link_args = self.__fix_bogus_link_args(self.link_args)
229
+ if not self._add_sub_dependency(threads_factory(environment, self.for_machine, {})):
230
+ self.is_found = False
231
+ return
232
+
233
+ def __fix_bogus_link_args(self, args: T.List[str]) -> T.List[str]:
234
+ """This function attempts to fix bogus link arguments that llvm-config
235
+ generates.
236
+
237
+ Currently it works around the following:
238
+ - FreeBSD: when statically linking -l/usr/lib/libexecinfo.so will
239
+ be generated, strip the -l in cases like this.
240
+ - Windows: We may get -LIBPATH:... which is later interpreted as
241
+ "-L IBPATH:...", if we're using an msvc like compilers convert
242
+ that to "/LIBPATH", otherwise to "-L ..."
243
+ """
244
+
245
+ new_args = []
246
+ for arg in args:
247
+ if arg.startswith('-l') and arg.endswith('.so'):
248
+ new_args.append(arg.lstrip('-l'))
249
+ elif arg.startswith('-LIBPATH:'):
250
+ cpp = self.env.coredata.compilers[self.for_machine]['cpp']
251
+ new_args.extend(cpp.get_linker_search_args(arg.lstrip('-LIBPATH:')))
252
+ else:
253
+ new_args.append(arg)
254
+ return new_args
255
+
256
+ def __check_libfiles(self, shared: bool) -> None:
257
+ """Use llvm-config's --libfiles to check if libraries exist."""
258
+ mode = '--link-shared' if shared else '--link-static'
259
+
260
+ # Set self.required to true to force an exception in get_config_value
261
+ # if the returncode != 0
262
+ restore = self.required
263
+ self.required = True
264
+
265
+ try:
266
+ # It doesn't matter what the stage is, the caller needs to catch
267
+ # the exception anyway.
268
+ self.link_args = self.get_config_value(['--libfiles', mode], '')
269
+ finally:
270
+ self.required = restore
271
+
272
+ def _set_new_link_args(self, environment: 'Environment') -> None:
273
+ """How to set linker args for LLVM versions >= 3.9"""
274
+ try:
275
+ mode = self.get_config_value(['--shared-mode'], 'link_args')[0]
276
+ except IndexError:
277
+ mlog.debug('llvm-config --shared-mode returned an error')
278
+ self.is_found = False
279
+ return
280
+
281
+ if not self.static and mode == 'static':
282
+ # If llvm is configured with LLVM_BUILD_LLVM_DYLIB but not with
283
+ # LLVM_LINK_LLVM_DYLIB and not LLVM_BUILD_SHARED_LIBS (which
284
+ # upstream doesn't recommend using), then llvm-config will lie to
285
+ # you about how to do shared-linking. It wants to link to a a bunch
286
+ # of individual shared libs (which don't exist because llvm wasn't
287
+ # built with LLVM_BUILD_SHARED_LIBS.
288
+ #
289
+ # Therefore, we'll try to get the libfiles, if the return code is 0
290
+ # or we get an empty list, then we'll try to build a working
291
+ # configuration by hand.
292
+ try:
293
+ self.__check_libfiles(True)
294
+ except DependencyException:
295
+ lib_ext = get_shared_library_suffix(environment, self.for_machine)
296
+ libdir = self.get_config_value(['--libdir'], 'link_args')[0]
297
+ # Sort for reproducibility
298
+ matches = sorted(glob.iglob(os.path.join(libdir, f'libLLVM*{lib_ext}')))
299
+ if not matches:
300
+ if self.required:
301
+ raise
302
+ self.is_found = False
303
+ return
304
+
305
+ self.link_args = self.get_config_value(['--ldflags'], 'link_args')
306
+ libname = os.path.basename(matches[0]).rstrip(lib_ext).lstrip('lib')
307
+ self.link_args.append(f'-l{libname}')
308
+ return
309
+ elif self.static and mode == 'shared':
310
+ # If, however LLVM_BUILD_SHARED_LIBS is true # (*cough* gentoo *cough*)
311
+ # then this is correct. Building with LLVM_BUILD_SHARED_LIBS has a side
312
+ # effect, it stops the generation of static archives. Therefore we need
313
+ # to check for that and error out on static if this is the case
314
+ try:
315
+ self.__check_libfiles(False)
316
+ except DependencyException:
317
+ if self.required:
318
+ raise
319
+ self.is_found = False
320
+ return
321
+
322
+ link_args = ['--link-static', '--system-libs'] if self.static else ['--link-shared']
323
+ self.link_args = self.get_config_value(
324
+ ['--libs', '--ldflags'] + link_args + list(self.required_modules),
325
+ 'link_args')
326
+
327
+ def _set_old_link_args(self) -> None:
328
+ """Setting linker args for older versions of llvm.
329
+
330
+ Old versions of LLVM bring an extra level of insanity with them.
331
+ llvm-config will provide the correct arguments for static linking, but
332
+ not for shared-linking, we have to figure those out ourselves, because
333
+ of course we do.
334
+ """
335
+ if self.static:
336
+ self.link_args = self.get_config_value(
337
+ ['--libs', '--ldflags', '--system-libs'] + list(self.required_modules),
338
+ 'link_args')
339
+ else:
340
+ # llvm-config will provide arguments for static linking, so we get
341
+ # to figure out for ourselves what to link with. We'll do that by
342
+ # checking in the directory provided by --libdir for a library
343
+ # called libLLVM-<ver>.(so|dylib|dll)
344
+ libdir = self.get_config_value(['--libdir'], 'link_args')[0]
345
+
346
+ expected_name = f'libLLVM-{self.version}'
347
+ re_name = re.compile(fr'{expected_name}.(so|dll|dylib)$')
348
+
349
+ for file_ in os.listdir(libdir):
350
+ if re_name.match(file_):
351
+ self.link_args = [f'-L{libdir}',
352
+ '-l{}'.format(os.path.splitext(file_.lstrip('lib'))[0])]
353
+ break
354
+ else:
355
+ raise DependencyException(
356
+ 'Could not find a dynamically linkable library for LLVM.')
357
+
358
+ def check_components(self, modules: T.List[str], required: bool = True) -> None:
359
+ """Check for llvm components (modules in meson terms).
360
+
361
+ The required option is whether the module is required, not whether LLVM
362
+ is required.
363
+ """
364
+ for mod in sorted(set(modules)):
365
+ status = ''
366
+
367
+ if mod not in self.provided_modules:
368
+ if required:
369
+ self.is_found = False
370
+ if self.required:
371
+ raise DependencyException(
372
+ f'Could not find required LLVM Component: {mod}')
373
+ status = '(missing)'
374
+ else:
375
+ status = '(missing but optional)'
376
+ else:
377
+ self.required_modules.add(mod)
378
+
379
+ self.module_details.append(mod + status)
380
+
381
+ def log_details(self) -> str:
382
+ if self.module_details:
383
+ return 'modules: ' + ', '.join(self.module_details)
384
+ return ''
385
+
386
+ class LLVMDependencyCMake(CMakeDependency):
387
+ def __init__(self, name: str, env: 'Environment', kwargs: T.Dict[str, T.Any]) -> None:
388
+ self.llvm_modules = stringlistify(extract_as_list(kwargs, 'modules'))
389
+ self.llvm_opt_modules = stringlistify(extract_as_list(kwargs, 'optional_modules'))
390
+
391
+ compilers = None
392
+ if kwargs.get('native', False):
393
+ compilers = env.coredata.compilers.build
394
+ else:
395
+ compilers = env.coredata.compilers.host
396
+ if not compilers or not all(x in compilers for x in ('c', 'cpp')):
397
+ # Initialize basic variables
398
+ ExternalDependency.__init__(self, DependencyTypeName('cmake'), env, kwargs)
399
+
400
+ # Initialize CMake specific variables
401
+ self.found_modules: T.List[str] = []
402
+ self.name = name
403
+
404
+ # Warn and return
405
+ mlog.warning('The LLVM dependency was not found via CMake since both a C and C++ compiler are required.')
406
+ return
407
+
408
+ super().__init__(name, env, kwargs, language='cpp', force_use_global_compilers=True)
409
+
410
+ if not self.cmakebin.found():
411
+ return
412
+
413
+ if not self.is_found:
414
+ return
415
+
416
+ # CMake will return not found due to not defined LLVM_DYLIB_COMPONENTS
417
+ if not self.static and version_compare(self.version, '< 7.0') and self.llvm_modules:
418
+ mlog.warning('Before version 7.0 cmake does not export modules for dynamic linking, cannot check required modules')
419
+ return
420
+
421
+ # Extract extra include directories and definitions
422
+ inc_dirs = self.traceparser.get_cmake_var('PACKAGE_INCLUDE_DIRS')
423
+ defs = self.traceparser.get_cmake_var('PACKAGE_DEFINITIONS')
424
+ # LLVM explicitly uses space-separated variables rather than semicolon lists
425
+ if len(defs) == 1:
426
+ defs = defs[0].split(' ')
427
+ temp = ['-I' + x for x in inc_dirs] + defs
428
+ self.compile_args += [x for x in temp if x not in self.compile_args]
429
+ self.compile_args = strip_system_includedirs(env, self.for_machine, self.compile_args)
430
+ if not self._add_sub_dependency(threads_factory(env, self.for_machine, {})):
431
+ self.is_found = False
432
+ return
433
+
434
+ def _main_cmake_file(self) -> str:
435
+ # Use a custom CMakeLists.txt for LLVM
436
+ return 'CMakeListsLLVM.txt'
437
+
438
+ # Check version in CMake to return exact version as config tool (latest allowed)
439
+ # It is safe to add .0 to latest argument, it will discarded if we use search_version
440
+ def llvm_cmake_versions(self) -> T.List[str]:
441
+
442
+ def ver_from_suf(req: str) -> str:
443
+ return search_version(req.strip('-')+'.0')
444
+
445
+ def version_sorter(a: str, b: str) -> int:
446
+ if version_compare(a, "="+b):
447
+ return 0
448
+ if version_compare(a, "<"+b):
449
+ return 1
450
+ return -1
451
+
452
+ llvm_requested_versions = [ver_from_suf(x) for x in get_llvm_tool_names('') if version_compare(ver_from_suf(x), '>=0')]
453
+ if self.version_reqs:
454
+ llvm_requested_versions = [ver_from_suf(x) for x in get_llvm_tool_names('') if version_compare_many(ver_from_suf(x), self.version_reqs)]
455
+ # CMake sorting before 3.18 is incorrect, sort it here instead
456
+ return sorted(llvm_requested_versions, key=functools.cmp_to_key(version_sorter))
457
+
458
+ # Split required and optional modules to distinguish it in CMake
459
+ def _extra_cmake_opts(self) -> T.List[str]:
460
+ return ['-DLLVM_MESON_REQUIRED_MODULES={}'.format(';'.join(self.llvm_modules)),
461
+ '-DLLVM_MESON_OPTIONAL_MODULES={}'.format(';'.join(self.llvm_opt_modules)),
462
+ '-DLLVM_MESON_PACKAGE_NAMES={}'.format(';'.join(get_llvm_tool_names(self.name))),
463
+ '-DLLVM_MESON_VERSIONS={}'.format(';'.join(self.llvm_cmake_versions())),
464
+ '-DLLVM_MESON_DYLIB={}'.format('OFF' if self.static else 'ON')]
465
+
466
+ def _map_module_list(self, modules: T.List[T.Tuple[str, bool]], components: T.List[T.Tuple[str, bool]]) -> T.List[T.Tuple[str, bool]]:
467
+ res = []
468
+ for mod, required in modules:
469
+ cm_targets = self.traceparser.get_cmake_var(f'MESON_LLVM_TARGETS_{mod}')
470
+ if not cm_targets:
471
+ if required:
472
+ raise self._gen_exception(f'LLVM module {mod} was not found')
473
+ else:
474
+ mlog.warning('Optional LLVM module', mlog.bold(mod), 'was not found', fatal=False)
475
+ continue
476
+ for i in cm_targets:
477
+ res += [(i, required)]
478
+ return res
479
+
480
+ def _original_module_name(self, module: str) -> str:
481
+ orig_name = self.traceparser.get_cmake_var(f'MESON_TARGET_TO_LLVM_{module}')
482
+ if orig_name:
483
+ return orig_name[0]
484
+ return module
485
+
486
+
487
+ class ValgrindDependency(PkgConfigDependency):
488
+ '''
489
+ Consumers of Valgrind usually only need the compile args and do not want to
490
+ link to its (static) libraries.
491
+ '''
492
+ def __init__(self, env: 'Environment', kwargs: T.Dict[str, T.Any]):
493
+ super().__init__('valgrind', env, kwargs)
494
+
495
+ def get_link_args(self, language: T.Optional[str] = None, raw: bool = False) -> T.List[str]:
496
+ return []
497
+
498
+ packages['valgrind'] = ValgrindDependency
499
+
500
+
501
+ class ZlibSystemDependency(SystemDependency):
502
+
503
+ def __init__(self, name: str, environment: 'Environment', kwargs: T.Dict[str, T.Any]):
504
+ super().__init__(name, environment, kwargs)
505
+ from ..compilers.c import AppleClangCCompiler
506
+ from ..compilers.cpp import AppleClangCPPCompiler
507
+
508
+ m = self.env.machines[self.for_machine]
509
+
510
+ # I'm not sure this is entirely correct. What if we're cross compiling
511
+ # from something to macOS?
512
+ if ((m.is_darwin() and isinstance(self.clib_compiler, (AppleClangCCompiler, AppleClangCPPCompiler))) or
513
+ m.is_freebsd() or m.is_dragonflybsd() or m.is_android()):
514
+ # No need to set includes,
515
+ # on macos xcode/clang will do that for us.
516
+ # on freebsd zlib.h is in /usr/include
517
+
518
+ self.is_found = True
519
+ self.link_args = ['-lz']
520
+ else:
521
+ if self.clib_compiler.get_argument_syntax() == 'msvc':
522
+ libs = ['zlib1', 'zlib']
523
+ else:
524
+ libs = ['z']
525
+ for lib in libs:
526
+ l = self.clib_compiler.find_library(lib, environment, [], self.libtype)
527
+ h = self.clib_compiler.has_header('zlib.h', '', environment, dependencies=[self])
528
+ if l and h[0]:
529
+ self.is_found = True
530
+ self.link_args = l
531
+ break
532
+ else:
533
+ return
534
+
535
+ v, _ = self.clib_compiler.get_define('ZLIB_VERSION', '#include <zlib.h>', self.env, [], [self])
536
+ self.version = v.strip('"')
537
+
538
+
539
+ class JNISystemDependency(SystemDependency):
540
+ def __init__(self, environment: 'Environment', kwargs: JNISystemDependencyKW):
541
+ super().__init__('jni', environment, T.cast('T.Dict[str, T.Any]', kwargs))
542
+
543
+ self.feature_since = ('0.62.0', '')
544
+
545
+ m = self.env.machines[self.for_machine]
546
+
547
+ if 'java' not in environment.coredata.compilers[self.for_machine]:
548
+ detect_compiler(self.name, environment, self.for_machine, 'java')
549
+ self.javac = environment.coredata.compilers[self.for_machine]['java']
550
+ self.version = self.javac.version
551
+
552
+ modules: T.List[str] = mesonlib.listify(kwargs.get('modules', []))
553
+ for module in modules:
554
+ if module not in {'jvm', 'awt'}:
555
+ msg = f'Unknown JNI module ({module})'
556
+ if self.required:
557
+ mlog.error(msg)
558
+ else:
559
+ mlog.debug(msg)
560
+ self.is_found = False
561
+ return
562
+
563
+ if 'version' in kwargs and not version_compare(self.version, kwargs['version']):
564
+ mlog.error(f'Incorrect JDK version found ({self.version}), wanted {kwargs["version"]}')
565
+ self.is_found = False
566
+ return
567
+
568
+ self.java_home = environment.properties[self.for_machine].get_java_home()
569
+ if not self.java_home:
570
+ self.java_home = pathlib.Path(shutil.which(self.javac.exelist[0])).resolve().parents[1]
571
+ if m.is_darwin():
572
+ problem_java_prefix = pathlib.Path('/System/Library/Frameworks/JavaVM.framework/Versions')
573
+ if problem_java_prefix in self.java_home.parents:
574
+ res = subprocess.run(['/usr/libexec/java_home', '--failfast', '--arch', m.cpu_family],
575
+ stdout=subprocess.PIPE)
576
+ if res.returncode != 0:
577
+ msg = 'JAVA_HOME could not be discovered on the system. Please set it explicitly.'
578
+ if self.required:
579
+ mlog.error(msg)
580
+ else:
581
+ mlog.debug(msg)
582
+ self.is_found = False
583
+ return
584
+ self.java_home = pathlib.Path(res.stdout.decode().strip())
585
+
586
+ platform_include_dir = self.__machine_info_to_platform_include_dir(m)
587
+ if platform_include_dir is None:
588
+ mlog.error("Could not find a JDK platform include directory for your OS, please open an issue or provide a pull request.")
589
+ self.is_found = False
590
+ return
591
+
592
+ java_home_include = self.java_home / 'include'
593
+ self.compile_args.append(f'-I{java_home_include}')
594
+ self.compile_args.append(f'-I{java_home_include / platform_include_dir}')
595
+
596
+ if modules:
597
+ if m.is_windows():
598
+ java_home_lib = self.java_home / 'lib'
599
+ java_home_lib_server = java_home_lib
600
+ else:
601
+ if version_compare(self.version, '<= 1.8.0'):
602
+ java_home_lib = self.java_home / 'jre' / 'lib' / self.__cpu_translate(m.cpu_family)
603
+ else:
604
+ java_home_lib = self.java_home / 'lib'
605
+
606
+ java_home_lib_server = java_home_lib / 'server'
607
+
608
+ if 'jvm' in modules:
609
+ jvm = self.clib_compiler.find_library('jvm', environment, extra_dirs=[str(java_home_lib_server)])
610
+ if jvm is None:
611
+ mlog.debug('jvm library not found.')
612
+ self.is_found = False
613
+ else:
614
+ self.link_args.extend(jvm)
615
+ if 'awt' in modules:
616
+ jawt = self.clib_compiler.find_library('jawt', environment, extra_dirs=[str(java_home_lib)])
617
+ if jawt is None:
618
+ mlog.debug('jawt library not found.')
619
+ self.is_found = False
620
+ else:
621
+ self.link_args.extend(jawt)
622
+
623
+ self.is_found = True
624
+
625
+ @staticmethod
626
+ def __cpu_translate(cpu: str) -> str:
627
+ '''
628
+ The JDK and Meson have a disagreement here, so translate it over. In the event more
629
+ translation needs to be done, add to following dict.
630
+ '''
631
+ java_cpus = {
632
+ 'x86_64': 'amd64',
633
+ }
634
+
635
+ return java_cpus.get(cpu, cpu)
636
+
637
+ @staticmethod
638
+ def __machine_info_to_platform_include_dir(m: 'MachineInfo') -> T.Optional[str]:
639
+ '''Translates the machine information to the platform-dependent include directory
640
+
641
+ When inspecting a JDK release tarball or $JAVA_HOME, inside the `include/` directory is a
642
+ platform-dependent directory that must be on the target's include path in addition to the
643
+ parent `include/` directory.
644
+ '''
645
+ if m.is_linux():
646
+ return 'linux'
647
+ elif m.is_windows():
648
+ return 'win32'
649
+ elif m.is_darwin():
650
+ return 'darwin'
651
+ elif m.is_sunos():
652
+ return 'solaris'
653
+ elif m.is_freebsd():
654
+ return 'freebsd'
655
+ elif m.is_netbsd():
656
+ return 'netbsd'
657
+ elif m.is_openbsd():
658
+ return 'openbsd'
659
+ elif m.is_dragonflybsd():
660
+ return 'dragonfly'
661
+
662
+ return None
663
+
664
+ packages['jni'] = JNISystemDependency
665
+
666
+
667
+ class JDKSystemDependency(JNISystemDependency):
668
+ def __init__(self, environment: 'Environment', kwargs: JNISystemDependencyKW):
669
+ super().__init__(environment, kwargs)
670
+
671
+ self.feature_since = ('0.59.0', '')
672
+ self.featurechecks.append(FeatureDeprecated(
673
+ 'jdk system dependency',
674
+ '0.62.0',
675
+ 'Use the jni system dependency instead'
676
+ ))
677
+
678
+ packages['jdk'] = JDKSystemDependency
679
+
680
+
681
+ packages['llvm'] = llvm_factory = DependencyFactory(
682
+ 'LLVM',
683
+ [DependencyMethods.CMAKE, DependencyMethods.CONFIG_TOOL],
684
+ cmake_class=LLVMDependencyCMake,
685
+ configtool_class=LLVMDependencyConfigTool,
686
+ )
687
+
688
+ packages['gtest'] = gtest_factory = DependencyFactory(
689
+ 'gtest',
690
+ [DependencyMethods.PKGCONFIG, DependencyMethods.SYSTEM],
691
+ pkgconfig_class=GTestDependencyPC,
692
+ system_class=GTestDependencySystem,
693
+ )
694
+
695
+ packages['gmock'] = gmock_factory = DependencyFactory(
696
+ 'gmock',
697
+ [DependencyMethods.PKGCONFIG, DependencyMethods.SYSTEM],
698
+ pkgconfig_class=GMockDependencyPC,
699
+ system_class=GMockDependencySystem,
700
+ )
701
+
702
+ packages['zlib'] = zlib_factory = DependencyFactory(
703
+ 'zlib',
704
+ [DependencyMethods.PKGCONFIG, DependencyMethods.CMAKE, DependencyMethods.SYSTEM],
705
+ cmake_name='ZLIB',
706
+ system_class=ZlibSystemDependency,
707
+ )