frida 16.2.0 → 16.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (386) hide show
  1. package/BSDmakefile +6 -0
  2. package/Makefile +16 -0
  3. package/README.md +14 -11
  4. package/configure +18 -0
  5. package/configure.bat +22 -0
  6. package/dist/native.js +0 -8
  7. package/lib/application.ts +98 -0
  8. package/lib/authentication.ts +3 -0
  9. package/lib/build.py +50 -0
  10. package/lib/bus.ts +30 -0
  11. package/lib/cancellable.ts +33 -0
  12. package/lib/child.ts +15 -0
  13. package/lib/crash.ts +11 -0
  14. package/lib/device.ts +329 -0
  15. package/lib/device_manager.ts +69 -0
  16. package/lib/endpoint_parameters.ts +56 -0
  17. package/lib/icon.ts +15 -0
  18. package/lib/index.ts +311 -0
  19. package/lib/iostream.ts +78 -0
  20. package/lib/meson.build +53 -0
  21. package/lib/native.ts +9 -0
  22. package/lib/portal_membership.ts +10 -0
  23. package/lib/portal_service.ts +105 -0
  24. package/lib/process.ts +57 -0
  25. package/lib/relay.ts +44 -0
  26. package/lib/script.ts +352 -0
  27. package/lib/session.ts +113 -0
  28. package/lib/signals.ts +45 -0
  29. package/lib/socket_address.ts +35 -0
  30. package/lib/spawn.ts +4 -0
  31. package/lib/system_parameters.ts +78 -0
  32. package/make.bat +23 -0
  33. package/meson.build +160 -0
  34. package/meson.options +11 -0
  35. package/package.json +27 -6
  36. package/releng/deps.py +1133 -0
  37. package/releng/deps.toml +391 -0
  38. package/releng/devkit-assets/frida-core-example-unix.c +188 -0
  39. package/releng/devkit-assets/frida-core-example-windows.c +197 -0
  40. package/releng/devkit-assets/frida-core-example.sln +28 -0
  41. package/releng/devkit-assets/frida-core-example.vcxproj +157 -0
  42. package/releng/devkit-assets/frida-core-example.vcxproj.filters +27 -0
  43. package/releng/devkit-assets/frida-gum-example-unix.c +122 -0
  44. package/releng/devkit-assets/frida-gum-example-windows.c +132 -0
  45. package/releng/devkit-assets/frida-gum-example.sln +28 -0
  46. package/releng/devkit-assets/frida-gum-example.vcxproj +157 -0
  47. package/releng/devkit-assets/frida-gum-example.vcxproj.filters +27 -0
  48. package/releng/devkit-assets/frida-gumjs-example-unix.c +84 -0
  49. package/releng/devkit-assets/frida-gumjs-example-windows.c +91 -0
  50. package/releng/devkit-assets/frida-gumjs-example.sln +28 -0
  51. package/releng/devkit-assets/frida-gumjs-example.vcxproj +157 -0
  52. package/releng/devkit-assets/frida-gumjs-example.vcxproj.filters +27 -0
  53. package/releng/devkit.py +535 -0
  54. package/releng/env.py +420 -0
  55. package/releng/env_android.py +150 -0
  56. package/releng/env_apple.py +176 -0
  57. package/releng/env_generic.py +373 -0
  58. package/releng/frida_version.py +69 -0
  59. package/releng/machine_file.py +44 -0
  60. package/releng/machine_spec.py +290 -0
  61. package/releng/meson/meson.py +27 -0
  62. package/releng/meson/mesonbuild/__init__.py +0 -0
  63. package/releng/meson/mesonbuild/_pathlib.py +63 -0
  64. package/releng/meson/mesonbuild/_typing.py +69 -0
  65. package/releng/meson/mesonbuild/arglist.py +321 -0
  66. package/releng/meson/mesonbuild/ast/__init__.py +23 -0
  67. package/releng/meson/mesonbuild/ast/interpreter.py +441 -0
  68. package/releng/meson/mesonbuild/ast/introspection.py +374 -0
  69. package/releng/meson/mesonbuild/ast/postprocess.py +109 -0
  70. package/releng/meson/mesonbuild/ast/printer.py +620 -0
  71. package/releng/meson/mesonbuild/ast/visitor.py +161 -0
  72. package/releng/meson/mesonbuild/backend/__init__.py +0 -0
  73. package/releng/meson/mesonbuild/backend/backends.py +2047 -0
  74. package/releng/meson/mesonbuild/backend/ninjabackend.py +3808 -0
  75. package/releng/meson/mesonbuild/backend/nonebackend.py +26 -0
  76. package/releng/meson/mesonbuild/backend/vs2010backend.py +2078 -0
  77. package/releng/meson/mesonbuild/backend/vs2012backend.py +35 -0
  78. package/releng/meson/mesonbuild/backend/vs2013backend.py +34 -0
  79. package/releng/meson/mesonbuild/backend/vs2015backend.py +35 -0
  80. package/releng/meson/mesonbuild/backend/vs2017backend.py +59 -0
  81. package/releng/meson/mesonbuild/backend/vs2019backend.py +54 -0
  82. package/releng/meson/mesonbuild/backend/vs2022backend.py +54 -0
  83. package/releng/meson/mesonbuild/backend/xcodebackend.py +1781 -0
  84. package/releng/meson/mesonbuild/build.py +3249 -0
  85. package/releng/meson/mesonbuild/cargo/__init__.py +5 -0
  86. package/releng/meson/mesonbuild/cargo/builder.py +238 -0
  87. package/releng/meson/mesonbuild/cargo/cfg.py +274 -0
  88. package/releng/meson/mesonbuild/cargo/interpreter.py +733 -0
  89. package/releng/meson/mesonbuild/cargo/manifest.py +227 -0
  90. package/releng/meson/mesonbuild/cargo/version.py +95 -0
  91. package/releng/meson/mesonbuild/cmake/__init__.py +28 -0
  92. package/releng/meson/mesonbuild/cmake/common.py +331 -0
  93. package/releng/meson/mesonbuild/cmake/data/__init__.py +0 -0
  94. package/releng/meson/mesonbuild/cmake/data/preload.cmake +82 -0
  95. package/releng/meson/mesonbuild/cmake/executor.py +241 -0
  96. package/releng/meson/mesonbuild/cmake/fileapi.py +324 -0
  97. package/releng/meson/mesonbuild/cmake/generator.py +186 -0
  98. package/releng/meson/mesonbuild/cmake/interpreter.py +1267 -0
  99. package/releng/meson/mesonbuild/cmake/toolchain.py +248 -0
  100. package/releng/meson/mesonbuild/cmake/traceparser.py +814 -0
  101. package/releng/meson/mesonbuild/cmake/tracetargets.py +161 -0
  102. package/releng/meson/mesonbuild/compilers/__init__.py +86 -0
  103. package/releng/meson/mesonbuild/compilers/asm.py +307 -0
  104. package/releng/meson/mesonbuild/compilers/c.py +788 -0
  105. package/releng/meson/mesonbuild/compilers/c_function_attributes.py +143 -0
  106. package/releng/meson/mesonbuild/compilers/compilers.py +1388 -0
  107. package/releng/meson/mesonbuild/compilers/cpp.py +1035 -0
  108. package/releng/meson/mesonbuild/compilers/cs.py +136 -0
  109. package/releng/meson/mesonbuild/compilers/cuda.py +806 -0
  110. package/releng/meson/mesonbuild/compilers/cython.py +91 -0
  111. package/releng/meson/mesonbuild/compilers/d.py +861 -0
  112. package/releng/meson/mesonbuild/compilers/detect.py +1396 -0
  113. package/releng/meson/mesonbuild/compilers/fortran.py +523 -0
  114. package/releng/meson/mesonbuild/compilers/java.py +113 -0
  115. package/releng/meson/mesonbuild/compilers/mixins/__init__.py +0 -0
  116. package/releng/meson/mesonbuild/compilers/mixins/arm.py +167 -0
  117. package/releng/meson/mesonbuild/compilers/mixins/ccrx.py +113 -0
  118. package/releng/meson/mesonbuild/compilers/mixins/clang.py +170 -0
  119. package/releng/meson/mesonbuild/compilers/mixins/clike.py +1330 -0
  120. package/releng/meson/mesonbuild/compilers/mixins/compcert.py +117 -0
  121. package/releng/meson/mesonbuild/compilers/mixins/elbrus.py +93 -0
  122. package/releng/meson/mesonbuild/compilers/mixins/emscripten.py +89 -0
  123. package/releng/meson/mesonbuild/compilers/mixins/gnu.py +629 -0
  124. package/releng/meson/mesonbuild/compilers/mixins/intel.py +167 -0
  125. package/releng/meson/mesonbuild/compilers/mixins/islinker.py +120 -0
  126. package/releng/meson/mesonbuild/compilers/mixins/metrowerks.py +279 -0
  127. package/releng/meson/mesonbuild/compilers/mixins/pgi.py +88 -0
  128. package/releng/meson/mesonbuild/compilers/mixins/ti.py +130 -0
  129. package/releng/meson/mesonbuild/compilers/mixins/visualstudio.py +458 -0
  130. package/releng/meson/mesonbuild/compilers/mixins/xc16.py +111 -0
  131. package/releng/meson/mesonbuild/compilers/objc.py +120 -0
  132. package/releng/meson/mesonbuild/compilers/objcpp.py +102 -0
  133. package/releng/meson/mesonbuild/compilers/rust.py +230 -0
  134. package/releng/meson/mesonbuild/compilers/swift.py +131 -0
  135. package/releng/meson/mesonbuild/compilers/vala.py +121 -0
  136. package/releng/meson/mesonbuild/coredata.py +1532 -0
  137. package/releng/meson/mesonbuild/dependencies/__init__.py +252 -0
  138. package/releng/meson/mesonbuild/dependencies/base.py +663 -0
  139. package/releng/meson/mesonbuild/dependencies/boost.py +1083 -0
  140. package/releng/meson/mesonbuild/dependencies/cmake.py +656 -0
  141. package/releng/meson/mesonbuild/dependencies/coarrays.py +80 -0
  142. package/releng/meson/mesonbuild/dependencies/configtool.py +163 -0
  143. package/releng/meson/mesonbuild/dependencies/cuda.py +295 -0
  144. package/releng/meson/mesonbuild/dependencies/data/CMakeLists.txt +102 -0
  145. package/releng/meson/mesonbuild/dependencies/data/CMakeListsLLVM.txt +204 -0
  146. package/releng/meson/mesonbuild/dependencies/data/CMakePathInfo.txt +31 -0
  147. package/releng/meson/mesonbuild/dependencies/data/__init__.py +0 -0
  148. package/releng/meson/mesonbuild/dependencies/detect.py +225 -0
  149. package/releng/meson/mesonbuild/dependencies/dev.py +707 -0
  150. package/releng/meson/mesonbuild/dependencies/dub.py +424 -0
  151. package/releng/meson/mesonbuild/dependencies/factory.py +146 -0
  152. package/releng/meson/mesonbuild/dependencies/framework.py +111 -0
  153. package/releng/meson/mesonbuild/dependencies/hdf5.py +168 -0
  154. package/releng/meson/mesonbuild/dependencies/misc.py +618 -0
  155. package/releng/meson/mesonbuild/dependencies/mpi.py +231 -0
  156. package/releng/meson/mesonbuild/dependencies/pkgconfig.py +570 -0
  157. package/releng/meson/mesonbuild/dependencies/platform.py +52 -0
  158. package/releng/meson/mesonbuild/dependencies/python.py +431 -0
  159. package/releng/meson/mesonbuild/dependencies/qt.py +484 -0
  160. package/releng/meson/mesonbuild/dependencies/scalapack.py +142 -0
  161. package/releng/meson/mesonbuild/dependencies/ui.py +281 -0
  162. package/releng/meson/mesonbuild/depfile.py +82 -0
  163. package/releng/meson/mesonbuild/envconfig.py +480 -0
  164. package/releng/meson/mesonbuild/environment.py +987 -0
  165. package/releng/meson/mesonbuild/interpreter/__init__.py +47 -0
  166. package/releng/meson/mesonbuild/interpreter/compiler.py +900 -0
  167. package/releng/meson/mesonbuild/interpreter/dependencyfallbacks.py +386 -0
  168. package/releng/meson/mesonbuild/interpreter/interpreter.py +3595 -0
  169. package/releng/meson/mesonbuild/interpreter/interpreterobjects.py +1096 -0
  170. package/releng/meson/mesonbuild/interpreter/kwargs.py +479 -0
  171. package/releng/meson/mesonbuild/interpreter/mesonmain.py +487 -0
  172. package/releng/meson/mesonbuild/interpreter/primitives/__init__.py +29 -0
  173. package/releng/meson/mesonbuild/interpreter/primitives/array.py +108 -0
  174. package/releng/meson/mesonbuild/interpreter/primitives/boolean.py +52 -0
  175. package/releng/meson/mesonbuild/interpreter/primitives/dict.py +88 -0
  176. package/releng/meson/mesonbuild/interpreter/primitives/integer.py +86 -0
  177. package/releng/meson/mesonbuild/interpreter/primitives/range.py +38 -0
  178. package/releng/meson/mesonbuild/interpreter/primitives/string.py +247 -0
  179. package/releng/meson/mesonbuild/interpreter/type_checking.py +853 -0
  180. package/releng/meson/mesonbuild/interpreterbase/__init__.py +126 -0
  181. package/releng/meson/mesonbuild/interpreterbase/_unholder.py +25 -0
  182. package/releng/meson/mesonbuild/interpreterbase/baseobjects.py +174 -0
  183. package/releng/meson/mesonbuild/interpreterbase/decorators.py +806 -0
  184. package/releng/meson/mesonbuild/interpreterbase/disabler.py +35 -0
  185. package/releng/meson/mesonbuild/interpreterbase/exceptions.py +22 -0
  186. package/releng/meson/mesonbuild/interpreterbase/helpers.py +67 -0
  187. package/releng/meson/mesonbuild/interpreterbase/interpreterbase.py +665 -0
  188. package/releng/meson/mesonbuild/interpreterbase/operator.py +32 -0
  189. package/releng/meson/mesonbuild/linkers/__init__.py +20 -0
  190. package/releng/meson/mesonbuild/linkers/base.py +39 -0
  191. package/releng/meson/mesonbuild/linkers/detect.py +229 -0
  192. package/releng/meson/mesonbuild/linkers/linkers.py +1614 -0
  193. package/releng/meson/mesonbuild/mcompile.py +380 -0
  194. package/releng/meson/mesonbuild/mconf.py +368 -0
  195. package/releng/meson/mesonbuild/mdevenv.py +234 -0
  196. package/releng/meson/mesonbuild/mdist.py +376 -0
  197. package/releng/meson/mesonbuild/mesondata.py +38 -0
  198. package/releng/meson/mesonbuild/mesonlib.py +23 -0
  199. package/releng/meson/mesonbuild/mesonmain.py +289 -0
  200. package/releng/meson/mesonbuild/minit.py +204 -0
  201. package/releng/meson/mesonbuild/minstall.py +864 -0
  202. package/releng/meson/mesonbuild/mintro.py +667 -0
  203. package/releng/meson/mesonbuild/mlog.py +542 -0
  204. package/releng/meson/mesonbuild/modules/__init__.py +270 -0
  205. package/releng/meson/mesonbuild/modules/cmake.py +442 -0
  206. package/releng/meson/mesonbuild/modules/cuda.py +377 -0
  207. package/releng/meson/mesonbuild/modules/dlang.py +117 -0
  208. package/releng/meson/mesonbuild/modules/external_project.py +306 -0
  209. package/releng/meson/mesonbuild/modules/fs.py +323 -0
  210. package/releng/meson/mesonbuild/modules/gnome.py +2215 -0
  211. package/releng/meson/mesonbuild/modules/hotdoc.py +487 -0
  212. package/releng/meson/mesonbuild/modules/i18n.py +405 -0
  213. package/releng/meson/mesonbuild/modules/icestorm.py +123 -0
  214. package/releng/meson/mesonbuild/modules/java.py +112 -0
  215. package/releng/meson/mesonbuild/modules/keyval.py +65 -0
  216. package/releng/meson/mesonbuild/modules/modtest.py +33 -0
  217. package/releng/meson/mesonbuild/modules/pkgconfig.py +744 -0
  218. package/releng/meson/mesonbuild/modules/python.py +556 -0
  219. package/releng/meson/mesonbuild/modules/python3.py +85 -0
  220. package/releng/meson/mesonbuild/modules/qt.py +621 -0
  221. package/releng/meson/mesonbuild/modules/qt4.py +23 -0
  222. package/releng/meson/mesonbuild/modules/qt5.py +23 -0
  223. package/releng/meson/mesonbuild/modules/qt6.py +22 -0
  224. package/releng/meson/mesonbuild/modules/rust.py +355 -0
  225. package/releng/meson/mesonbuild/modules/simd.py +114 -0
  226. package/releng/meson/mesonbuild/modules/sourceset.py +291 -0
  227. package/releng/meson/mesonbuild/modules/wayland.py +151 -0
  228. package/releng/meson/mesonbuild/modules/windows.py +207 -0
  229. package/releng/meson/mesonbuild/mparser.py +1114 -0
  230. package/releng/meson/mesonbuild/msetup.py +365 -0
  231. package/releng/meson/mesonbuild/msubprojects.py +764 -0
  232. package/releng/meson/mesonbuild/mtest.py +2201 -0
  233. package/releng/meson/mesonbuild/munstable_coredata.py +107 -0
  234. package/releng/meson/mesonbuild/optinterpreter.py +276 -0
  235. package/releng/meson/mesonbuild/programs.py +367 -0
  236. package/releng/meson/mesonbuild/rewriter.py +1075 -0
  237. package/releng/meson/mesonbuild/scripts/__init__.py +10 -0
  238. package/releng/meson/mesonbuild/scripts/clangformat.py +55 -0
  239. package/releng/meson/mesonbuild/scripts/clangtidy.py +30 -0
  240. package/releng/meson/mesonbuild/scripts/cleantrees.py +35 -0
  241. package/releng/meson/mesonbuild/scripts/cmake_run_ctgt.py +103 -0
  242. package/releng/meson/mesonbuild/scripts/cmd_or_ps.ps1 +17 -0
  243. package/releng/meson/mesonbuild/scripts/copy.py +19 -0
  244. package/releng/meson/mesonbuild/scripts/coverage.py +214 -0
  245. package/releng/meson/mesonbuild/scripts/delwithsuffix.py +27 -0
  246. package/releng/meson/mesonbuild/scripts/depfixer.py +495 -0
  247. package/releng/meson/mesonbuild/scripts/depscan.py +198 -0
  248. package/releng/meson/mesonbuild/scripts/dirchanger.py +20 -0
  249. package/releng/meson/mesonbuild/scripts/env2mfile.py +402 -0
  250. package/releng/meson/mesonbuild/scripts/externalproject.py +106 -0
  251. package/releng/meson/mesonbuild/scripts/gettext.py +86 -0
  252. package/releng/meson/mesonbuild/scripts/gtkdochelper.py +286 -0
  253. package/releng/meson/mesonbuild/scripts/hotdochelper.py +40 -0
  254. package/releng/meson/mesonbuild/scripts/itstool.py +77 -0
  255. package/releng/meson/mesonbuild/scripts/meson_exe.py +115 -0
  256. package/releng/meson/mesonbuild/scripts/msgfmthelper.py +29 -0
  257. package/releng/meson/mesonbuild/scripts/pycompile.py +54 -0
  258. package/releng/meson/mesonbuild/scripts/python_info.py +121 -0
  259. package/releng/meson/mesonbuild/scripts/regen_checker.py +55 -0
  260. package/releng/meson/mesonbuild/scripts/run_tool.py +58 -0
  261. package/releng/meson/mesonbuild/scripts/scanbuild.py +57 -0
  262. package/releng/meson/mesonbuild/scripts/symbolextractor.py +322 -0
  263. package/releng/meson/mesonbuild/scripts/tags.py +44 -0
  264. package/releng/meson/mesonbuild/scripts/test_loaded_modules.py +14 -0
  265. package/releng/meson/mesonbuild/scripts/uninstall.py +41 -0
  266. package/releng/meson/mesonbuild/scripts/vcstagger.py +35 -0
  267. package/releng/meson/mesonbuild/scripts/yasm.py +24 -0
  268. package/releng/meson/mesonbuild/templates/__init__.py +0 -0
  269. package/releng/meson/mesonbuild/templates/cpptemplates.py +143 -0
  270. package/releng/meson/mesonbuild/templates/cstemplates.py +90 -0
  271. package/releng/meson/mesonbuild/templates/ctemplates.py +126 -0
  272. package/releng/meson/mesonbuild/templates/cudatemplates.py +143 -0
  273. package/releng/meson/mesonbuild/templates/dlangtemplates.py +109 -0
  274. package/releng/meson/mesonbuild/templates/fortrantemplates.py +101 -0
  275. package/releng/meson/mesonbuild/templates/javatemplates.py +94 -0
  276. package/releng/meson/mesonbuild/templates/mesontemplates.py +70 -0
  277. package/releng/meson/mesonbuild/templates/objcpptemplates.py +126 -0
  278. package/releng/meson/mesonbuild/templates/objctemplates.py +126 -0
  279. package/releng/meson/mesonbuild/templates/rusttemplates.py +79 -0
  280. package/releng/meson/mesonbuild/templates/samplefactory.py +41 -0
  281. package/releng/meson/mesonbuild/templates/sampleimpl.py +160 -0
  282. package/releng/meson/mesonbuild/templates/valatemplates.py +82 -0
  283. package/releng/meson/mesonbuild/utils/__init__.py +0 -0
  284. package/releng/meson/mesonbuild/utils/core.py +166 -0
  285. package/releng/meson/mesonbuild/utils/platform.py +27 -0
  286. package/releng/meson/mesonbuild/utils/posix.py +32 -0
  287. package/releng/meson/mesonbuild/utils/universal.py +2445 -0
  288. package/releng/meson/mesonbuild/utils/vsenv.py +126 -0
  289. package/releng/meson/mesonbuild/utils/win32.py +29 -0
  290. package/releng/meson/mesonbuild/wrap/__init__.py +59 -0
  291. package/releng/meson/mesonbuild/wrap/wrap.py +846 -0
  292. package/releng/meson/mesonbuild/wrap/wraptool.py +198 -0
  293. package/releng/meson-scripts/BSDmakefile +6 -0
  294. package/releng/meson-scripts/Makefile +16 -0
  295. package/releng/meson-scripts/configure +18 -0
  296. package/releng/meson-scripts/configure.bat +22 -0
  297. package/releng/meson-scripts/make.bat +23 -0
  298. package/releng/meson_configure.py +506 -0
  299. package/releng/meson_make.py +131 -0
  300. package/releng/mkdevkit.py +107 -0
  301. package/releng/mkfatmacho.py +54 -0
  302. package/releng/post-process-oabi.py +97 -0
  303. package/releng/progress.py +14 -0
  304. package/releng/sync-from-upstream.py +185 -0
  305. package/releng/tomlkit/tomlkit/__init__.py +59 -0
  306. package/releng/tomlkit/tomlkit/_compat.py +22 -0
  307. package/releng/tomlkit/tomlkit/_types.py +83 -0
  308. package/releng/tomlkit/tomlkit/_utils.py +158 -0
  309. package/releng/tomlkit/tomlkit/api.py +308 -0
  310. package/releng/tomlkit/tomlkit/container.py +875 -0
  311. package/releng/tomlkit/tomlkit/exceptions.py +227 -0
  312. package/releng/tomlkit/tomlkit/items.py +1967 -0
  313. package/releng/tomlkit/tomlkit/parser.py +1141 -0
  314. package/releng/tomlkit/tomlkit/py.typed +0 -0
  315. package/releng/tomlkit/tomlkit/source.py +180 -0
  316. package/releng/tomlkit/tomlkit/toml_char.py +52 -0
  317. package/releng/tomlkit/tomlkit/toml_document.py +7 -0
  318. package/releng/tomlkit/tomlkit/toml_file.py +58 -0
  319. package/releng/winenv.py +140 -0
  320. package/scripts/adjust-version.py +19 -0
  321. package/scripts/detect-version.py +40 -0
  322. package/scripts/fetch-abi-bits.py +343 -0
  323. package/scripts/install.js +23 -0
  324. package/scripts/package.py +15 -0
  325. package/src/addon.cc +76 -0
  326. package/src/application.cc +148 -0
  327. package/src/application.h +31 -0
  328. package/src/authentication.cc +174 -0
  329. package/src/authentication.h +24 -0
  330. package/src/bus.cc +167 -0
  331. package/src/bus.h +33 -0
  332. package/src/cancellable.cc +117 -0
  333. package/src/cancellable.h +31 -0
  334. package/src/child.cc +150 -0
  335. package/src/child.h +32 -0
  336. package/src/crash.cc +122 -0
  337. package/src/crash.h +30 -0
  338. package/src/device.cc +1302 -0
  339. package/src/device.h +55 -0
  340. package/src/device_manager.cc +362 -0
  341. package/src/device_manager.h +35 -0
  342. package/src/endpoint_parameters.cc +171 -0
  343. package/src/endpoint_parameters.h +28 -0
  344. package/src/glib_context.cc +62 -0
  345. package/src/glib_context.h +29 -0
  346. package/src/glib_object.cc +25 -0
  347. package/src/glib_object.h +37 -0
  348. package/src/iostream.cc +247 -0
  349. package/src/iostream.h +30 -0
  350. package/src/meson.build +26 -0
  351. package/src/operation.h +94 -0
  352. package/src/portal_membership.cc +100 -0
  353. package/src/portal_membership.h +26 -0
  354. package/src/portal_service.cc +401 -0
  355. package/src/portal_service.h +40 -0
  356. package/src/process.cc +135 -0
  357. package/src/process.h +30 -0
  358. package/src/relay.cc +139 -0
  359. package/src/relay.h +31 -0
  360. package/src/runtime.cc +443 -0
  361. package/src/runtime.h +64 -0
  362. package/src/script.cc +301 -0
  363. package/src/script.h +36 -0
  364. package/src/session.cc +860 -0
  365. package/src/session.h +42 -0
  366. package/src/signals.cc +334 -0
  367. package/src/signals.h +47 -0
  368. package/src/spawn.cc +95 -0
  369. package/src/spawn.h +27 -0
  370. package/src/usage_monitor.h +117 -0
  371. package/src/uv_context.cc +118 -0
  372. package/src/uv_context.h +40 -0
  373. package/src/win_delay_load_hook.cc +63 -0
  374. package/subprojects/frida-core.wrap +8 -0
  375. package/subprojects/nan.wrap +9 -0
  376. package/subprojects/packagefiles/nan.patch +13 -0
  377. package/test/data/index.ts +13 -0
  378. package/test/data/unixvictim-linux-x86 +0 -0
  379. package/test/data/unixvictim-linux-x86_64 +0 -0
  380. package/test/data/unixvictim-macos +0 -0
  381. package/test/device.ts +27 -0
  382. package/test/device_manager.ts +16 -0
  383. package/test/labrat.ts +32 -0
  384. package/test/script.ts +176 -0
  385. package/test/session.ts +73 -0
  386. package/tsconfig.json +18 -0
@@ -0,0 +1,377 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+ # Copyright 2017 The Meson development team
3
+
4
+ from __future__ import annotations
5
+
6
+ import re
7
+ import typing as T
8
+
9
+ from ..mesonlib import listify, version_compare
10
+ from ..compilers.cuda import CudaCompiler
11
+ from ..interpreter.type_checking import NoneType
12
+
13
+ from . import NewExtensionModule, ModuleInfo
14
+
15
+ from ..interpreterbase import (
16
+ ContainerTypeInfo, InvalidArguments, KwargInfo, noKwargs, typed_kwargs, typed_pos_args,
17
+ )
18
+
19
+ if T.TYPE_CHECKING:
20
+ from typing_extensions import TypedDict
21
+
22
+ from . import ModuleState
23
+ from ..interpreter import Interpreter
24
+ from ..interpreterbase import TYPE_var
25
+
26
+ class ArchFlagsKwargs(TypedDict):
27
+ detected: T.Optional[T.List[str]]
28
+
29
+ AutoArch = T.Union[str, T.List[str]]
30
+
31
+
32
+ DETECTED_KW: KwargInfo[T.Union[None, T.List[str]]] = KwargInfo('detected', (ContainerTypeInfo(list, str), NoneType), listify=True)
33
+
34
+ class CudaModule(NewExtensionModule):
35
+
36
+ INFO = ModuleInfo('CUDA', '0.50.0', unstable=True)
37
+
38
+ def __init__(self, interp: Interpreter):
39
+ super().__init__()
40
+ self.methods.update({
41
+ "min_driver_version": self.min_driver_version,
42
+ "nvcc_arch_flags": self.nvcc_arch_flags,
43
+ "nvcc_arch_readable": self.nvcc_arch_readable,
44
+ })
45
+
46
+ @noKwargs
47
+ def min_driver_version(self, state: 'ModuleState',
48
+ args: T.List[TYPE_var],
49
+ kwargs: T.Dict[str, T.Any]) -> str:
50
+ argerror = InvalidArguments('min_driver_version must have exactly one positional argument: ' +
51
+ 'a CUDA Toolkit version string. Beware that, since CUDA 11.0, ' +
52
+ 'the CUDA Toolkit\'s components (including NVCC) are versioned ' +
53
+ 'independently from each other (and the CUDA Toolkit as a whole).')
54
+
55
+ if len(args) != 1 or not isinstance(args[0], str):
56
+ raise argerror
57
+
58
+ cuda_version = args[0]
59
+ driver_version_table = [
60
+ {'cuda_version': '>=12.0.0', 'windows': '527.41', 'linux': '525.60.13'},
61
+ {'cuda_version': '>=11.8.0', 'windows': '522.06', 'linux': '520.61.05'},
62
+ {'cuda_version': '>=11.7.1', 'windows': '516.31', 'linux': '515.48.07'},
63
+ {'cuda_version': '>=11.7.0', 'windows': '516.01', 'linux': '515.43.04'},
64
+ {'cuda_version': '>=11.6.1', 'windows': '511.65', 'linux': '510.47.03'},
65
+ {'cuda_version': '>=11.6.0', 'windows': '511.23', 'linux': '510.39.01'},
66
+ {'cuda_version': '>=11.5.1', 'windows': '496.13', 'linux': '495.29.05'},
67
+ {'cuda_version': '>=11.5.0', 'windows': '496.04', 'linux': '495.29.05'},
68
+ {'cuda_version': '>=11.4.3', 'windows': '472.50', 'linux': '470.82.01'},
69
+ {'cuda_version': '>=11.4.1', 'windows': '471.41', 'linux': '470.57.02'},
70
+ {'cuda_version': '>=11.4.0', 'windows': '471.11', 'linux': '470.42.01'},
71
+ {'cuda_version': '>=11.3.0', 'windows': '465.89', 'linux': '465.19.01'},
72
+ {'cuda_version': '>=11.2.2', 'windows': '461.33', 'linux': '460.32.03'},
73
+ {'cuda_version': '>=11.2.1', 'windows': '461.09', 'linux': '460.32.03'},
74
+ {'cuda_version': '>=11.2.0', 'windows': '460.82', 'linux': '460.27.03'},
75
+ {'cuda_version': '>=11.1.1', 'windows': '456.81', 'linux': '455.32'},
76
+ {'cuda_version': '>=11.1.0', 'windows': '456.38', 'linux': '455.23'},
77
+ {'cuda_version': '>=11.0.3', 'windows': '451.82', 'linux': '450.51.06'},
78
+ {'cuda_version': '>=11.0.2', 'windows': '451.48', 'linux': '450.51.05'},
79
+ {'cuda_version': '>=11.0.1', 'windows': '451.22', 'linux': '450.36.06'},
80
+ {'cuda_version': '>=10.2.89', 'windows': '441.22', 'linux': '440.33'},
81
+ {'cuda_version': '>=10.1.105', 'windows': '418.96', 'linux': '418.39'},
82
+ {'cuda_version': '>=10.0.130', 'windows': '411.31', 'linux': '410.48'},
83
+ {'cuda_version': '>=9.2.148', 'windows': '398.26', 'linux': '396.37'},
84
+ {'cuda_version': '>=9.2.88', 'windows': '397.44', 'linux': '396.26'},
85
+ {'cuda_version': '>=9.1.85', 'windows': '391.29', 'linux': '390.46'},
86
+ {'cuda_version': '>=9.0.76', 'windows': '385.54', 'linux': '384.81'},
87
+ {'cuda_version': '>=8.0.61', 'windows': '376.51', 'linux': '375.26'},
88
+ {'cuda_version': '>=8.0.44', 'windows': '369.30', 'linux': '367.48'},
89
+ {'cuda_version': '>=7.5.16', 'windows': '353.66', 'linux': '352.31'},
90
+ {'cuda_version': '>=7.0.28', 'windows': '347.62', 'linux': '346.46'},
91
+ ]
92
+
93
+ driver_version = 'unknown'
94
+ for d in driver_version_table:
95
+ if version_compare(cuda_version, d['cuda_version']):
96
+ driver_version = d.get(state.environment.machines.host.system, d['linux'])
97
+ break
98
+
99
+ return driver_version
100
+
101
+ @typed_pos_args('cuda.nvcc_arch_flags', (str, CudaCompiler), varargs=str)
102
+ @typed_kwargs('cuda.nvcc_arch_flags', DETECTED_KW)
103
+ def nvcc_arch_flags(self, state: 'ModuleState',
104
+ args: T.Tuple[T.Union[CudaCompiler, str], T.List[str]],
105
+ kwargs: ArchFlagsKwargs) -> T.List[str]:
106
+ nvcc_arch_args = self._validate_nvcc_arch_args(args, kwargs)
107
+ ret = self._nvcc_arch_flags(*nvcc_arch_args)[0]
108
+ return ret
109
+
110
+ @typed_pos_args('cuda.nvcc_arch_readable', (str, CudaCompiler), varargs=str)
111
+ @typed_kwargs('cuda.nvcc_arch_readable', DETECTED_KW)
112
+ def nvcc_arch_readable(self, state: 'ModuleState',
113
+ args: T.Tuple[T.Union[CudaCompiler, str], T.List[str]],
114
+ kwargs: ArchFlagsKwargs) -> T.List[str]:
115
+ nvcc_arch_args = self._validate_nvcc_arch_args(args, kwargs)
116
+ ret = self._nvcc_arch_flags(*nvcc_arch_args)[1]
117
+ return ret
118
+
119
+ @staticmethod
120
+ def _break_arch_string(s: str) -> T.List[str]:
121
+ s = re.sub('[ \t\r\n,;]+', ';', s)
122
+ return s.strip(';').split(';')
123
+
124
+ @staticmethod
125
+ def _detected_cc_from_compiler(c: T.Union[str, CudaCompiler]) -> T.List[str]:
126
+ if isinstance(c, CudaCompiler):
127
+ return [c.detected_cc]
128
+ return []
129
+
130
+ def _validate_nvcc_arch_args(self, args: T.Tuple[T.Union[str, CudaCompiler], T.List[str]],
131
+ kwargs: ArchFlagsKwargs) -> T.Tuple[str, AutoArch, T.List[str]]:
132
+
133
+ compiler = args[0]
134
+ if isinstance(compiler, CudaCompiler):
135
+ cuda_version = compiler.version
136
+ else:
137
+ cuda_version = compiler
138
+
139
+ arch_list: AutoArch = args[1]
140
+ arch_list = listify([self._break_arch_string(a) for a in arch_list])
141
+ if len(arch_list) > 1 and not set(arch_list).isdisjoint({'All', 'Common', 'Auto'}):
142
+ raise InvalidArguments('''The special architectures 'All', 'Common' and 'Auto' must appear alone, as a positional argument!''')
143
+ arch_list = arch_list[0] if len(arch_list) == 1 else arch_list
144
+
145
+ detected = kwargs['detected'] if kwargs['detected'] is not None else self._detected_cc_from_compiler(compiler)
146
+ detected = [x for a in detected for x in self._break_arch_string(a)]
147
+ if not set(detected).isdisjoint({'All', 'Common', 'Auto'}):
148
+ raise InvalidArguments('''The special architectures 'All', 'Common' and 'Auto' must appear alone, as a positional argument!''')
149
+
150
+ return cuda_version, arch_list, detected
151
+
152
+ def _filter_cuda_arch_list(self, cuda_arch_list: T.List[str], lo: str, hi: T.Optional[str], saturate: str) -> T.List[str]:
153
+ """
154
+ Filter CUDA arch list (no codenames) for >= low and < hi architecture
155
+ bounds, and deduplicate.
156
+ Architectures >= hi are replaced with saturate.
157
+ """
158
+
159
+ filtered_cuda_arch_list = []
160
+ for arch in cuda_arch_list:
161
+ if arch:
162
+ if lo and version_compare(arch, '<' + lo):
163
+ continue
164
+ if hi and version_compare(arch, '>=' + hi):
165
+ arch = saturate
166
+ if arch not in filtered_cuda_arch_list:
167
+ filtered_cuda_arch_list.append(arch)
168
+ return filtered_cuda_arch_list
169
+
170
+ def _nvcc_arch_flags(self, cuda_version: str, cuda_arch_list: AutoArch, detected: T.List[str]) -> T.Tuple[T.List[str], T.List[str]]:
171
+ """
172
+ Using the CUDA Toolkit version and the target architectures, compute
173
+ the NVCC architecture flags.
174
+ """
175
+
176
+ # Replicates much of the logic of
177
+ # https://github.com/Kitware/CMake/blob/master/Modules/FindCUDA/select_compute_arch.cmake
178
+ # except that a bug with cuda_arch_list="All" is worked around by
179
+ # tracking both lower and upper limits on GPU architectures.
180
+
181
+ cuda_known_gpu_architectures = ['Fermi', 'Kepler', 'Maxwell'] # noqa: E221
182
+ cuda_common_gpu_architectures = ['3.0', '3.5', '5.0'] # noqa: E221
183
+ cuda_hi_limit_gpu_architecture = None # noqa: E221
184
+ cuda_lo_limit_gpu_architecture = '2.0' # noqa: E221
185
+ cuda_all_gpu_architectures = ['3.0', '3.2', '3.5', '5.0'] # noqa: E221
186
+
187
+ if version_compare(cuda_version, '<7.0'):
188
+ cuda_hi_limit_gpu_architecture = '5.2'
189
+
190
+ if version_compare(cuda_version, '>=7.0'):
191
+ cuda_known_gpu_architectures += ['Kepler+Tegra', 'Kepler+Tesla', 'Maxwell+Tegra'] # noqa: E221
192
+ cuda_common_gpu_architectures += ['5.2'] # noqa: E221
193
+
194
+ if version_compare(cuda_version, '<8.0'):
195
+ cuda_common_gpu_architectures += ['5.2+PTX'] # noqa: E221
196
+ cuda_hi_limit_gpu_architecture = '6.0' # noqa: E221
197
+
198
+ if version_compare(cuda_version, '>=8.0'):
199
+ cuda_known_gpu_architectures += ['Pascal', 'Pascal+Tegra'] # noqa: E221
200
+ cuda_common_gpu_architectures += ['6.0', '6.1'] # noqa: E221
201
+ cuda_all_gpu_architectures += ['6.0', '6.1', '6.2'] # noqa: E221
202
+
203
+ if version_compare(cuda_version, '<9.0'):
204
+ cuda_common_gpu_architectures += ['6.1+PTX'] # noqa: E221
205
+ cuda_hi_limit_gpu_architecture = '7.0' # noqa: E221
206
+
207
+ if version_compare(cuda_version, '>=9.0'):
208
+ cuda_known_gpu_architectures += ['Volta', 'Xavier'] # noqa: E221
209
+ cuda_common_gpu_architectures += ['7.0'] # noqa: E221
210
+ cuda_all_gpu_architectures += ['7.0', '7.2'] # noqa: E221
211
+ # https://docs.nvidia.com/cuda/archive/9.0/cuda-toolkit-release-notes/index.html#unsupported-features
212
+ cuda_lo_limit_gpu_architecture = '3.0' # noqa: E221
213
+
214
+ if version_compare(cuda_version, '<10.0'):
215
+ cuda_common_gpu_architectures += ['7.2+PTX'] # noqa: E221
216
+ cuda_hi_limit_gpu_architecture = '8.0' # noqa: E221
217
+
218
+ if version_compare(cuda_version, '>=10.0'):
219
+ cuda_known_gpu_architectures += ['Turing'] # noqa: E221
220
+ cuda_common_gpu_architectures += ['7.5'] # noqa: E221
221
+ cuda_all_gpu_architectures += ['7.5'] # noqa: E221
222
+
223
+ if version_compare(cuda_version, '<11.0'):
224
+ cuda_common_gpu_architectures += ['7.5+PTX'] # noqa: E221
225
+ cuda_hi_limit_gpu_architecture = '8.0' # noqa: E221
226
+
227
+ # need to account for the fact that Ampere is commonly assumed to include
228
+ # SM8.0 and SM8.6 even though CUDA 11.0 doesn't support SM8.6
229
+ cuda_ampere_bin = ['8.0']
230
+ cuda_ampere_ptx = ['8.0']
231
+ if version_compare(cuda_version, '>=11.0'):
232
+ cuda_known_gpu_architectures += ['Ampere'] # noqa: E221
233
+ cuda_common_gpu_architectures += ['8.0'] # noqa: E221
234
+ cuda_all_gpu_architectures += ['8.0'] # noqa: E221
235
+ # https://docs.nvidia.com/cuda/archive/11.0/cuda-toolkit-release-notes/index.html#deprecated-features
236
+ cuda_lo_limit_gpu_architecture = '3.5' # noqa: E221
237
+
238
+ if version_compare(cuda_version, '<11.1'):
239
+ cuda_common_gpu_architectures += ['8.0+PTX'] # noqa: E221
240
+ cuda_hi_limit_gpu_architecture = '8.6' # noqa: E221
241
+
242
+ if version_compare(cuda_version, '>=11.1'):
243
+ cuda_ampere_bin += ['8.6'] # noqa: E221
244
+ cuda_ampere_ptx = ['8.6'] # noqa: E221
245
+
246
+ cuda_common_gpu_architectures += ['8.6'] # noqa: E221
247
+ cuda_all_gpu_architectures += ['8.6'] # noqa: E221
248
+
249
+ if version_compare(cuda_version, '<11.8'):
250
+ cuda_common_gpu_architectures += ['8.6+PTX'] # noqa: E221
251
+ cuda_hi_limit_gpu_architecture = '8.7' # noqa: E221
252
+
253
+ if version_compare(cuda_version, '>=11.8'):
254
+ cuda_known_gpu_architectures += ['Orin', 'Lovelace', 'Hopper'] # noqa: E221
255
+ cuda_common_gpu_architectures += ['8.9', '9.0', '9.0+PTX'] # noqa: E221
256
+ cuda_all_gpu_architectures += ['8.7', '8.9', '9.0'] # noqa: E221
257
+
258
+ if version_compare(cuda_version, '<12'):
259
+ cuda_hi_limit_gpu_architecture = '9.1' # noqa: E221
260
+
261
+ if version_compare(cuda_version, '>=12.0'):
262
+ # https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html#deprecated-features (Current)
263
+ # https://docs.nvidia.com/cuda/archive/12.0/cuda-toolkit-release-notes/index.html#deprecated-features (Eventual?)
264
+ cuda_lo_limit_gpu_architecture = '5.0' # noqa: E221
265
+
266
+ if version_compare(cuda_version, '<13'):
267
+ cuda_hi_limit_gpu_architecture = '10.0' # noqa: E221
268
+
269
+ if not cuda_arch_list:
270
+ cuda_arch_list = 'Auto'
271
+
272
+ if cuda_arch_list == 'All': # noqa: E271
273
+ cuda_arch_list = cuda_known_gpu_architectures
274
+ elif cuda_arch_list == 'Common': # noqa: E271
275
+ cuda_arch_list = cuda_common_gpu_architectures
276
+ elif cuda_arch_list == 'Auto': # noqa: E271
277
+ if detected:
278
+ if isinstance(detected, list):
279
+ cuda_arch_list = detected
280
+ else:
281
+ cuda_arch_list = self._break_arch_string(detected)
282
+ cuda_arch_list = self._filter_cuda_arch_list(cuda_arch_list,
283
+ cuda_lo_limit_gpu_architecture,
284
+ cuda_hi_limit_gpu_architecture,
285
+ cuda_common_gpu_architectures[-1])
286
+ else:
287
+ cuda_arch_list = cuda_common_gpu_architectures
288
+ elif isinstance(cuda_arch_list, str):
289
+ cuda_arch_list = self._break_arch_string(cuda_arch_list)
290
+
291
+ cuda_arch_list = sorted(x for x in set(cuda_arch_list) if x)
292
+
293
+ cuda_arch_bin: T.List[str] = []
294
+ cuda_arch_ptx: T.List[str] = []
295
+ for arch_name in cuda_arch_list:
296
+ arch_bin: T.Optional[T.List[str]]
297
+ arch_ptx: T.Optional[T.List[str]]
298
+ add_ptx = arch_name.endswith('+PTX')
299
+ if add_ptx:
300
+ arch_name = arch_name[:-len('+PTX')]
301
+
302
+ if re.fullmatch('[0-9]+\\.[0-9](\\([0-9]+\\.[0-9]\\))?', arch_name):
303
+ arch_bin, arch_ptx = [arch_name], [arch_name]
304
+ else:
305
+ arch_bin, arch_ptx = {
306
+ 'Fermi': (['2.0', '2.1(2.0)'], []),
307
+ 'Kepler+Tegra': (['3.2'], []),
308
+ 'Kepler+Tesla': (['3.7'], []),
309
+ 'Kepler': (['3.0', '3.5'], ['3.5']),
310
+ 'Maxwell+Tegra': (['5.3'], []),
311
+ 'Maxwell': (['5.0', '5.2'], ['5.2']),
312
+ 'Pascal': (['6.0', '6.1'], ['6.1']),
313
+ 'Pascal+Tegra': (['6.2'], []),
314
+ 'Volta': (['7.0'], ['7.0']),
315
+ 'Xavier': (['7.2'], []),
316
+ 'Turing': (['7.5'], ['7.5']),
317
+ 'Ampere': (cuda_ampere_bin, cuda_ampere_ptx),
318
+ 'Orin': (['8.7'], []),
319
+ 'Lovelace': (['8.9'], ['8.9']),
320
+ 'Hopper': (['9.0'], ['9.0']),
321
+ }.get(arch_name, (None, None))
322
+
323
+ if arch_bin is None:
324
+ raise InvalidArguments(f'Unknown CUDA Architecture Name {arch_name}!')
325
+
326
+ cuda_arch_bin += arch_bin
327
+
328
+ if add_ptx:
329
+ if not arch_ptx:
330
+ arch_ptx = arch_bin
331
+ cuda_arch_ptx += arch_ptx
332
+
333
+ cuda_arch_bin = sorted(set(cuda_arch_bin))
334
+ cuda_arch_ptx = sorted(set(cuda_arch_ptx))
335
+
336
+ nvcc_flags = []
337
+ nvcc_archs_readable = []
338
+
339
+ for arch in cuda_arch_bin:
340
+ arch, codev = re.fullmatch(
341
+ '([0-9]+\\.[0-9])(?:\\(([0-9]+\\.[0-9])\\))?', arch).groups()
342
+
343
+ if version_compare(arch, '<' + cuda_lo_limit_gpu_architecture):
344
+ continue
345
+ if cuda_hi_limit_gpu_architecture and version_compare(arch, '>=' + cuda_hi_limit_gpu_architecture):
346
+ continue
347
+
348
+ if codev:
349
+ arch = arch.replace('.', '')
350
+ codev = codev.replace('.', '')
351
+ nvcc_flags += ['-gencode', 'arch=compute_' + codev + ',code=sm_' + arch]
352
+ nvcc_archs_readable += ['sm_' + arch]
353
+ else:
354
+ arch = arch.replace('.', '')
355
+ nvcc_flags += ['-gencode', 'arch=compute_' + arch + ',code=sm_' + arch]
356
+ nvcc_archs_readable += ['sm_' + arch]
357
+
358
+ for arch in cuda_arch_ptx:
359
+ arch, codev = re.fullmatch(
360
+ '([0-9]+\\.[0-9])(?:\\(([0-9]+\\.[0-9])\\))?', arch).groups()
361
+
362
+ if codev:
363
+ arch = codev
364
+
365
+ if version_compare(arch, '<' + cuda_lo_limit_gpu_architecture):
366
+ continue
367
+ if cuda_hi_limit_gpu_architecture and version_compare(arch, '>=' + cuda_hi_limit_gpu_architecture):
368
+ continue
369
+
370
+ arch = arch.replace('.', '')
371
+ nvcc_flags += ['-gencode', 'arch=compute_' + arch + ',code=compute_' + arch]
372
+ nvcc_archs_readable += ['compute_' + arch]
373
+
374
+ return nvcc_flags, nvcc_archs_readable
375
+
376
+ def initialize(interp: Interpreter) -> CudaModule:
377
+ return CudaModule(interp)
@@ -0,0 +1,117 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+ # Copyright 2018 The Meson development team
3
+
4
+ # This file contains the detection logic for external dependencies that
5
+ # are UI-related.
6
+ from __future__ import annotations
7
+
8
+ import json
9
+ import os
10
+
11
+ from . import ExtensionModule, ModuleInfo
12
+ from .. import mlog
13
+ from ..dependencies import Dependency
14
+ from ..dependencies.dub import DubDependency
15
+ from ..interpreterbase import typed_pos_args
16
+ from ..mesonlib import Popen_safe, MesonException, listify
17
+
18
+ class DlangModule(ExtensionModule):
19
+ class_dubbin = None
20
+ init_dub = False
21
+
22
+ INFO = ModuleInfo('dlang', '0.48.0')
23
+
24
+ def __init__(self, interpreter):
25
+ super().__init__(interpreter)
26
+ self.methods.update({
27
+ 'generate_dub_file': self.generate_dub_file,
28
+ })
29
+
30
+ def _init_dub(self, state):
31
+ if DlangModule.class_dubbin is None:
32
+ self.dubbin = DubDependency.class_dubbin
33
+ DlangModule.class_dubbin = self.dubbin
34
+ else:
35
+ self.dubbin = DlangModule.class_dubbin
36
+
37
+ if DlangModule.class_dubbin is None:
38
+ self.dubbin = self.check_dub(state)
39
+ DlangModule.class_dubbin = self.dubbin
40
+ else:
41
+ self.dubbin = DlangModule.class_dubbin
42
+
43
+ if not self.dubbin:
44
+ if not self.dubbin:
45
+ raise MesonException('DUB not found.')
46
+
47
+ @typed_pos_args('dlang.generate_dub_file', str, str)
48
+ def generate_dub_file(self, state, args, kwargs):
49
+ if not DlangModule.init_dub:
50
+ self._init_dub(state)
51
+
52
+ config = {
53
+ 'name': args[0]
54
+ }
55
+
56
+ config_path = os.path.join(args[1], 'dub.json')
57
+ if os.path.exists(config_path):
58
+ with open(config_path, encoding='utf-8') as ofile:
59
+ try:
60
+ config = json.load(ofile)
61
+ except ValueError:
62
+ mlog.warning('Failed to load the data in dub.json')
63
+
64
+ warn_publishing = ['description', 'license']
65
+ for arg in warn_publishing:
66
+ if arg not in kwargs and \
67
+ arg not in config:
68
+ mlog.warning('Without', mlog.bold(arg), 'the DUB package can\'t be published')
69
+
70
+ for key, value in kwargs.items():
71
+ if key == 'dependencies':
72
+ values = listify(value, flatten=False)
73
+ config[key] = {}
74
+ for dep in values:
75
+ if isinstance(dep, Dependency):
76
+ name = dep.get_name()
77
+ ret, res = self._call_dubbin(['describe', name])
78
+ if ret == 0:
79
+ version = dep.get_version()
80
+ if version is None:
81
+ config[key][name] = ''
82
+ else:
83
+ config[key][name] = version
84
+ else:
85
+ config[key] = value
86
+
87
+ with open(config_path, 'w', encoding='utf-8') as ofile:
88
+ ofile.write(json.dumps(config, indent=4, ensure_ascii=False))
89
+
90
+ def _call_dubbin(self, args, env=None):
91
+ p, out = Popen_safe(self.dubbin.get_command() + args, env=env)[0:2]
92
+ return p.returncode, out.strip()
93
+
94
+ def check_dub(self, state):
95
+ dubbin = state.find_program('dub', silent=True)
96
+ if dubbin.found():
97
+ try:
98
+ p, out = Popen_safe(dubbin.get_command() + ['--version'])[0:2]
99
+ if p.returncode != 0:
100
+ mlog.warning('Found dub {!r} but couldn\'t run it'
101
+ ''.format(' '.join(dubbin.get_command())))
102
+ # Set to False instead of None to signify that we've already
103
+ # searched for it and not found it
104
+ dubbin = False
105
+ except (FileNotFoundError, PermissionError):
106
+ dubbin = False
107
+ else:
108
+ dubbin = False
109
+ if dubbin:
110
+ mlog.log('Found DUB:', mlog.bold(dubbin.get_path()),
111
+ '(%s)' % out.strip())
112
+ else:
113
+ mlog.log('Found DUB:', mlog.red('NO'))
114
+ return dubbin
115
+
116
+ def initialize(*args, **kwargs):
117
+ return DlangModule(*args, **kwargs)