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,1096 @@
1
+ from __future__ import annotations
2
+ import os
3
+ import shlex
4
+ import subprocess
5
+ import copy
6
+ import textwrap
7
+
8
+ from pathlib import Path, PurePath
9
+
10
+ from .. import mesonlib
11
+ from .. import coredata
12
+ from .. import build
13
+ from .. import mlog
14
+
15
+ from ..modules import ModuleReturnValue, ModuleObject, ModuleState, ExtensionModule
16
+ from ..backend.backends import TestProtocol
17
+ from ..interpreterbase import (
18
+ ContainerTypeInfo, KwargInfo, MesonOperator,
19
+ MesonInterpreterObject, ObjectHolder, MutableInterpreterObject,
20
+ FeatureNew, FeatureDeprecated,
21
+ typed_pos_args, typed_kwargs, typed_operator,
22
+ noArgsFlattening, noPosargs, noKwargs, unholder_return,
23
+ flatten, resolve_second_level_holders, InterpreterException, InvalidArguments, InvalidCode)
24
+ from ..interpreter.type_checking import NoneType, ENV_KW, ENV_SEPARATOR_KW, PKGCONFIG_DEFINE_KW
25
+ from ..dependencies import Dependency, ExternalLibrary, InternalDependency
26
+ from ..programs import ExternalProgram
27
+ from ..mesonlib import HoldableObject, OptionKey, listify, Popen_safe
28
+
29
+ import typing as T
30
+
31
+ if T.TYPE_CHECKING:
32
+ from . import kwargs
33
+ from ..cmake.interpreter import CMakeInterpreter
34
+ from ..envconfig import MachineInfo
35
+ from ..interpreterbase import FeatureCheckBase, InterpreterObject, SubProject, TYPE_var, TYPE_kwargs, TYPE_nvar, TYPE_nkwargs
36
+ from .interpreter import Interpreter
37
+
38
+ from typing_extensions import TypedDict
39
+
40
+ class EnvironmentSeparatorKW(TypedDict):
41
+
42
+ separator: str
43
+
44
+ _ERROR_MSG_KW: KwargInfo[T.Optional[str]] = KwargInfo('error_message', (str, NoneType))
45
+
46
+
47
+ def extract_required_kwarg(kwargs: 'kwargs.ExtractRequired',
48
+ subproject: 'SubProject',
49
+ feature_check: T.Optional[FeatureCheckBase] = None,
50
+ default: bool = True) -> T.Tuple[bool, bool, T.Optional[str]]:
51
+ val = kwargs.get('required', default)
52
+ disabled = False
53
+ required = False
54
+ feature: T.Optional[str] = None
55
+ if isinstance(val, coredata.UserFeatureOption):
56
+ if not feature_check:
57
+ feature_check = FeatureNew('User option "feature"', '0.47.0')
58
+ feature_check.use(subproject)
59
+ feature = val.name
60
+ if val.is_disabled():
61
+ disabled = True
62
+ elif val.is_enabled():
63
+ required = True
64
+ elif isinstance(val, bool):
65
+ required = val
66
+ else:
67
+ raise InterpreterException('required keyword argument must be boolean or a feature option')
68
+
69
+ # Keep boolean value in kwargs to simplify other places where this kwarg is
70
+ # checked.
71
+ # TODO: this should be removed, and those callers should learn about FeatureOptions
72
+ kwargs['required'] = required
73
+
74
+ return disabled, required, feature
75
+
76
+ def extract_search_dirs(kwargs: 'kwargs.ExtractSearchDirs') -> T.List[str]:
77
+ search_dirs_str = mesonlib.stringlistify(kwargs.get('dirs', []))
78
+ search_dirs = [Path(d).expanduser() for d in search_dirs_str]
79
+ for d in search_dirs:
80
+ if mesonlib.is_windows() and d.root.startswith('\\'):
81
+ # a Unix-path starting with `/` that is not absolute on Windows.
82
+ # discard without failing for end-user ease of cross-platform directory arrays
83
+ continue
84
+ if not d.is_absolute():
85
+ raise InvalidCode(f'Search directory {d} is not an absolute path.')
86
+ return [str(s) for s in search_dirs]
87
+
88
+ class FeatureOptionHolder(ObjectHolder[coredata.UserFeatureOption]):
89
+ def __init__(self, option: coredata.UserFeatureOption, interpreter: 'Interpreter'):
90
+ super().__init__(option, interpreter)
91
+ if option and option.is_auto():
92
+ # TODO: we need to cast here because options is not a TypedDict
93
+ auto = T.cast('coredata.UserFeatureOption', self.env.coredata.options[OptionKey('auto_features')])
94
+ self.held_object = copy.copy(auto)
95
+ self.held_object.name = option.name
96
+ self.methods.update({'enabled': self.enabled_method,
97
+ 'disabled': self.disabled_method,
98
+ 'allowed': self.allowed_method,
99
+ 'auto': self.auto_method,
100
+ 'require': self.require_method,
101
+ 'disable_auto_if': self.disable_auto_if_method,
102
+ 'enable_auto_if': self.enable_auto_if_method,
103
+ 'disable_if': self.disable_if_method,
104
+ 'enable_if': self.enable_if_method,
105
+ })
106
+
107
+ @property
108
+ def value(self) -> str:
109
+ return 'disabled' if not self.held_object else self.held_object.value
110
+
111
+ def as_disabled(self) -> coredata.UserFeatureOption:
112
+ disabled = copy.deepcopy(self.held_object)
113
+ disabled.value = 'disabled'
114
+ return disabled
115
+
116
+ def as_enabled(self) -> coredata.UserFeatureOption:
117
+ enabled = copy.deepcopy(self.held_object)
118
+ enabled.value = 'enabled'
119
+ return enabled
120
+
121
+ @noPosargs
122
+ @noKwargs
123
+ def enabled_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> bool:
124
+ return self.value == 'enabled'
125
+
126
+ @noPosargs
127
+ @noKwargs
128
+ def disabled_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> bool:
129
+ return self.value == 'disabled'
130
+
131
+ @noPosargs
132
+ @noKwargs
133
+ @FeatureNew('feature_option.allowed()', '0.59.0')
134
+ def allowed_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> bool:
135
+ return self.value != 'disabled'
136
+
137
+ @noPosargs
138
+ @noKwargs
139
+ def auto_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> bool:
140
+ return self.value == 'auto'
141
+
142
+ def _disable_if(self, condition: bool, message: T.Optional[str]) -> coredata.UserFeatureOption:
143
+ if not condition:
144
+ return copy.deepcopy(self.held_object)
145
+
146
+ if self.value == 'enabled':
147
+ err_msg = f'Feature {self.held_object.name} cannot be enabled'
148
+ if message:
149
+ err_msg += f': {message}'
150
+ raise InterpreterException(err_msg)
151
+ return self.as_disabled()
152
+
153
+ @FeatureNew('feature_option.require()', '0.59.0')
154
+ @typed_pos_args('feature_option.require', bool)
155
+ @typed_kwargs(
156
+ 'feature_option.require',
157
+ _ERROR_MSG_KW,
158
+ )
159
+ def require_method(self, args: T.Tuple[bool], kwargs: 'kwargs.FeatureOptionRequire') -> coredata.UserFeatureOption:
160
+ return self._disable_if(not args[0], kwargs['error_message'])
161
+
162
+ @FeatureNew('feature_option.disable_if()', '1.1.0')
163
+ @typed_pos_args('feature_option.disable_if', bool)
164
+ @typed_kwargs(
165
+ 'feature_option.disable_if',
166
+ _ERROR_MSG_KW,
167
+ )
168
+ def disable_if_method(self, args: T.Tuple[bool], kwargs: 'kwargs.FeatureOptionRequire') -> coredata.UserFeatureOption:
169
+ return self._disable_if(args[0], kwargs['error_message'])
170
+
171
+ @FeatureNew('feature_option.enable_if()', '1.1.0')
172
+ @typed_pos_args('feature_option.enable_if', bool)
173
+ @typed_kwargs(
174
+ 'feature_option.enable_if',
175
+ _ERROR_MSG_KW,
176
+ )
177
+ def enable_if_method(self, args: T.Tuple[bool], kwargs: 'kwargs.FeatureOptionRequire') -> coredata.UserFeatureOption:
178
+ if not args[0]:
179
+ return copy.deepcopy(self.held_object)
180
+
181
+ if self.value == 'disabled':
182
+ err_msg = f'Feature {self.held_object.name} cannot be disabled'
183
+ if kwargs['error_message']:
184
+ err_msg += f': {kwargs["error_message"]}'
185
+ raise InterpreterException(err_msg)
186
+ return self.as_enabled()
187
+
188
+ @FeatureNew('feature_option.disable_auto_if()', '0.59.0')
189
+ @noKwargs
190
+ @typed_pos_args('feature_option.disable_auto_if', bool)
191
+ def disable_auto_if_method(self, args: T.Tuple[bool], kwargs: TYPE_kwargs) -> coredata.UserFeatureOption:
192
+ return copy.deepcopy(self.held_object) if self.value != 'auto' or not args[0] else self.as_disabled()
193
+
194
+ @FeatureNew('feature_option.enable_auto_if()', '1.1.0')
195
+ @noKwargs
196
+ @typed_pos_args('feature_option.enable_auto_if', bool)
197
+ def enable_auto_if_method(self, args: T.Tuple[bool], kwargs: TYPE_kwargs) -> coredata.UserFeatureOption:
198
+ return self.as_enabled() if self.value == 'auto' and args[0] else copy.deepcopy(self.held_object)
199
+
200
+
201
+ class RunProcess(MesonInterpreterObject):
202
+
203
+ def __init__(self,
204
+ cmd: ExternalProgram,
205
+ args: T.List[str],
206
+ env: mesonlib.EnvironmentVariables,
207
+ source_dir: str,
208
+ build_dir: str,
209
+ subdir: str,
210
+ mesonintrospect: T.List[str],
211
+ in_builddir: bool = False,
212
+ check: bool = False,
213
+ capture: bool = True) -> None:
214
+ super().__init__()
215
+ if not isinstance(cmd, ExternalProgram):
216
+ raise AssertionError('BUG: RunProcess must be passed an ExternalProgram')
217
+ self.capture = capture
218
+ self.returncode, self.stdout, self.stderr = self.run_command(cmd, args, env, source_dir, build_dir, subdir, mesonintrospect, in_builddir, check)
219
+ self.methods.update({'returncode': self.returncode_method,
220
+ 'stdout': self.stdout_method,
221
+ 'stderr': self.stderr_method,
222
+ })
223
+
224
+ def run_command(self,
225
+ cmd: ExternalProgram,
226
+ args: T.List[str],
227
+ env: mesonlib.EnvironmentVariables,
228
+ source_dir: str,
229
+ build_dir: str,
230
+ subdir: str,
231
+ mesonintrospect: T.List[str],
232
+ in_builddir: bool,
233
+ check: bool = False) -> T.Tuple[int, str, str]:
234
+ command_array = cmd.get_command() + args
235
+ menv = {'MESON_SOURCE_ROOT': source_dir,
236
+ 'MESON_BUILD_ROOT': build_dir,
237
+ 'MESON_SUBDIR': subdir,
238
+ 'MESONINTROSPECT': ' '.join([shlex.quote(x) for x in mesonintrospect]),
239
+ }
240
+ if in_builddir:
241
+ cwd = os.path.join(build_dir, subdir)
242
+ else:
243
+ cwd = os.path.join(source_dir, subdir)
244
+ child_env = os.environ.copy()
245
+ child_env.update(menv)
246
+ child_env = env.get_env(child_env)
247
+ stdout = subprocess.PIPE if self.capture else subprocess.DEVNULL
248
+ mlog.debug('Running command:', mesonlib.join_args(command_array))
249
+ try:
250
+ p, o, e = Popen_safe(command_array, stdout=stdout, env=child_env, cwd=cwd)
251
+ if self.capture:
252
+ mlog.debug('--- stdout ---')
253
+ mlog.debug(o)
254
+ else:
255
+ o = ''
256
+ mlog.debug('--- stdout disabled ---')
257
+ mlog.debug('--- stderr ---')
258
+ mlog.debug(e)
259
+ mlog.debug('')
260
+
261
+ if check and p.returncode != 0:
262
+ raise InterpreterException('Command `{}` failed with status {}.'.format(mesonlib.join_args(command_array), p.returncode))
263
+
264
+ return p.returncode, o, e
265
+ except FileNotFoundError:
266
+ raise InterpreterException('Could not execute command `%s`.' % mesonlib.join_args(command_array))
267
+
268
+ @noPosargs
269
+ @noKwargs
270
+ def returncode_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> int:
271
+ return self.returncode
272
+
273
+ @noPosargs
274
+ @noKwargs
275
+ def stdout_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> str:
276
+ return self.stdout
277
+
278
+ @noPosargs
279
+ @noKwargs
280
+ def stderr_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> str:
281
+ return self.stderr
282
+
283
+ class EnvironmentVariablesHolder(ObjectHolder[mesonlib.EnvironmentVariables], MutableInterpreterObject):
284
+
285
+ def __init__(self, obj: mesonlib.EnvironmentVariables, interpreter: 'Interpreter'):
286
+ super().__init__(obj, interpreter)
287
+ self.methods.update({'set': self.set_method,
288
+ 'unset': self.unset_method,
289
+ 'append': self.append_method,
290
+ 'prepend': self.prepend_method,
291
+ })
292
+
293
+ def __repr__(self) -> str:
294
+ repr_str = "<{0}: {1}>"
295
+ return repr_str.format(self.__class__.__name__, self.held_object.envvars)
296
+
297
+ def __deepcopy__(self, memo: T.Dict[str, object]) -> 'EnvironmentVariablesHolder':
298
+ # Avoid trying to copy the interpreter
299
+ return EnvironmentVariablesHolder(copy.deepcopy(self.held_object), self.interpreter)
300
+
301
+ def warn_if_has_name(self, name: str) -> None:
302
+ # Multiple append/prepend operations was not supported until 0.58.0.
303
+ if self.held_object.has_name(name):
304
+ m = f'Overriding previous value of environment variable {name!r} with a new one'
305
+ FeatureNew(m, '0.58.0').use(self.subproject, self.current_node)
306
+
307
+ @typed_pos_args('environment.set', str, varargs=str, min_varargs=1)
308
+ @typed_kwargs('environment.set', ENV_SEPARATOR_KW)
309
+ def set_method(self, args: T.Tuple[str, T.List[str]], kwargs: 'EnvironmentSeparatorKW') -> None:
310
+ name, values = args
311
+ self.held_object.set(name, values, kwargs['separator'])
312
+
313
+ @FeatureNew('environment.unset', '1.4.0')
314
+ @typed_pos_args('environment.unset', str)
315
+ @noKwargs
316
+ def unset_method(self, args: T.Tuple[str], kwargs: TYPE_kwargs) -> None:
317
+ self.held_object.unset(args[0])
318
+
319
+ @typed_pos_args('environment.append', str, varargs=str, min_varargs=1)
320
+ @typed_kwargs('environment.append', ENV_SEPARATOR_KW)
321
+ def append_method(self, args: T.Tuple[str, T.List[str]], kwargs: 'EnvironmentSeparatorKW') -> None:
322
+ name, values = args
323
+ self.warn_if_has_name(name)
324
+ self.held_object.append(name, values, kwargs['separator'])
325
+
326
+ @typed_pos_args('environment.prepend', str, varargs=str, min_varargs=1)
327
+ @typed_kwargs('environment.prepend', ENV_SEPARATOR_KW)
328
+ def prepend_method(self, args: T.Tuple[str, T.List[str]], kwargs: 'EnvironmentSeparatorKW') -> None:
329
+ name, values = args
330
+ self.warn_if_has_name(name)
331
+ self.held_object.prepend(name, values, kwargs['separator'])
332
+
333
+
334
+ _CONF_DATA_SET_KWS: KwargInfo[T.Optional[str]] = KwargInfo('description', (str, NoneType))
335
+
336
+
337
+ class ConfigurationDataHolder(ObjectHolder[build.ConfigurationData], MutableInterpreterObject):
338
+
339
+ def __init__(self, obj: build.ConfigurationData, interpreter: 'Interpreter'):
340
+ super().__init__(obj, interpreter)
341
+ self.methods.update({'set': self.set_method,
342
+ 'set10': self.set10_method,
343
+ 'set_quoted': self.set_quoted_method,
344
+ 'has': self.has_method,
345
+ 'get': self.get_method,
346
+ 'keys': self.keys_method,
347
+ 'get_unquoted': self.get_unquoted_method,
348
+ 'merge_from': self.merge_from_method,
349
+ })
350
+
351
+ def __deepcopy__(self, memo: T.Dict) -> 'ConfigurationDataHolder':
352
+ return ConfigurationDataHolder(copy.deepcopy(self.held_object), self.interpreter)
353
+
354
+ def is_used(self) -> bool:
355
+ return self.held_object.used
356
+
357
+ def __check_used(self) -> None:
358
+ if self.is_used():
359
+ raise InterpreterException("Can not set values on configuration object that has been used.")
360
+
361
+ @typed_pos_args('configuration_data.set', str, (str, int, bool))
362
+ @typed_kwargs('configuration_data.set', _CONF_DATA_SET_KWS)
363
+ def set_method(self, args: T.Tuple[str, T.Union[str, int, bool]], kwargs: 'kwargs.ConfigurationDataSet') -> None:
364
+ self.__check_used()
365
+ self.held_object.values[args[0]] = (args[1], kwargs['description'])
366
+
367
+ @typed_pos_args('configuration_data.set_quoted', str, str)
368
+ @typed_kwargs('configuration_data.set_quoted', _CONF_DATA_SET_KWS)
369
+ def set_quoted_method(self, args: T.Tuple[str, str], kwargs: 'kwargs.ConfigurationDataSet') -> None:
370
+ self.__check_used()
371
+ escaped_val = '\\"'.join(args[1].split('"'))
372
+ self.held_object.values[args[0]] = (f'"{escaped_val}"', kwargs['description'])
373
+
374
+ @typed_pos_args('configuration_data.set10', str, (int, bool))
375
+ @typed_kwargs('configuration_data.set10', _CONF_DATA_SET_KWS)
376
+ def set10_method(self, args: T.Tuple[str, T.Union[int, bool]], kwargs: 'kwargs.ConfigurationDataSet') -> None:
377
+ self.__check_used()
378
+ # bool is a subclass of int, so we need to check for bool explicitly.
379
+ # We already have typed_pos_args checking that this is either a bool or
380
+ # an int.
381
+ if not isinstance(args[1], bool):
382
+ mlog.deprecation('configuration_data.set10 with number. The `set10` '
383
+ 'method should only be used with booleans',
384
+ location=self.interpreter.current_node)
385
+ if args[1] < 0:
386
+ mlog.warning('Passing a number that is less than 0 may not have the intended result, '
387
+ 'as meson will treat all non-zero values as true.',
388
+ location=self.interpreter.current_node)
389
+ self.held_object.values[args[0]] = (int(args[1]), kwargs['description'])
390
+
391
+ @typed_pos_args('configuration_data.has', (str, int, bool))
392
+ @noKwargs
393
+ def has_method(self, args: T.Tuple[T.Union[str, int, bool]], kwargs: TYPE_kwargs) -> bool:
394
+ return args[0] in self.held_object.values
395
+
396
+ @FeatureNew('configuration_data.get()', '0.38.0')
397
+ @typed_pos_args('configuration_data.get', str, optargs=[(str, int, bool)])
398
+ @noKwargs
399
+ def get_method(self, args: T.Tuple[str, T.Optional[T.Union[str, int, bool]]],
400
+ kwargs: TYPE_kwargs) -> T.Union[str, int, bool]:
401
+ name = args[0]
402
+ if name in self.held_object:
403
+ return self.held_object.get(name)[0]
404
+ elif args[1] is not None:
405
+ return args[1]
406
+ raise InterpreterException(f'Entry {name} not in configuration data.')
407
+
408
+ @FeatureNew('configuration_data.get_unquoted()', '0.44.0')
409
+ @typed_pos_args('configuration_data.get_unquoted', str, optargs=[(str, int, bool)])
410
+ @noKwargs
411
+ def get_unquoted_method(self, args: T.Tuple[str, T.Optional[T.Union[str, int, bool]]],
412
+ kwargs: TYPE_kwargs) -> T.Union[str, int, bool]:
413
+ name = args[0]
414
+ if name in self.held_object:
415
+ val = self.held_object.get(name)[0]
416
+ elif args[1] is not None:
417
+ val = args[1]
418
+ else:
419
+ raise InterpreterException(f'Entry {name} not in configuration data.')
420
+ if isinstance(val, str) and val[0] == '"' and val[-1] == '"':
421
+ return val[1:-1]
422
+ return val
423
+
424
+ def get(self, name: str) -> T.Tuple[T.Union[str, int, bool], T.Optional[str]]:
425
+ return self.held_object.values[name]
426
+
427
+ @FeatureNew('configuration_data.keys()', '0.57.0')
428
+ @noPosargs
429
+ @noKwargs
430
+ def keys_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> T.List[str]:
431
+ return sorted(self.keys())
432
+
433
+ def keys(self) -> T.List[str]:
434
+ return list(self.held_object.values.keys())
435
+
436
+ @typed_pos_args('configuration_data.merge_from', build.ConfigurationData)
437
+ @noKwargs
438
+ def merge_from_method(self, args: T.Tuple[build.ConfigurationData], kwargs: TYPE_kwargs) -> None:
439
+ from_object = args[0]
440
+ self.held_object.values.update(from_object.values)
441
+
442
+
443
+ _PARTIAL_DEP_KWARGS = [
444
+ KwargInfo('compile_args', bool, default=False),
445
+ KwargInfo('link_args', bool, default=False),
446
+ KwargInfo('links', bool, default=False),
447
+ KwargInfo('includes', bool, default=False),
448
+ KwargInfo('sources', bool, default=False),
449
+ ]
450
+
451
+ class DependencyHolder(ObjectHolder[Dependency]):
452
+ def __init__(self, dep: Dependency, interpreter: 'Interpreter'):
453
+ super().__init__(dep, interpreter)
454
+ self.methods.update({'found': self.found_method,
455
+ 'type_name': self.type_name_method,
456
+ 'version': self.version_method,
457
+ 'name': self.name_method,
458
+ 'get_pkgconfig_variable': self.pkgconfig_method,
459
+ 'get_configtool_variable': self.configtool_method,
460
+ 'get_variable': self.variable_method,
461
+ 'partial_dependency': self.partial_dependency_method,
462
+ 'include_type': self.include_type_method,
463
+ 'as_system': self.as_system_method,
464
+ 'as_link_whole': self.as_link_whole_method,
465
+ })
466
+
467
+ def found(self) -> bool:
468
+ return self.found_method([], {})
469
+
470
+ @noPosargs
471
+ @noKwargs
472
+ def type_name_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> str:
473
+ return self.held_object.type_name
474
+
475
+ @noPosargs
476
+ @noKwargs
477
+ def found_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> bool:
478
+ if self.held_object.type_name == 'internal':
479
+ return True
480
+ return self.held_object.found()
481
+
482
+ @noPosargs
483
+ @noKwargs
484
+ def version_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> str:
485
+ return self.held_object.get_version()
486
+
487
+ @noPosargs
488
+ @noKwargs
489
+ def name_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> str:
490
+ return self.held_object.get_name()
491
+
492
+ @FeatureDeprecated('dependency.get_pkgconfig_variable', '0.56.0',
493
+ 'use dependency.get_variable(pkgconfig : ...) instead')
494
+ @typed_pos_args('dependency.get_pkgconfig_variable', str)
495
+ @typed_kwargs(
496
+ 'dependency.get_pkgconfig_variable',
497
+ KwargInfo('default', str, default=''),
498
+ PKGCONFIG_DEFINE_KW.evolve(name='define_variable')
499
+ )
500
+ def pkgconfig_method(self, args: T.Tuple[str], kwargs: 'kwargs.DependencyPkgConfigVar') -> str:
501
+ from ..dependencies.pkgconfig import PkgConfigDependency
502
+ if not isinstance(self.held_object, PkgConfigDependency):
503
+ raise InvalidArguments(f'{self.held_object.get_name()!r} is not a pkgconfig dependency')
504
+ if kwargs['define_variable'] and len(kwargs['define_variable']) > 1:
505
+ FeatureNew.single_use('dependency.get_pkgconfig_variable keyword argument "define_variable" with more than one pair',
506
+ '1.3.0', self.subproject, location=self.current_node)
507
+ return self.held_object.get_variable(
508
+ pkgconfig=args[0],
509
+ default_value=kwargs['default'],
510
+ pkgconfig_define=kwargs['define_variable'],
511
+ )
512
+
513
+ @FeatureNew('dependency.get_configtool_variable', '0.44.0')
514
+ @FeatureDeprecated('dependency.get_configtool_variable', '0.56.0',
515
+ 'use dependency.get_variable(configtool : ...) instead')
516
+ @noKwargs
517
+ @typed_pos_args('dependency.get_config_tool_variable', str)
518
+ def configtool_method(self, args: T.Tuple[str], kwargs: TYPE_kwargs) -> str:
519
+ from ..dependencies.configtool import ConfigToolDependency
520
+ if not isinstance(self.held_object, ConfigToolDependency):
521
+ raise InvalidArguments(f'{self.held_object.get_name()!r} is not a config-tool dependency')
522
+ return self.held_object.get_variable(
523
+ configtool=args[0],
524
+ default_value='',
525
+ )
526
+
527
+ @FeatureNew('dependency.partial_dependency', '0.46.0')
528
+ @noPosargs
529
+ @typed_kwargs('dependency.partial_dependency', *_PARTIAL_DEP_KWARGS)
530
+ def partial_dependency_method(self, args: T.List[TYPE_nvar], kwargs: 'kwargs.DependencyMethodPartialDependency') -> Dependency:
531
+ pdep = self.held_object.get_partial_dependency(**kwargs)
532
+ return pdep
533
+
534
+ @FeatureNew('dependency.get_variable', '0.51.0')
535
+ @typed_pos_args('dependency.get_variable', optargs=[str])
536
+ @typed_kwargs(
537
+ 'dependency.get_variable',
538
+ KwargInfo('cmake', (str, NoneType)),
539
+ KwargInfo('pkgconfig', (str, NoneType)),
540
+ KwargInfo('configtool', (str, NoneType)),
541
+ KwargInfo('internal', (str, NoneType), since='0.54.0'),
542
+ KwargInfo('default_value', (str, NoneType)),
543
+ PKGCONFIG_DEFINE_KW,
544
+ )
545
+ def variable_method(self, args: T.Tuple[T.Optional[str]], kwargs: 'kwargs.DependencyGetVariable') -> str:
546
+ default_varname = args[0]
547
+ if default_varname is not None:
548
+ FeatureNew('Positional argument to dependency.get_variable()', '0.58.0').use(self.subproject, self.current_node)
549
+ if kwargs['pkgconfig_define'] and len(kwargs['pkgconfig_define']) > 1:
550
+ FeatureNew.single_use('dependency.get_variable keyword argument "pkgconfig_define" with more than one pair',
551
+ '1.3.0', self.subproject, 'In previous versions, this silently returned a malformed value.',
552
+ self.current_node)
553
+ return self.held_object.get_variable(
554
+ cmake=kwargs['cmake'] or default_varname,
555
+ pkgconfig=kwargs['pkgconfig'] or default_varname,
556
+ configtool=kwargs['configtool'] or default_varname,
557
+ internal=kwargs['internal'] or default_varname,
558
+ default_value=kwargs['default_value'],
559
+ pkgconfig_define=kwargs['pkgconfig_define'],
560
+ )
561
+
562
+ @FeatureNew('dependency.include_type', '0.52.0')
563
+ @noPosargs
564
+ @noKwargs
565
+ def include_type_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> str:
566
+ return self.held_object.get_include_type()
567
+
568
+ @FeatureNew('dependency.as_system', '0.52.0')
569
+ @noKwargs
570
+ @typed_pos_args('dependency.as_system', optargs=[str])
571
+ def as_system_method(self, args: T.Tuple[T.Optional[str]], kwargs: TYPE_kwargs) -> Dependency:
572
+ return self.held_object.generate_system_dependency(args[0] or 'system')
573
+
574
+ @FeatureNew('dependency.as_link_whole', '0.56.0')
575
+ @noKwargs
576
+ @noPosargs
577
+ def as_link_whole_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> Dependency:
578
+ if not isinstance(self.held_object, InternalDependency):
579
+ raise InterpreterException('as_link_whole method is only supported on declare_dependency() objects')
580
+ new_dep = self.held_object.generate_link_whole_dependency()
581
+ return new_dep
582
+
583
+ _EXTPROG = T.TypeVar('_EXTPROG', bound=ExternalProgram)
584
+
585
+ class _ExternalProgramHolder(ObjectHolder[_EXTPROG]):
586
+ def __init__(self, ep: _EXTPROG, interpreter: 'Interpreter') -> None:
587
+ super().__init__(ep, interpreter)
588
+ self.methods.update({'found': self.found_method,
589
+ 'path': self.path_method,
590
+ 'version': self.version_method,
591
+ 'full_path': self.full_path_method})
592
+
593
+ @noPosargs
594
+ @noKwargs
595
+ def found_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> bool:
596
+ return self.found()
597
+
598
+ @noPosargs
599
+ @noKwargs
600
+ @FeatureDeprecated('ExternalProgram.path', '0.55.0',
601
+ 'use ExternalProgram.full_path() instead')
602
+ def path_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> str:
603
+ return self._full_path()
604
+
605
+ @noPosargs
606
+ @noKwargs
607
+ @FeatureNew('ExternalProgram.full_path', '0.55.0')
608
+ def full_path_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> str:
609
+ return self._full_path()
610
+
611
+ def _full_path(self) -> str:
612
+ if not self.found():
613
+ raise InterpreterException('Unable to get the path of a not-found external program')
614
+ path = self.held_object.get_path()
615
+ assert path is not None
616
+ return path
617
+
618
+ @noPosargs
619
+ @noKwargs
620
+ @FeatureNew('ExternalProgram.version', '0.62.0')
621
+ def version_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> str:
622
+ if not self.found():
623
+ raise InterpreterException('Unable to get the version of a not-found external program')
624
+ try:
625
+ return self.held_object.get_version(self.interpreter)
626
+ except mesonlib.MesonException:
627
+ return 'unknown'
628
+
629
+ def found(self) -> bool:
630
+ return self.held_object.found()
631
+
632
+ class ExternalProgramHolder(_ExternalProgramHolder[ExternalProgram]):
633
+ pass
634
+
635
+ class ExternalLibraryHolder(ObjectHolder[ExternalLibrary]):
636
+ def __init__(self, el: ExternalLibrary, interpreter: 'Interpreter'):
637
+ super().__init__(el, interpreter)
638
+ self.methods.update({'found': self.found_method,
639
+ 'type_name': self.type_name_method,
640
+ 'partial_dependency': self.partial_dependency_method,
641
+ })
642
+
643
+ @noPosargs
644
+ @noKwargs
645
+ def type_name_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> str:
646
+ return self.held_object.type_name
647
+
648
+ @noPosargs
649
+ @noKwargs
650
+ def found_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> bool:
651
+ return self.held_object.found()
652
+
653
+ @FeatureNew('dependency.partial_dependency', '0.46.0')
654
+ @noPosargs
655
+ @typed_kwargs('dependency.partial_dependency', *_PARTIAL_DEP_KWARGS)
656
+ def partial_dependency_method(self, args: T.List[TYPE_nvar], kwargs: 'kwargs.DependencyMethodPartialDependency') -> Dependency:
657
+ pdep = self.held_object.get_partial_dependency(**kwargs)
658
+ return pdep
659
+
660
+ # A machine that's statically known from the cross file
661
+ class MachineHolder(ObjectHolder['MachineInfo']):
662
+ def __init__(self, machine_info: 'MachineInfo', interpreter: 'Interpreter'):
663
+ super().__init__(machine_info, interpreter)
664
+ self.methods.update({'system': self.system_method,
665
+ 'cpu': self.cpu_method,
666
+ 'cpu_family': self.cpu_family_method,
667
+ 'endian': self.endian_method,
668
+ 'kernel': self.kernel_method,
669
+ 'subsystem': self.subsystem_method,
670
+ })
671
+
672
+ @noPosargs
673
+ @noKwargs
674
+ def cpu_family_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> str:
675
+ return self.held_object.cpu_family
676
+
677
+ @noPosargs
678
+ @noKwargs
679
+ def cpu_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> str:
680
+ return self.held_object.cpu
681
+
682
+ @noPosargs
683
+ @noKwargs
684
+ def system_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> str:
685
+ return self.held_object.system
686
+
687
+ @noPosargs
688
+ @noKwargs
689
+ def endian_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> str:
690
+ return self.held_object.endian
691
+
692
+ @noPosargs
693
+ @noKwargs
694
+ def kernel_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> str:
695
+ if self.held_object.kernel is not None:
696
+ return self.held_object.kernel
697
+ raise InterpreterException('Kernel not defined or could not be autodetected.')
698
+
699
+ @noPosargs
700
+ @noKwargs
701
+ def subsystem_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> str:
702
+ if self.held_object.subsystem is not None:
703
+ return self.held_object.subsystem
704
+ raise InterpreterException('Subsystem not defined or could not be autodetected.')
705
+
706
+
707
+ class IncludeDirsHolder(ObjectHolder[build.IncludeDirs]):
708
+ pass
709
+
710
+ class FileHolder(ObjectHolder[mesonlib.File]):
711
+ def __init__(self, file: mesonlib.File, interpreter: 'Interpreter'):
712
+ super().__init__(file, interpreter)
713
+ self.methods.update({'full_path': self.full_path_method,
714
+ })
715
+
716
+ @noPosargs
717
+ @noKwargs
718
+ @FeatureNew('file.full_path', '1.4.0')
719
+ def full_path_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> str:
720
+ return self.held_object.absolute_path(self.env.source_dir, self.env.build_dir)
721
+
722
+ class HeadersHolder(ObjectHolder[build.Headers]):
723
+ pass
724
+
725
+ class DataHolder(ObjectHolder[build.Data]):
726
+ pass
727
+
728
+ class SymlinkDataHolder(ObjectHolder[build.SymlinkData]):
729
+ pass
730
+
731
+ class InstallDirHolder(ObjectHolder[build.InstallDir]):
732
+ pass
733
+
734
+ class ManHolder(ObjectHolder[build.Man]):
735
+ pass
736
+
737
+ class EmptyDirHolder(ObjectHolder[build.EmptyDir]):
738
+ pass
739
+
740
+ class GeneratedObjectsHolder(ObjectHolder[build.ExtractedObjects]):
741
+ pass
742
+
743
+ class Test(MesonInterpreterObject):
744
+ def __init__(self, name: str, project: str, suite: T.List[str],
745
+ exe: T.Union[ExternalProgram, build.Executable, build.CustomTarget, build.CustomTargetIndex],
746
+ depends: T.List[T.Union[build.CustomTarget, build.BuildTarget]],
747
+ is_parallel: bool,
748
+ cmd_args: T.List[T.Union[str, mesonlib.File, build.Target]],
749
+ env: mesonlib.EnvironmentVariables,
750
+ should_fail: bool, timeout: int, workdir: T.Optional[str], protocol: str,
751
+ priority: int, verbose: bool):
752
+ super().__init__()
753
+ self.name = name
754
+ self.suite = listify(suite)
755
+ self.project_name = project
756
+ self.exe = exe
757
+ self.depends = depends
758
+ self.is_parallel = is_parallel
759
+ self.cmd_args = cmd_args
760
+ self.env = env
761
+ self.should_fail = should_fail
762
+ self.timeout = timeout
763
+ self.workdir = workdir
764
+ self.protocol = TestProtocol.from_str(protocol)
765
+ self.priority = priority
766
+ self.verbose = verbose
767
+
768
+ def get_exe(self) -> T.Union[ExternalProgram, build.Executable, build.CustomTarget, build.CustomTargetIndex]:
769
+ return self.exe
770
+
771
+ def get_name(self) -> str:
772
+ return self.name
773
+
774
+ class NullSubprojectInterpreter(HoldableObject):
775
+ pass
776
+
777
+ # TODO: This should really be an `ObjectHolder`, but the additional stuff in this
778
+ # class prevents this. Thus, this class should be split into a pure
779
+ # `ObjectHolder` and a class specifically for storing in `Interpreter`.
780
+ class SubprojectHolder(MesonInterpreterObject):
781
+
782
+ def __init__(self, subinterpreter: T.Union['Interpreter', NullSubprojectInterpreter],
783
+ subdir: str,
784
+ warnings: int = 0,
785
+ disabled_feature: T.Optional[str] = None,
786
+ exception: T.Optional[Exception] = None,
787
+ callstack: T.Optional[mesonlib.PerMachine[T.List[str]]] = None) -> None:
788
+ super().__init__()
789
+ self.held_object = subinterpreter
790
+ self.warnings = warnings
791
+ self.disabled_feature = disabled_feature
792
+ self.exception = exception
793
+ self.subdir = PurePath(subdir).as_posix()
794
+ self.cm_interpreter: T.Optional[CMakeInterpreter] = None
795
+ self.callstack = callstack.host if callstack else None
796
+ self.methods.update({'get_variable': self.get_variable_method,
797
+ 'found': self.found_method,
798
+ })
799
+
800
+ @noPosargs
801
+ @noKwargs
802
+ def found_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> bool:
803
+ return self.found()
804
+
805
+ def found(self) -> bool:
806
+ return not isinstance(self.held_object, NullSubprojectInterpreter)
807
+
808
+ @noKwargs
809
+ @noArgsFlattening
810
+ @unholder_return
811
+ def get_variable_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> T.Union[TYPE_var, InterpreterObject]:
812
+ if len(args) < 1 or len(args) > 2:
813
+ raise InterpreterException('Get_variable takes one or two arguments.')
814
+ if isinstance(self.held_object, NullSubprojectInterpreter): # == not self.found()
815
+ raise InterpreterException(f'Subproject "{self.subdir}" disabled can\'t get_variable on it.')
816
+ varname = args[0]
817
+ if not isinstance(varname, str):
818
+ raise InterpreterException('Get_variable first argument must be a string.')
819
+ try:
820
+ return self.held_object.variables[varname]
821
+ except KeyError:
822
+ pass
823
+
824
+ if len(args) == 2:
825
+ return self.held_object._holderify(args[1])
826
+
827
+ raise InvalidArguments(f'Requested variable "{varname}" not found.')
828
+
829
+ class ModuleObjectHolder(ObjectHolder[ModuleObject]):
830
+ def method_call(self, method_name: str, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> TYPE_var:
831
+ modobj = self.held_object
832
+ method = modobj.methods.get(method_name)
833
+ if not method:
834
+ raise InvalidCode(f'Unknown method {method_name!r} in object.')
835
+ if not getattr(method, 'no-args-flattening', False):
836
+ args = flatten(args)
837
+ if not getattr(method, 'no-second-level-holder-flattening', False):
838
+ args, kwargs = resolve_second_level_holders(args, kwargs)
839
+ state = ModuleState(self.interpreter)
840
+ # Many modules do for example self.interpreter.find_program_impl(),
841
+ # so we have to ensure they use the current interpreter and not the one
842
+ # that first imported that module, otherwise it will use outdated
843
+ # overrides.
844
+ if isinstance(modobj, ExtensionModule):
845
+ modobj.interpreter = self.interpreter
846
+ ret = method(state, args, kwargs)
847
+ if isinstance(ret, ModuleReturnValue):
848
+ self.interpreter.process_new_values(ret.new_objects)
849
+ ret = ret.return_value
850
+ return ret
851
+
852
+ class MutableModuleObjectHolder(ModuleObjectHolder, MutableInterpreterObject):
853
+ def __deepcopy__(self, memo: T.Dict[int, T.Any]) -> 'MutableModuleObjectHolder':
854
+ # Deepcopy only held object, not interpreter
855
+ modobj = copy.deepcopy(self.held_object, memo)
856
+ return MutableModuleObjectHolder(modobj, self.interpreter)
857
+
858
+
859
+ _BuildTarget = T.TypeVar('_BuildTarget', bound=T.Union[build.BuildTarget, build.BothLibraries])
860
+
861
+ class BuildTargetHolder(ObjectHolder[_BuildTarget]):
862
+ def __init__(self, target: _BuildTarget, interp: 'Interpreter'):
863
+ super().__init__(target, interp)
864
+ self.methods.update({'extract_objects': self.extract_objects_method,
865
+ 'extract_all_objects': self.extract_all_objects_method,
866
+ 'name': self.name_method,
867
+ 'get_id': self.get_id_method,
868
+ 'outdir': self.outdir_method,
869
+ 'full_path': self.full_path_method,
870
+ 'path': self.path_method,
871
+ 'found': self.found_method,
872
+ 'private_dir_include': self.private_dir_include_method,
873
+ })
874
+
875
+ def __repr__(self) -> str:
876
+ r = '<{} {}: {}>'
877
+ h = self.held_object
878
+ assert isinstance(h, build.BuildTarget)
879
+ return r.format(self.__class__.__name__, h.get_id(), h.filename)
880
+
881
+ @property
882
+ def _target_object(self) -> build.BuildTarget:
883
+ if isinstance(self.held_object, build.BothLibraries):
884
+ return self.held_object.get_default_object()
885
+ assert isinstance(self.held_object, build.BuildTarget)
886
+ return self.held_object
887
+
888
+ def is_cross(self) -> bool:
889
+ return not self._target_object.environment.machines.matches_build_machine(self._target_object.for_machine)
890
+
891
+ @noPosargs
892
+ @noKwargs
893
+ def found_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> bool:
894
+ if not (isinstance(self.held_object, build.Executable) and self.held_object.was_returned_by_find_program):
895
+ FeatureNew.single_use('BuildTarget.found', '0.59.0', subproject=self.held_object.subproject)
896
+ return True
897
+
898
+ @noPosargs
899
+ @noKwargs
900
+ def private_dir_include_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> build.IncludeDirs:
901
+ return build.IncludeDirs('', [], False, [self.interpreter.backend.get_target_private_dir(self._target_object)],
902
+ self.interpreter.coredata.is_build_only)
903
+
904
+ @noPosargs
905
+ @noKwargs
906
+ def full_path_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> str:
907
+ return self.interpreter.backend.get_target_filename_abs(self._target_object)
908
+
909
+ @noPosargs
910
+ @noKwargs
911
+ @FeatureDeprecated('BuildTarget.path', '0.55.0', 'Use BuildTarget.full_path instead')
912
+ def path_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> str:
913
+ return self.interpreter.backend.get_target_filename_abs(self._target_object)
914
+
915
+ @noPosargs
916
+ @noKwargs
917
+ def outdir_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> str:
918
+ return self.interpreter.backend.get_target_dir(self._target_object)
919
+
920
+ @noKwargs
921
+ @typed_pos_args('extract_objects', varargs=(mesonlib.File, str, build.CustomTarget, build.CustomTargetIndex, build.GeneratedList))
922
+ def extract_objects_method(self, args: T.Tuple[T.List[T.Union[mesonlib.FileOrString, 'build.GeneratedTypes']]], kwargs: TYPE_nkwargs) -> build.ExtractedObjects:
923
+ return self._target_object.extract_objects(args[0])
924
+
925
+ @noPosargs
926
+ @typed_kwargs(
927
+ 'extract_all_objects',
928
+ KwargInfo(
929
+ 'recursive', bool, default=False, since='0.46.0',
930
+ not_set_warning=textwrap.dedent('''\
931
+ extract_all_objects called without setting recursive
932
+ keyword argument. Meson currently defaults to
933
+ non-recursive to maintain backward compatibility but
934
+ the default will be changed in the future.
935
+ ''')
936
+ )
937
+ )
938
+ def extract_all_objects_method(self, args: T.List[TYPE_nvar], kwargs: 'kwargs.BuildTargeMethodExtractAllObjects') -> build.ExtractedObjects:
939
+ return self._target_object.extract_all_objects(kwargs['recursive'])
940
+
941
+ @noPosargs
942
+ @noKwargs
943
+ @FeatureDeprecated('BuildTarget.get_id', '1.2.0',
944
+ 'This was never formally documented and does not seem to have a real world use. ' +
945
+ 'See https://github.com/mesonbuild/meson/pull/6061')
946
+ def get_id_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> str:
947
+ return self._target_object.get_id()
948
+
949
+ @FeatureNew('name', '0.54.0')
950
+ @noPosargs
951
+ @noKwargs
952
+ def name_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> str:
953
+ return self._target_object.name
954
+
955
+ class ExecutableHolder(BuildTargetHolder[build.Executable]):
956
+ pass
957
+
958
+ class StaticLibraryHolder(BuildTargetHolder[build.StaticLibrary]):
959
+ pass
960
+
961
+ class SharedLibraryHolder(BuildTargetHolder[build.SharedLibrary]):
962
+ pass
963
+
964
+ class BothLibrariesHolder(BuildTargetHolder[build.BothLibraries]):
965
+ def __init__(self, libs: build.BothLibraries, interp: 'Interpreter'):
966
+ # FIXME: This build target always represents the shared library, but
967
+ # that should be configurable.
968
+ super().__init__(libs, interp)
969
+ self.methods.update({'get_shared_lib': self.get_shared_lib_method,
970
+ 'get_static_lib': self.get_static_lib_method,
971
+ })
972
+
973
+ def __repr__(self) -> str:
974
+ r = '<{} {}: {}, {}: {}>'
975
+ h1 = self.held_object.shared
976
+ h2 = self.held_object.static
977
+ return r.format(self.__class__.__name__, h1.get_id(), h1.filename, h2.get_id(), h2.filename)
978
+
979
+ @noPosargs
980
+ @noKwargs
981
+ def get_shared_lib_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> build.SharedLibrary:
982
+ return self.held_object.shared
983
+
984
+ @noPosargs
985
+ @noKwargs
986
+ def get_static_lib_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> build.StaticLibrary:
987
+ return self.held_object.static
988
+
989
+ class SharedModuleHolder(BuildTargetHolder[build.SharedModule]):
990
+ pass
991
+
992
+ class JarHolder(BuildTargetHolder[build.Jar]):
993
+ pass
994
+
995
+ class CustomTargetIndexHolder(ObjectHolder[build.CustomTargetIndex]):
996
+ def __init__(self, target: build.CustomTargetIndex, interp: 'Interpreter'):
997
+ super().__init__(target, interp)
998
+ self.methods.update({'full_path': self.full_path_method,
999
+ })
1000
+
1001
+ @FeatureNew('custom_target[i].full_path', '0.54.0')
1002
+ @noPosargs
1003
+ @noKwargs
1004
+ def full_path_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> str:
1005
+ assert self.interpreter.backend is not None
1006
+ return self.interpreter.backend.get_target_filename_abs(self.held_object)
1007
+
1008
+ _CT = T.TypeVar('_CT', bound=build.CustomTarget)
1009
+
1010
+ class _CustomTargetHolder(ObjectHolder[_CT]):
1011
+ def __init__(self, target: _CT, interp: 'Interpreter'):
1012
+ super().__init__(target, interp)
1013
+ self.methods.update({'full_path': self.full_path_method,
1014
+ 'to_list': self.to_list_method,
1015
+ })
1016
+
1017
+ self.operators.update({
1018
+ MesonOperator.INDEX: self.op_index,
1019
+ })
1020
+
1021
+ def __repr__(self) -> str:
1022
+ r = '<{} {}: {}>'
1023
+ h = self.held_object
1024
+ return r.format(self.__class__.__name__, h.get_id(), h.command)
1025
+
1026
+ @noPosargs
1027
+ @noKwargs
1028
+ def full_path_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> str:
1029
+ return self.interpreter.backend.get_target_filename_abs(self.held_object)
1030
+
1031
+ @FeatureNew('custom_target.to_list', '0.54.0')
1032
+ @noPosargs
1033
+ @noKwargs
1034
+ def to_list_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> T.List[build.CustomTargetIndex]:
1035
+ result = []
1036
+ for i in self.held_object:
1037
+ result.append(i)
1038
+ return result
1039
+
1040
+ @noKwargs
1041
+ @typed_operator(MesonOperator.INDEX, int)
1042
+ def op_index(self, other: int) -> build.CustomTargetIndex:
1043
+ try:
1044
+ return self.held_object[other]
1045
+ except IndexError:
1046
+ raise InvalidArguments(f'Index {other} out of bounds of custom target {self.held_object.name} output of size {len(self.held_object)}.')
1047
+
1048
+ class CustomTargetHolder(_CustomTargetHolder[build.CustomTarget]):
1049
+ pass
1050
+
1051
+ class RunTargetHolder(ObjectHolder[build.RunTarget]):
1052
+ pass
1053
+
1054
+ class AliasTargetHolder(ObjectHolder[build.AliasTarget]):
1055
+ pass
1056
+
1057
+ class GeneratedListHolder(ObjectHolder[build.GeneratedList]):
1058
+ pass
1059
+
1060
+ class GeneratorHolder(ObjectHolder[build.Generator]):
1061
+ def __init__(self, gen: build.Generator, interpreter: 'Interpreter'):
1062
+ super().__init__(gen, interpreter)
1063
+ self.methods.update({'process': self.process_method})
1064
+
1065
+ @typed_pos_args('generator.process', min_varargs=1, varargs=(str, mesonlib.File, build.CustomTarget, build.CustomTargetIndex, build.GeneratedList))
1066
+ @typed_kwargs(
1067
+ 'generator.process',
1068
+ KwargInfo('preserve_path_from', (str, NoneType), since='0.45.0'),
1069
+ KwargInfo('extra_args', ContainerTypeInfo(list, str), listify=True, default=[]),
1070
+ ENV_KW.evolve(since='1.3.0')
1071
+ )
1072
+ def process_method(self,
1073
+ args: T.Tuple[T.List[T.Union[str, mesonlib.File, 'build.GeneratedTypes']]],
1074
+ kwargs: 'kwargs.GeneratorProcess') -> build.GeneratedList:
1075
+ preserve_path_from = kwargs['preserve_path_from']
1076
+ if preserve_path_from is not None:
1077
+ preserve_path_from = os.path.normpath(preserve_path_from)
1078
+ if not os.path.isabs(preserve_path_from):
1079
+ # This is a bit of a hack. Fix properly before merging.
1080
+ raise InvalidArguments('Preserve_path_from must be an absolute path for now. Sorry.')
1081
+
1082
+ if any(isinstance(a, (build.CustomTarget, build.CustomTargetIndex, build.GeneratedList)) for a in args[0]):
1083
+ FeatureNew.single_use(
1084
+ 'Calling generator.process with CustomTarget or Index of CustomTarget.',
1085
+ '0.57.0', self.interpreter.subproject)
1086
+
1087
+ gl = self.held_object.process_files(args[0], self.interpreter,
1088
+ preserve_path_from, extra_args=kwargs['extra_args'], env=kwargs['env'])
1089
+
1090
+ return gl
1091
+
1092
+
1093
+ class StructuredSourcesHolder(ObjectHolder[build.StructuredSources]):
1094
+
1095
+ def __init__(self, sources: build.StructuredSources, interp: 'Interpreter'):
1096
+ super().__init__(sources, interp)