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,80 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+ # Copyright 2013-2019 The Meson development team
3
+
4
+ from __future__ import annotations
5
+
6
+ import functools
7
+ import typing as T
8
+
9
+ from .base import DependencyMethods, detect_compiler, SystemDependency
10
+ from .cmake import CMakeDependency
11
+ from .detect import packages
12
+ from .pkgconfig import PkgConfigDependency
13
+ from .factory import factory_methods
14
+
15
+ if T.TYPE_CHECKING:
16
+ from . factory import DependencyGenerator
17
+ from ..environment import Environment
18
+ from ..mesonlib import MachineChoice
19
+
20
+
21
+ @factory_methods({DependencyMethods.PKGCONFIG, DependencyMethods.CMAKE, DependencyMethods.SYSTEM})
22
+ def coarray_factory(env: 'Environment',
23
+ for_machine: 'MachineChoice',
24
+ kwargs: T.Dict[str, T.Any],
25
+ methods: T.List[DependencyMethods]) -> T.List['DependencyGenerator']:
26
+ fcid = detect_compiler('coarray', env, for_machine, 'fortran').get_id()
27
+ candidates: T.List['DependencyGenerator'] = []
28
+
29
+ if fcid == 'gcc':
30
+ # OpenCoarrays is the most commonly used method for Fortran Coarray with GCC
31
+ if DependencyMethods.PKGCONFIG in methods:
32
+ for pkg in ['caf-openmpi', 'caf']:
33
+ candidates.append(functools.partial(
34
+ PkgConfigDependency, pkg, env, kwargs, language='fortran'))
35
+
36
+ if DependencyMethods.CMAKE in methods:
37
+ if 'modules' not in kwargs:
38
+ kwargs['modules'] = 'OpenCoarrays::caf_mpi'
39
+ candidates.append(functools.partial(
40
+ CMakeDependency, 'OpenCoarrays', env, kwargs, language='fortran'))
41
+
42
+ if DependencyMethods.SYSTEM in methods:
43
+ candidates.append(functools.partial(CoarrayDependency, env, kwargs))
44
+
45
+ return candidates
46
+ packages['coarray'] = coarray_factory
47
+
48
+
49
+ class CoarrayDependency(SystemDependency):
50
+ """
51
+ Coarrays are a Fortran 2008 feature.
52
+
53
+ Coarrays are sometimes implemented via external library (GCC+OpenCoarrays),
54
+ while other compilers just build in support (Cray, IBM, Intel, NAG).
55
+ Coarrays may be thought of as a high-level language abstraction of
56
+ low-level MPI calls.
57
+ """
58
+ def __init__(self, environment: 'Environment', kwargs: T.Dict[str, T.Any]) -> None:
59
+ super().__init__('coarray', environment, kwargs, language='fortran')
60
+ kwargs['required'] = False
61
+ kwargs['silent'] = True
62
+
63
+ cid = self.get_compiler().get_id()
64
+ if cid == 'gcc':
65
+ # Fallback to single image
66
+ self.compile_args = ['-fcoarray=single']
67
+ self.version = 'single image (fallback)'
68
+ self.is_found = True
69
+ elif cid == 'intel':
70
+ # Coarrays are built into Intel compilers, no external library needed
71
+ self.is_found = True
72
+ self.link_args = ['-coarray=shared']
73
+ self.compile_args = self.link_args
74
+ elif cid == 'intel-cl':
75
+ # Coarrays are built into Intel compilers, no external library needed
76
+ self.is_found = True
77
+ self.compile_args = ['/Qcoarray:shared']
78
+ elif cid == 'nagfor':
79
+ # NAG doesn't require any special arguments for Coarray
80
+ self.is_found = True
@@ -0,0 +1,163 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+ # Copyright 2013-2021 The Meson development team
3
+
4
+ from __future__ import annotations
5
+
6
+ from .base import ExternalDependency, DependencyException, DependencyTypeName
7
+ from ..mesonlib import listify, Popen_safe, Popen_safe_logged, split_args, version_compare, version_compare_many
8
+ from ..programs import find_external_program
9
+ from .. import mlog
10
+ import re
11
+ import typing as T
12
+
13
+ from mesonbuild import mesonlib
14
+
15
+ if T.TYPE_CHECKING:
16
+ from ..environment import Environment
17
+ from ..interpreter.type_checking import PkgConfigDefineType
18
+
19
+ class ConfigToolDependency(ExternalDependency):
20
+
21
+ """Class representing dependencies found using a config tool.
22
+
23
+ Takes the following extra keys in kwargs that it uses internally:
24
+ :tools List[str]: A list of tool names to use
25
+ :version_arg str: The argument to pass to the tool to get it's version
26
+ :skip_version str: The argument to pass to the tool to ignore its version
27
+ (if ``version_arg`` fails, but it may start accepting it in the future)
28
+ Because some tools are stupid and don't accept --version
29
+ :returncode_value int: The value of the correct returncode
30
+ Because some tools are stupid and don't return 0
31
+ """
32
+
33
+ tools: T.Optional[T.List[str]] = None
34
+ tool_name: T.Optional[str] = None
35
+ version_arg = '--version'
36
+ skip_version: T.Optional[str] = None
37
+ allow_default_for_cross = False
38
+ __strip_version = re.compile(r'^[0-9][0-9.]+')
39
+
40
+ def __init__(self, name: str, environment: 'Environment', kwargs: T.Dict[str, T.Any], language: T.Optional[str] = None):
41
+ super().__init__(DependencyTypeName('config-tool'), environment, kwargs, language=language)
42
+ self.name = name
43
+ # You may want to overwrite the class version in some cases
44
+ self.tools = listify(kwargs.get('tools', self.tools))
45
+ if not self.tool_name:
46
+ self.tool_name = self.tools[0]
47
+ if 'version_arg' in kwargs:
48
+ self.version_arg = kwargs['version_arg']
49
+
50
+ req_version_raw = kwargs.get('version', None)
51
+ if req_version_raw is not None:
52
+ req_version = mesonlib.stringlistify(req_version_raw)
53
+ else:
54
+ req_version = []
55
+ tool, version = self.find_config(req_version, kwargs.get('returncode_value', 0))
56
+ self.config = tool
57
+ self.is_found = self.report_config(version, req_version)
58
+ if not self.is_found:
59
+ self.config = None
60
+ return
61
+ self.version = version
62
+
63
+ def _sanitize_version(self, version: str) -> str:
64
+ """Remove any non-numeric, non-point version suffixes."""
65
+ m = self.__strip_version.match(version)
66
+ if m:
67
+ # Ensure that there isn't a trailing '.', such as an input like
68
+ # `1.2.3.git-1234`
69
+ return m.group(0).rstrip('.')
70
+ return version
71
+
72
+ def find_config(self, versions: T.List[str], returncode: int = 0) \
73
+ -> T.Tuple[T.Optional[T.List[str]], T.Optional[str]]:
74
+ """Helper method that searches for config tool binaries in PATH and
75
+ returns the one that best matches the given version requirements.
76
+ """
77
+ best_match: T.Tuple[T.Optional[T.List[str]], T.Optional[str]] = (None, None)
78
+ for potential_bin in find_external_program(
79
+ self.env, self.for_machine, self.tool_name,
80
+ self.tool_name, self.tools, allow_default_for_cross=self.allow_default_for_cross):
81
+ if not potential_bin.found():
82
+ continue
83
+ tool = potential_bin.get_command()
84
+ try:
85
+ p, out = Popen_safe(tool + [self.version_arg])[:2]
86
+ except (FileNotFoundError, PermissionError):
87
+ continue
88
+ if p.returncode != returncode:
89
+ if self.skip_version:
90
+ # maybe the executable is valid even if it doesn't support --version
91
+ p = Popen_safe(tool + [self.skip_version])[0]
92
+ if p.returncode != returncode:
93
+ continue
94
+ else:
95
+ continue
96
+
97
+ out = self._sanitize_version(out.strip())
98
+ # Some tools, like pcap-config don't supply a version, but also
99
+ # don't fail with --version, in that case just assume that there is
100
+ # only one version and return it.
101
+ if not out:
102
+ return (tool, None)
103
+ if versions:
104
+ is_found = version_compare_many(out, versions)[0]
105
+ # This allows returning a found version without a config tool,
106
+ # which is useful to inform the user that you found version x,
107
+ # but y was required.
108
+ if not is_found:
109
+ tool = None
110
+ if best_match[1]:
111
+ if version_compare(out, '> {}'.format(best_match[1])):
112
+ best_match = (tool, out)
113
+ else:
114
+ best_match = (tool, out)
115
+
116
+ return best_match
117
+
118
+ def report_config(self, version: T.Optional[str], req_version: T.List[str]) -> bool:
119
+ """Helper method to print messages about the tool."""
120
+
121
+ found_msg: T.List[T.Union[str, mlog.AnsiDecorator]] = [mlog.bold(self.tool_name), 'found:']
122
+
123
+ if self.config is None:
124
+ found_msg.append(mlog.red('NO'))
125
+ if version is not None and req_version:
126
+ found_msg.append(f'found {version!r} but need {req_version!r}')
127
+ elif req_version:
128
+ found_msg.append(f'need {req_version!r}')
129
+ else:
130
+ found_msg += [mlog.green('YES'), '({})'.format(' '.join(self.config)), version]
131
+
132
+ mlog.log(*found_msg)
133
+
134
+ return self.config is not None
135
+
136
+ def get_config_value(self, args: T.List[str], stage: str) -> T.List[str]:
137
+ p, out, err = Popen_safe_logged(self.config + args)
138
+ if p.returncode != 0:
139
+ if self.required:
140
+ raise DependencyException(f'Could not generate {stage} for {self.name}.\n{err}')
141
+ return []
142
+ return split_args(out)
143
+
144
+ def get_variable_args(self, variable_name: str) -> T.List[str]:
145
+ return [f'--{variable_name}']
146
+
147
+ @staticmethod
148
+ def log_tried() -> str:
149
+ return 'config-tool'
150
+
151
+ def get_variable(self, *, cmake: T.Optional[str] = None, pkgconfig: T.Optional[str] = None,
152
+ configtool: T.Optional[str] = None, internal: T.Optional[str] = None,
153
+ default_value: T.Optional[str] = None,
154
+ pkgconfig_define: PkgConfigDefineType = None) -> str:
155
+ if configtool:
156
+ p, out, _ = Popen_safe(self.config + self.get_variable_args(configtool))
157
+ if p.returncode == 0:
158
+ variable = out.strip()
159
+ mlog.debug(f'Got config-tool variable {configtool} : {variable}')
160
+ return variable
161
+ if default_value is not None:
162
+ return default_value
163
+ raise DependencyException(f'Could not get config-tool variable and no default provided for {self!r}')
@@ -0,0 +1,295 @@
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 re
8
+ import os
9
+ import typing as T
10
+ from pathlib import Path
11
+
12
+ from .. import mesonlib
13
+ from .. import mlog
14
+ from ..environment import detect_cpu_family
15
+ from .base import DependencyException, SystemDependency
16
+ from .detect import packages
17
+
18
+
19
+ if T.TYPE_CHECKING:
20
+ from ..environment import Environment
21
+ from ..compilers import Compiler
22
+
23
+ TV_ResultTuple = T.Tuple[T.Optional[str], T.Optional[str], bool]
24
+
25
+ class CudaDependency(SystemDependency):
26
+
27
+ supported_languages = ['cuda', 'cpp', 'c'] # see also _default_language
28
+
29
+ def __init__(self, environment: 'Environment', kwargs: T.Dict[str, T.Any]) -> None:
30
+ compilers = environment.coredata.compilers[self.get_for_machine_from_kwargs(kwargs)]
31
+ language = self._detect_language(compilers)
32
+ if language not in self.supported_languages:
33
+ raise DependencyException(f'Language \'{language}\' is not supported by the CUDA Toolkit. Supported languages are {self.supported_languages}.')
34
+
35
+ super().__init__('cuda', environment, kwargs, language=language)
36
+ self.lib_modules: T.Dict[str, T.List[str]] = {}
37
+ self.requested_modules = self.get_requested(kwargs)
38
+ if not any(runtime in self.requested_modules for runtime in ['cudart', 'cudart_static']):
39
+ # By default, we prefer to link the static CUDA runtime, since this is what nvcc also does by default:
40
+ # https://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html#cudart-none-shared-static-cudart
41
+ req_modules = ['cudart']
42
+ if kwargs.get('static', True):
43
+ req_modules = ['cudart_static']
44
+ machine = self.env.machines[self.for_machine]
45
+ if machine.is_linux():
46
+ # extracted by running
47
+ # nvcc -v foo.o
48
+ req_modules += ['rt', 'pthread', 'dl']
49
+ self.requested_modules = req_modules + self.requested_modules
50
+
51
+ (self.cuda_path, self.version, self.is_found) = self._detect_cuda_path_and_version()
52
+ if not self.is_found:
53
+ return
54
+
55
+ if not os.path.isabs(self.cuda_path):
56
+ raise DependencyException(f'CUDA Toolkit path must be absolute, got \'{self.cuda_path}\'.')
57
+
58
+ # nvcc already knows where to find the CUDA Toolkit, but if we're compiling
59
+ # a mixed C/C++/CUDA project, we still need to make the include dir searchable
60
+ if self.language != 'cuda' or len(compilers) > 1:
61
+ self.incdir = os.path.join(self.cuda_path, 'include')
62
+ self.compile_args += [f'-I{self.incdir}']
63
+
64
+ if self.language != 'cuda':
65
+ arch_libdir = self._detect_arch_libdir()
66
+ self.libdir = os.path.join(self.cuda_path, arch_libdir)
67
+ mlog.debug('CUDA library directory is', mlog.bold(self.libdir))
68
+ else:
69
+ self.libdir = None
70
+
71
+ self.is_found = self._find_requested_libraries()
72
+
73
+ @classmethod
74
+ def _detect_language(cls, compilers: T.Dict[str, 'Compiler']) -> str:
75
+ for lang in cls.supported_languages:
76
+ if lang in compilers:
77
+ return lang
78
+ return list(compilers.keys())[0]
79
+
80
+ def _detect_cuda_path_and_version(self) -> TV_ResultTuple:
81
+ self.env_var = self._default_path_env_var()
82
+ mlog.debug('Default path env var:', mlog.bold(self.env_var))
83
+
84
+ version_reqs = self.version_reqs
85
+ if self.language == 'cuda':
86
+ nvcc_version = self._strip_patch_version(self.get_compiler().version)
87
+ mlog.debug('nvcc version:', mlog.bold(nvcc_version))
88
+ if version_reqs:
89
+ # make sure nvcc version satisfies specified version requirements
90
+ (found_some, not_found, found) = mesonlib.version_compare_many(nvcc_version, version_reqs)
91
+ if not_found:
92
+ msg = f'The current nvcc version {nvcc_version} does not satisfy the specified CUDA Toolkit version requirements {version_reqs}.'
93
+ return self._report_dependency_error(msg, (None, None, False))
94
+
95
+ # use nvcc version to find a matching CUDA Toolkit
96
+ version_reqs = [f'={nvcc_version}']
97
+ else:
98
+ nvcc_version = None
99
+
100
+ paths = [(path, self._cuda_toolkit_version(path), default) for (path, default) in self._cuda_paths()]
101
+ if version_reqs:
102
+ return self._find_matching_toolkit(paths, version_reqs, nvcc_version)
103
+
104
+ defaults = [(path, version) for (path, version, default) in paths if default]
105
+ if defaults:
106
+ return (defaults[0][0], defaults[0][1], True)
107
+
108
+ platform_msg = 'set the CUDA_PATH environment variable' if self._is_windows() \
109
+ else 'set the CUDA_PATH environment variable/create the \'/usr/local/cuda\' symbolic link'
110
+ msg = f'Please specify the desired CUDA Toolkit version (e.g. dependency(\'cuda\', version : \'>=10.1\')) or {platform_msg} to point to the location of your desired version.'
111
+ return self._report_dependency_error(msg, (None, None, False))
112
+
113
+ def _find_matching_toolkit(self, paths: T.List[TV_ResultTuple], version_reqs: T.List[str], nvcc_version: T.Optional[str]) -> TV_ResultTuple:
114
+ # keep the default paths order intact, sort the rest in the descending order
115
+ # according to the toolkit version
116
+ part_func: T.Callable[[TV_ResultTuple], bool] = lambda t: not t[2]
117
+ defaults_it, rest_it = mesonlib.partition(part_func, paths)
118
+ defaults = list(defaults_it)
119
+ paths = defaults + sorted(rest_it, key=lambda t: mesonlib.Version(t[1]), reverse=True)
120
+ mlog.debug(f'Search paths: {paths}')
121
+
122
+ if nvcc_version and defaults:
123
+ default_src = f"the {self.env_var} environment variable" if self.env_var else "the \'/usr/local/cuda\' symbolic link"
124
+ nvcc_warning = 'The default CUDA Toolkit as designated by {} ({}) doesn\'t match the current nvcc version {} and will be ignored.'.format(default_src, os.path.realpath(defaults[0][0]), nvcc_version)
125
+ else:
126
+ nvcc_warning = None
127
+
128
+ for (path, version, default) in paths:
129
+ (found_some, not_found, found) = mesonlib.version_compare_many(version, version_reqs)
130
+ if not not_found:
131
+ if not default and nvcc_warning:
132
+ mlog.warning(nvcc_warning)
133
+ return (path, version, True)
134
+
135
+ if nvcc_warning:
136
+ mlog.warning(nvcc_warning)
137
+ return (None, None, False)
138
+
139
+ def _default_path_env_var(self) -> T.Optional[str]:
140
+ env_vars = ['CUDA_PATH'] if self._is_windows() else ['CUDA_PATH', 'CUDA_HOME', 'CUDA_ROOT']
141
+ env_vars = [var for var in env_vars if var in os.environ]
142
+ user_defaults = {os.environ[var] for var in env_vars}
143
+ if len(user_defaults) > 1:
144
+ mlog.warning('Environment variables {} point to conflicting toolkit locations ({}). Toolkit selection might produce unexpected results.'.format(', '.join(env_vars), ', '.join(user_defaults)))
145
+ return env_vars[0] if env_vars else None
146
+
147
+ def _cuda_paths(self) -> T.List[T.Tuple[str, bool]]:
148
+ return ([(os.environ[self.env_var], True)] if self.env_var else []) \
149
+ + (self._cuda_paths_win() if self._is_windows() else self._cuda_paths_nix())
150
+
151
+ def _cuda_paths_win(self) -> T.List[T.Tuple[str, bool]]:
152
+ env_vars = os.environ.keys()
153
+ return [(os.environ[var], False) for var in env_vars if var.startswith('CUDA_PATH_')]
154
+
155
+ def _cuda_paths_nix(self) -> T.List[T.Tuple[str, bool]]:
156
+ # include /usr/local/cuda default only if no env_var was found
157
+ pattern = '/usr/local/cuda-*' if self.env_var else '/usr/local/cuda*'
158
+ return [(path, os.path.basename(path) == 'cuda') for path in glob.iglob(pattern)]
159
+
160
+ toolkit_version_regex = re.compile(r'^CUDA Version\s+(.*)$')
161
+ path_version_win_regex = re.compile(r'^v(.*)$')
162
+ path_version_nix_regex = re.compile(r'^cuda-(.*)$')
163
+ cudart_version_regex = re.compile(r'#define\s+CUDART_VERSION\s+([0-9]+)')
164
+
165
+ def _cuda_toolkit_version(self, path: str) -> str:
166
+ version = self._read_toolkit_version_txt(path)
167
+ if version:
168
+ return version
169
+ version = self._read_cuda_runtime_api_version(path)
170
+ if version:
171
+ return version
172
+
173
+ mlog.debug('Falling back to extracting version from path')
174
+ path_version_regex = self.path_version_win_regex if self._is_windows() else self.path_version_nix_regex
175
+ try:
176
+ m = path_version_regex.match(os.path.basename(path))
177
+ if m:
178
+ return m.group(1)
179
+ else:
180
+ mlog.warning(f'Could not detect CUDA Toolkit version for {path}')
181
+ except Exception as e:
182
+ mlog.warning(f'Could not detect CUDA Toolkit version for {path}: {e!s}')
183
+
184
+ return '0.0'
185
+
186
+ def _read_cuda_runtime_api_version(self, path_str: str) -> T.Optional[str]:
187
+ path = Path(path_str)
188
+ for i in path.rglob('cuda_runtime_api.h'):
189
+ raw = i.read_text(encoding='utf-8')
190
+ m = self.cudart_version_regex.search(raw)
191
+ if not m:
192
+ continue
193
+ try:
194
+ vers_int = int(m.group(1))
195
+ except ValueError:
196
+ continue
197
+ # use // for floor instead of / which produces a float
198
+ major = vers_int // 1000
199
+ minor = (vers_int - major * 1000) // 10
200
+ return f'{major}.{minor}'
201
+ return None
202
+
203
+ def _read_toolkit_version_txt(self, path: str) -> T.Optional[str]:
204
+ # Read 'version.txt' at the root of the CUDA Toolkit directory to determine the toolkit version
205
+ version_file_path = os.path.join(path, 'version.txt')
206
+ try:
207
+ with open(version_file_path, encoding='utf-8') as version_file:
208
+ version_str = version_file.readline() # e.g. 'CUDA Version 10.1.168'
209
+ m = self.toolkit_version_regex.match(version_str)
210
+ if m:
211
+ return self._strip_patch_version(m.group(1))
212
+ except Exception as e:
213
+ mlog.debug(f'Could not read CUDA Toolkit\'s version file {version_file_path}: {e!s}')
214
+
215
+ return None
216
+
217
+ @classmethod
218
+ def _strip_patch_version(cls, version: str) -> str:
219
+ return '.'.join(version.split('.')[:2])
220
+
221
+ def _detect_arch_libdir(self) -> str:
222
+ arch = detect_cpu_family(self.env.coredata.compilers.host)
223
+ machine = self.env.machines[self.for_machine]
224
+ msg = '{} architecture is not supported in {} version of the CUDA Toolkit.'
225
+ if machine.is_windows():
226
+ libdirs = {'x86': 'Win32', 'x86_64': 'x64'}
227
+ if arch not in libdirs:
228
+ raise DependencyException(msg.format(arch, 'Windows'))
229
+ return os.path.join('lib', libdirs[arch])
230
+ elif machine.is_linux():
231
+ libdirs = {'x86_64': 'lib64', 'ppc64': 'lib', 'aarch64': 'lib64', 'loongarch64': 'lib64'}
232
+ if arch not in libdirs:
233
+ raise DependencyException(msg.format(arch, 'Linux'))
234
+ return libdirs[arch]
235
+ elif machine.is_darwin():
236
+ libdirs = {'x86_64': 'lib64'}
237
+ if arch not in libdirs:
238
+ raise DependencyException(msg.format(arch, 'macOS'))
239
+ return libdirs[arch]
240
+ else:
241
+ raise DependencyException('CUDA Toolkit: unsupported platform.')
242
+
243
+ def _find_requested_libraries(self) -> bool:
244
+ all_found = True
245
+
246
+ for module in self.requested_modules:
247
+ args = self.clib_compiler.find_library(module, self.env, [self.libdir] if self.libdir else [])
248
+ if args is None:
249
+ self._report_dependency_error(f'Couldn\'t find requested CUDA module \'{module}\'')
250
+ all_found = False
251
+ else:
252
+ mlog.debug(f'Link args for CUDA module \'{module}\' are {args}')
253
+ self.lib_modules[module] = args
254
+
255
+ return all_found
256
+
257
+ def _is_windows(self) -> bool:
258
+ return self.env.machines[self.for_machine].is_windows()
259
+
260
+ @T.overload
261
+ def _report_dependency_error(self, msg: str) -> None: ...
262
+
263
+ @T.overload
264
+ def _report_dependency_error(self, msg: str, ret_val: TV_ResultTuple) -> TV_ResultTuple: ... # noqa: F811
265
+
266
+ def _report_dependency_error(self, msg: str, ret_val: T.Optional[TV_ResultTuple] = None) -> T.Optional[TV_ResultTuple]: # noqa: F811
267
+ if self.required:
268
+ raise DependencyException(msg)
269
+
270
+ mlog.debug(msg)
271
+ return ret_val
272
+
273
+ def log_details(self) -> str:
274
+ module_str = ', '.join(self.requested_modules)
275
+ return 'modules: ' + module_str
276
+
277
+ def log_info(self) -> str:
278
+ return self.cuda_path if self.cuda_path else ''
279
+
280
+ def get_requested(self, kwargs: T.Dict[str, T.Any]) -> T.List[str]:
281
+ candidates = mesonlib.extract_as_list(kwargs, 'modules')
282
+ for c in candidates:
283
+ if not isinstance(c, str):
284
+ raise DependencyException('CUDA module argument is not a string.')
285
+ return candidates
286
+
287
+ def get_link_args(self, language: T.Optional[str] = None, raw: bool = False) -> T.List[str]:
288
+ args: T.List[str] = []
289
+ if self.libdir:
290
+ args += self.clib_compiler.get_linker_search_args(self.libdir)
291
+ for lib in self.requested_modules:
292
+ args += self.lib_modules[lib]
293
+ return args
294
+
295
+ packages['cuda'] = CudaDependency
@@ -0,0 +1,102 @@
1
+ # fail noisily if attempt to use this file without setting:
2
+ # cmake_minimum_required(VERSION ${CMAKE_VERSION})
3
+ # project(... LANGUAGES ...)
4
+
5
+ cmake_policy(SET CMP0000 NEW)
6
+
7
+ set(PACKAGE_FOUND FALSE)
8
+ set(_packageName "${NAME}")
9
+ string(TOUPPER "${_packageName}" PACKAGE_NAME)
10
+
11
+ if("${STATIC}" STREQUAL "True")
12
+ set("${NAME}_USE_STATIC_LIBS" "ON")
13
+ endif()
14
+
15
+ while(TRUE)
16
+ if ("${VERSION}" STREQUAL "")
17
+ find_package("${NAME}" QUIET COMPONENTS ${COMPS})
18
+ else()
19
+ find_package("${NAME}" "${VERSION}" QUIET COMPONENTS ${COMPS})
20
+ endif()
21
+
22
+ # ARCHS has to be set via the CMD interface
23
+ if(${_packageName}_FOUND OR ${PACKAGE_NAME}_FOUND OR "${ARCHS}" STREQUAL "")
24
+ break()
25
+ endif()
26
+
27
+ list(GET ARCHS 0 CMAKE_LIBRARY_ARCHITECTURE)
28
+ list(REMOVE_AT ARCHS 0)
29
+ endwhile()
30
+
31
+ if(${_packageName}_FOUND OR ${PACKAGE_NAME}_FOUND)
32
+ set(PACKAGE_FOUND TRUE)
33
+
34
+ # Check the following variables:
35
+ # FOO_VERSION
36
+ # Foo_VERSION
37
+ # FOO_VERSION_STRING
38
+ # Foo_VERSION_STRING
39
+ if(NOT DEFINED PACKAGE_VERSION)
40
+ if(DEFINED ${_packageName}_VERSION)
41
+ set(PACKAGE_VERSION "${${_packageName}_VERSION}")
42
+ elseif(DEFINED ${PACKAGE_NAME}_VERSION)
43
+ set(PACKAGE_VERSION "${${PACKAGE_NAME}_VERSION}")
44
+ elseif(DEFINED ${_packageName}_VERSION_STRING)
45
+ set(PACKAGE_VERSION "${${_packageName}_VERSION_STRING}")
46
+ elseif(DEFINED ${PACKAGE_NAME}_VERSION_STRING)
47
+ set(PACKAGE_VERSION "${${PACKAGE_NAME}_VERSION_STRING}")
48
+ endif()
49
+ endif()
50
+
51
+ # Check the following variables:
52
+ # FOO_LIBRARIES
53
+ # Foo_LIBRARIES
54
+ # FOO_LIBS
55
+ # Foo_LIBS
56
+ set(libs)
57
+ if(DEFINED ${_packageName}_LIBRARIES)
58
+ set(libs ${_packageName}_LIBRARIES)
59
+ elseif(DEFINED ${PACKAGE_NAME}_LIBRARIES)
60
+ set(libs ${PACKAGE_NAME}_LIBRARIES)
61
+ elseif(DEFINED ${_packageName}_LIBS)
62
+ set(libs ${_packageName}_LIBS)
63
+ elseif(DEFINED ${PACKAGE_NAME}_LIBS)
64
+ set(libs ${PACKAGE_NAME}_LIBS)
65
+ endif()
66
+
67
+ # Check the following variables:
68
+ # FOO_INCLUDE_DIRS
69
+ # Foo_INCLUDE_DIRS
70
+ # FOO_INCLUDES
71
+ # Foo_INCLUDES
72
+ # FOO_INCLUDE_DIR
73
+ # Foo_INCLUDE_DIR
74
+ set(includes)
75
+ if(DEFINED ${_packageName}_INCLUDE_DIRS)
76
+ set(includes ${_packageName}_INCLUDE_DIRS)
77
+ elseif(DEFINED ${PACKAGE_NAME}_INCLUDE_DIRS)
78
+ set(includes ${PACKAGE_NAME}_INCLUDE_DIRS)
79
+ elseif(DEFINED ${_packageName}_INCLUDES)
80
+ set(includes ${_packageName}_INCLUDES)
81
+ elseif(DEFINED ${PACKAGE_NAME}_INCLUDES)
82
+ set(includes ${PACKAGE_NAME}_INCLUDES)
83
+ elseif(DEFINED ${_packageName}_INCLUDE_DIR)
84
+ set(includes ${_packageName}_INCLUDE_DIR)
85
+ elseif(DEFINED ${PACKAGE_NAME}_INCLUDE_DIR)
86
+ set(includes ${PACKAGE_NAME}_INCLUDE_DIR)
87
+ endif()
88
+
89
+ # Check the following variables:
90
+ # FOO_DEFINITIONS
91
+ # Foo_DEFINITIONS
92
+ set(definitions)
93
+ if(DEFINED ${_packageName}_DEFINITIONS)
94
+ set(definitions ${_packageName}_DEFINITIONS)
95
+ elseif(DEFINED ${PACKAGE_NAME}_DEFINITIONS)
96
+ set(definitions ${PACKAGE_NAME}_DEFINITIONS)
97
+ endif()
98
+
99
+ set(PACKAGE_INCLUDE_DIRS "${${includes}}")
100
+ set(PACKAGE_DEFINITIONS "${${definitions}}")
101
+ set(PACKAGE_LIBRARIES "${${libs}}")
102
+ endif()