frida 16.2.1 → 16.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (386) hide show
  1. package/BSDmakefile +6 -0
  2. package/Makefile +16 -0
  3. package/README.md +14 -11
  4. package/configure +18 -0
  5. package/configure.bat +22 -0
  6. package/dist/native.js +0 -8
  7. package/lib/application.ts +98 -0
  8. package/lib/authentication.ts +3 -0
  9. package/lib/build.py +50 -0
  10. package/lib/bus.ts +30 -0
  11. package/lib/cancellable.ts +33 -0
  12. package/lib/child.ts +15 -0
  13. package/lib/crash.ts +11 -0
  14. package/lib/device.ts +329 -0
  15. package/lib/device_manager.ts +69 -0
  16. package/lib/endpoint_parameters.ts +56 -0
  17. package/lib/icon.ts +15 -0
  18. package/lib/index.ts +311 -0
  19. package/lib/iostream.ts +78 -0
  20. package/lib/meson.build +53 -0
  21. package/lib/native.ts +9 -0
  22. package/lib/portal_membership.ts +10 -0
  23. package/lib/portal_service.ts +105 -0
  24. package/lib/process.ts +57 -0
  25. package/lib/relay.ts +44 -0
  26. package/lib/script.ts +352 -0
  27. package/lib/session.ts +113 -0
  28. package/lib/signals.ts +45 -0
  29. package/lib/socket_address.ts +35 -0
  30. package/lib/spawn.ts +4 -0
  31. package/lib/system_parameters.ts +78 -0
  32. package/make.bat +23 -0
  33. package/meson.build +160 -0
  34. package/meson.options +11 -0
  35. package/package.json +27 -6
  36. package/releng/deps.py +1133 -0
  37. package/releng/deps.toml +391 -0
  38. package/releng/devkit-assets/frida-core-example-unix.c +188 -0
  39. package/releng/devkit-assets/frida-core-example-windows.c +197 -0
  40. package/releng/devkit-assets/frida-core-example.sln +28 -0
  41. package/releng/devkit-assets/frida-core-example.vcxproj +157 -0
  42. package/releng/devkit-assets/frida-core-example.vcxproj.filters +27 -0
  43. package/releng/devkit-assets/frida-gum-example-unix.c +122 -0
  44. package/releng/devkit-assets/frida-gum-example-windows.c +132 -0
  45. package/releng/devkit-assets/frida-gum-example.sln +28 -0
  46. package/releng/devkit-assets/frida-gum-example.vcxproj +157 -0
  47. package/releng/devkit-assets/frida-gum-example.vcxproj.filters +27 -0
  48. package/releng/devkit-assets/frida-gumjs-example-unix.c +84 -0
  49. package/releng/devkit-assets/frida-gumjs-example-windows.c +91 -0
  50. package/releng/devkit-assets/frida-gumjs-example.sln +28 -0
  51. package/releng/devkit-assets/frida-gumjs-example.vcxproj +157 -0
  52. package/releng/devkit-assets/frida-gumjs-example.vcxproj.filters +27 -0
  53. package/releng/devkit.py +535 -0
  54. package/releng/env.py +420 -0
  55. package/releng/env_android.py +150 -0
  56. package/releng/env_apple.py +176 -0
  57. package/releng/env_generic.py +373 -0
  58. package/releng/frida_version.py +69 -0
  59. package/releng/machine_file.py +44 -0
  60. package/releng/machine_spec.py +290 -0
  61. package/releng/meson/meson.py +27 -0
  62. package/releng/meson/mesonbuild/__init__.py +0 -0
  63. package/releng/meson/mesonbuild/_pathlib.py +63 -0
  64. package/releng/meson/mesonbuild/_typing.py +69 -0
  65. package/releng/meson/mesonbuild/arglist.py +321 -0
  66. package/releng/meson/mesonbuild/ast/__init__.py +23 -0
  67. package/releng/meson/mesonbuild/ast/interpreter.py +441 -0
  68. package/releng/meson/mesonbuild/ast/introspection.py +374 -0
  69. package/releng/meson/mesonbuild/ast/postprocess.py +109 -0
  70. package/releng/meson/mesonbuild/ast/printer.py +620 -0
  71. package/releng/meson/mesonbuild/ast/visitor.py +161 -0
  72. package/releng/meson/mesonbuild/backend/__init__.py +0 -0
  73. package/releng/meson/mesonbuild/backend/backends.py +2047 -0
  74. package/releng/meson/mesonbuild/backend/ninjabackend.py +3808 -0
  75. package/releng/meson/mesonbuild/backend/nonebackend.py +26 -0
  76. package/releng/meson/mesonbuild/backend/vs2010backend.py +2078 -0
  77. package/releng/meson/mesonbuild/backend/vs2012backend.py +35 -0
  78. package/releng/meson/mesonbuild/backend/vs2013backend.py +34 -0
  79. package/releng/meson/mesonbuild/backend/vs2015backend.py +35 -0
  80. package/releng/meson/mesonbuild/backend/vs2017backend.py +59 -0
  81. package/releng/meson/mesonbuild/backend/vs2019backend.py +54 -0
  82. package/releng/meson/mesonbuild/backend/vs2022backend.py +54 -0
  83. package/releng/meson/mesonbuild/backend/xcodebackend.py +1781 -0
  84. package/releng/meson/mesonbuild/build.py +3249 -0
  85. package/releng/meson/mesonbuild/cargo/__init__.py +5 -0
  86. package/releng/meson/mesonbuild/cargo/builder.py +238 -0
  87. package/releng/meson/mesonbuild/cargo/cfg.py +274 -0
  88. package/releng/meson/mesonbuild/cargo/interpreter.py +733 -0
  89. package/releng/meson/mesonbuild/cargo/manifest.py +227 -0
  90. package/releng/meson/mesonbuild/cargo/version.py +95 -0
  91. package/releng/meson/mesonbuild/cmake/__init__.py +28 -0
  92. package/releng/meson/mesonbuild/cmake/common.py +331 -0
  93. package/releng/meson/mesonbuild/cmake/data/__init__.py +0 -0
  94. package/releng/meson/mesonbuild/cmake/data/preload.cmake +82 -0
  95. package/releng/meson/mesonbuild/cmake/executor.py +241 -0
  96. package/releng/meson/mesonbuild/cmake/fileapi.py +324 -0
  97. package/releng/meson/mesonbuild/cmake/generator.py +186 -0
  98. package/releng/meson/mesonbuild/cmake/interpreter.py +1267 -0
  99. package/releng/meson/mesonbuild/cmake/toolchain.py +248 -0
  100. package/releng/meson/mesonbuild/cmake/traceparser.py +814 -0
  101. package/releng/meson/mesonbuild/cmake/tracetargets.py +161 -0
  102. package/releng/meson/mesonbuild/compilers/__init__.py +86 -0
  103. package/releng/meson/mesonbuild/compilers/asm.py +307 -0
  104. package/releng/meson/mesonbuild/compilers/c.py +788 -0
  105. package/releng/meson/mesonbuild/compilers/c_function_attributes.py +143 -0
  106. package/releng/meson/mesonbuild/compilers/compilers.py +1388 -0
  107. package/releng/meson/mesonbuild/compilers/cpp.py +1035 -0
  108. package/releng/meson/mesonbuild/compilers/cs.py +136 -0
  109. package/releng/meson/mesonbuild/compilers/cuda.py +806 -0
  110. package/releng/meson/mesonbuild/compilers/cython.py +91 -0
  111. package/releng/meson/mesonbuild/compilers/d.py +861 -0
  112. package/releng/meson/mesonbuild/compilers/detect.py +1396 -0
  113. package/releng/meson/mesonbuild/compilers/fortran.py +523 -0
  114. package/releng/meson/mesonbuild/compilers/java.py +113 -0
  115. package/releng/meson/mesonbuild/compilers/mixins/__init__.py +0 -0
  116. package/releng/meson/mesonbuild/compilers/mixins/arm.py +167 -0
  117. package/releng/meson/mesonbuild/compilers/mixins/ccrx.py +113 -0
  118. package/releng/meson/mesonbuild/compilers/mixins/clang.py +170 -0
  119. package/releng/meson/mesonbuild/compilers/mixins/clike.py +1330 -0
  120. package/releng/meson/mesonbuild/compilers/mixins/compcert.py +117 -0
  121. package/releng/meson/mesonbuild/compilers/mixins/elbrus.py +93 -0
  122. package/releng/meson/mesonbuild/compilers/mixins/emscripten.py +89 -0
  123. package/releng/meson/mesonbuild/compilers/mixins/gnu.py +629 -0
  124. package/releng/meson/mesonbuild/compilers/mixins/intel.py +167 -0
  125. package/releng/meson/mesonbuild/compilers/mixins/islinker.py +120 -0
  126. package/releng/meson/mesonbuild/compilers/mixins/metrowerks.py +279 -0
  127. package/releng/meson/mesonbuild/compilers/mixins/pgi.py +88 -0
  128. package/releng/meson/mesonbuild/compilers/mixins/ti.py +130 -0
  129. package/releng/meson/mesonbuild/compilers/mixins/visualstudio.py +458 -0
  130. package/releng/meson/mesonbuild/compilers/mixins/xc16.py +111 -0
  131. package/releng/meson/mesonbuild/compilers/objc.py +120 -0
  132. package/releng/meson/mesonbuild/compilers/objcpp.py +102 -0
  133. package/releng/meson/mesonbuild/compilers/rust.py +230 -0
  134. package/releng/meson/mesonbuild/compilers/swift.py +131 -0
  135. package/releng/meson/mesonbuild/compilers/vala.py +121 -0
  136. package/releng/meson/mesonbuild/coredata.py +1532 -0
  137. package/releng/meson/mesonbuild/dependencies/__init__.py +252 -0
  138. package/releng/meson/mesonbuild/dependencies/base.py +663 -0
  139. package/releng/meson/mesonbuild/dependencies/boost.py +1083 -0
  140. package/releng/meson/mesonbuild/dependencies/cmake.py +656 -0
  141. package/releng/meson/mesonbuild/dependencies/coarrays.py +80 -0
  142. package/releng/meson/mesonbuild/dependencies/configtool.py +163 -0
  143. package/releng/meson/mesonbuild/dependencies/cuda.py +295 -0
  144. package/releng/meson/mesonbuild/dependencies/data/CMakeLists.txt +102 -0
  145. package/releng/meson/mesonbuild/dependencies/data/CMakeListsLLVM.txt +204 -0
  146. package/releng/meson/mesonbuild/dependencies/data/CMakePathInfo.txt +31 -0
  147. package/releng/meson/mesonbuild/dependencies/data/__init__.py +0 -0
  148. package/releng/meson/mesonbuild/dependencies/detect.py +225 -0
  149. package/releng/meson/mesonbuild/dependencies/dev.py +707 -0
  150. package/releng/meson/mesonbuild/dependencies/dub.py +424 -0
  151. package/releng/meson/mesonbuild/dependencies/factory.py +146 -0
  152. package/releng/meson/mesonbuild/dependencies/framework.py +111 -0
  153. package/releng/meson/mesonbuild/dependencies/hdf5.py +168 -0
  154. package/releng/meson/mesonbuild/dependencies/misc.py +618 -0
  155. package/releng/meson/mesonbuild/dependencies/mpi.py +231 -0
  156. package/releng/meson/mesonbuild/dependencies/pkgconfig.py +570 -0
  157. package/releng/meson/mesonbuild/dependencies/platform.py +52 -0
  158. package/releng/meson/mesonbuild/dependencies/python.py +431 -0
  159. package/releng/meson/mesonbuild/dependencies/qt.py +484 -0
  160. package/releng/meson/mesonbuild/dependencies/scalapack.py +142 -0
  161. package/releng/meson/mesonbuild/dependencies/ui.py +281 -0
  162. package/releng/meson/mesonbuild/depfile.py +82 -0
  163. package/releng/meson/mesonbuild/envconfig.py +480 -0
  164. package/releng/meson/mesonbuild/environment.py +987 -0
  165. package/releng/meson/mesonbuild/interpreter/__init__.py +47 -0
  166. package/releng/meson/mesonbuild/interpreter/compiler.py +900 -0
  167. package/releng/meson/mesonbuild/interpreter/dependencyfallbacks.py +386 -0
  168. package/releng/meson/mesonbuild/interpreter/interpreter.py +3595 -0
  169. package/releng/meson/mesonbuild/interpreter/interpreterobjects.py +1096 -0
  170. package/releng/meson/mesonbuild/interpreter/kwargs.py +479 -0
  171. package/releng/meson/mesonbuild/interpreter/mesonmain.py +487 -0
  172. package/releng/meson/mesonbuild/interpreter/primitives/__init__.py +29 -0
  173. package/releng/meson/mesonbuild/interpreter/primitives/array.py +108 -0
  174. package/releng/meson/mesonbuild/interpreter/primitives/boolean.py +52 -0
  175. package/releng/meson/mesonbuild/interpreter/primitives/dict.py +88 -0
  176. package/releng/meson/mesonbuild/interpreter/primitives/integer.py +86 -0
  177. package/releng/meson/mesonbuild/interpreter/primitives/range.py +38 -0
  178. package/releng/meson/mesonbuild/interpreter/primitives/string.py +247 -0
  179. package/releng/meson/mesonbuild/interpreter/type_checking.py +853 -0
  180. package/releng/meson/mesonbuild/interpreterbase/__init__.py +126 -0
  181. package/releng/meson/mesonbuild/interpreterbase/_unholder.py +25 -0
  182. package/releng/meson/mesonbuild/interpreterbase/baseobjects.py +174 -0
  183. package/releng/meson/mesonbuild/interpreterbase/decorators.py +806 -0
  184. package/releng/meson/mesonbuild/interpreterbase/disabler.py +35 -0
  185. package/releng/meson/mesonbuild/interpreterbase/exceptions.py +22 -0
  186. package/releng/meson/mesonbuild/interpreterbase/helpers.py +67 -0
  187. package/releng/meson/mesonbuild/interpreterbase/interpreterbase.py +665 -0
  188. package/releng/meson/mesonbuild/interpreterbase/operator.py +32 -0
  189. package/releng/meson/mesonbuild/linkers/__init__.py +20 -0
  190. package/releng/meson/mesonbuild/linkers/base.py +39 -0
  191. package/releng/meson/mesonbuild/linkers/detect.py +229 -0
  192. package/releng/meson/mesonbuild/linkers/linkers.py +1614 -0
  193. package/releng/meson/mesonbuild/mcompile.py +380 -0
  194. package/releng/meson/mesonbuild/mconf.py +368 -0
  195. package/releng/meson/mesonbuild/mdevenv.py +234 -0
  196. package/releng/meson/mesonbuild/mdist.py +376 -0
  197. package/releng/meson/mesonbuild/mesondata.py +38 -0
  198. package/releng/meson/mesonbuild/mesonlib.py +23 -0
  199. package/releng/meson/mesonbuild/mesonmain.py +289 -0
  200. package/releng/meson/mesonbuild/minit.py +204 -0
  201. package/releng/meson/mesonbuild/minstall.py +864 -0
  202. package/releng/meson/mesonbuild/mintro.py +667 -0
  203. package/releng/meson/mesonbuild/mlog.py +542 -0
  204. package/releng/meson/mesonbuild/modules/__init__.py +270 -0
  205. package/releng/meson/mesonbuild/modules/cmake.py +442 -0
  206. package/releng/meson/mesonbuild/modules/cuda.py +377 -0
  207. package/releng/meson/mesonbuild/modules/dlang.py +117 -0
  208. package/releng/meson/mesonbuild/modules/external_project.py +306 -0
  209. package/releng/meson/mesonbuild/modules/fs.py +323 -0
  210. package/releng/meson/mesonbuild/modules/gnome.py +2215 -0
  211. package/releng/meson/mesonbuild/modules/hotdoc.py +487 -0
  212. package/releng/meson/mesonbuild/modules/i18n.py +405 -0
  213. package/releng/meson/mesonbuild/modules/icestorm.py +123 -0
  214. package/releng/meson/mesonbuild/modules/java.py +112 -0
  215. package/releng/meson/mesonbuild/modules/keyval.py +65 -0
  216. package/releng/meson/mesonbuild/modules/modtest.py +33 -0
  217. package/releng/meson/mesonbuild/modules/pkgconfig.py +744 -0
  218. package/releng/meson/mesonbuild/modules/python.py +556 -0
  219. package/releng/meson/mesonbuild/modules/python3.py +85 -0
  220. package/releng/meson/mesonbuild/modules/qt.py +621 -0
  221. package/releng/meson/mesonbuild/modules/qt4.py +23 -0
  222. package/releng/meson/mesonbuild/modules/qt5.py +23 -0
  223. package/releng/meson/mesonbuild/modules/qt6.py +22 -0
  224. package/releng/meson/mesonbuild/modules/rust.py +355 -0
  225. package/releng/meson/mesonbuild/modules/simd.py +114 -0
  226. package/releng/meson/mesonbuild/modules/sourceset.py +291 -0
  227. package/releng/meson/mesonbuild/modules/wayland.py +151 -0
  228. package/releng/meson/mesonbuild/modules/windows.py +207 -0
  229. package/releng/meson/mesonbuild/mparser.py +1114 -0
  230. package/releng/meson/mesonbuild/msetup.py +365 -0
  231. package/releng/meson/mesonbuild/msubprojects.py +764 -0
  232. package/releng/meson/mesonbuild/mtest.py +2201 -0
  233. package/releng/meson/mesonbuild/munstable_coredata.py +107 -0
  234. package/releng/meson/mesonbuild/optinterpreter.py +276 -0
  235. package/releng/meson/mesonbuild/programs.py +367 -0
  236. package/releng/meson/mesonbuild/rewriter.py +1075 -0
  237. package/releng/meson/mesonbuild/scripts/__init__.py +10 -0
  238. package/releng/meson/mesonbuild/scripts/clangformat.py +55 -0
  239. package/releng/meson/mesonbuild/scripts/clangtidy.py +30 -0
  240. package/releng/meson/mesonbuild/scripts/cleantrees.py +35 -0
  241. package/releng/meson/mesonbuild/scripts/cmake_run_ctgt.py +103 -0
  242. package/releng/meson/mesonbuild/scripts/cmd_or_ps.ps1 +17 -0
  243. package/releng/meson/mesonbuild/scripts/copy.py +19 -0
  244. package/releng/meson/mesonbuild/scripts/coverage.py +214 -0
  245. package/releng/meson/mesonbuild/scripts/delwithsuffix.py +27 -0
  246. package/releng/meson/mesonbuild/scripts/depfixer.py +495 -0
  247. package/releng/meson/mesonbuild/scripts/depscan.py +198 -0
  248. package/releng/meson/mesonbuild/scripts/dirchanger.py +20 -0
  249. package/releng/meson/mesonbuild/scripts/env2mfile.py +402 -0
  250. package/releng/meson/mesonbuild/scripts/externalproject.py +106 -0
  251. package/releng/meson/mesonbuild/scripts/gettext.py +86 -0
  252. package/releng/meson/mesonbuild/scripts/gtkdochelper.py +286 -0
  253. package/releng/meson/mesonbuild/scripts/hotdochelper.py +40 -0
  254. package/releng/meson/mesonbuild/scripts/itstool.py +77 -0
  255. package/releng/meson/mesonbuild/scripts/meson_exe.py +115 -0
  256. package/releng/meson/mesonbuild/scripts/msgfmthelper.py +29 -0
  257. package/releng/meson/mesonbuild/scripts/pycompile.py +54 -0
  258. package/releng/meson/mesonbuild/scripts/python_info.py +121 -0
  259. package/releng/meson/mesonbuild/scripts/regen_checker.py +55 -0
  260. package/releng/meson/mesonbuild/scripts/run_tool.py +58 -0
  261. package/releng/meson/mesonbuild/scripts/scanbuild.py +57 -0
  262. package/releng/meson/mesonbuild/scripts/symbolextractor.py +322 -0
  263. package/releng/meson/mesonbuild/scripts/tags.py +44 -0
  264. package/releng/meson/mesonbuild/scripts/test_loaded_modules.py +14 -0
  265. package/releng/meson/mesonbuild/scripts/uninstall.py +41 -0
  266. package/releng/meson/mesonbuild/scripts/vcstagger.py +35 -0
  267. package/releng/meson/mesonbuild/scripts/yasm.py +24 -0
  268. package/releng/meson/mesonbuild/templates/__init__.py +0 -0
  269. package/releng/meson/mesonbuild/templates/cpptemplates.py +143 -0
  270. package/releng/meson/mesonbuild/templates/cstemplates.py +90 -0
  271. package/releng/meson/mesonbuild/templates/ctemplates.py +126 -0
  272. package/releng/meson/mesonbuild/templates/cudatemplates.py +143 -0
  273. package/releng/meson/mesonbuild/templates/dlangtemplates.py +109 -0
  274. package/releng/meson/mesonbuild/templates/fortrantemplates.py +101 -0
  275. package/releng/meson/mesonbuild/templates/javatemplates.py +94 -0
  276. package/releng/meson/mesonbuild/templates/mesontemplates.py +70 -0
  277. package/releng/meson/mesonbuild/templates/objcpptemplates.py +126 -0
  278. package/releng/meson/mesonbuild/templates/objctemplates.py +126 -0
  279. package/releng/meson/mesonbuild/templates/rusttemplates.py +79 -0
  280. package/releng/meson/mesonbuild/templates/samplefactory.py +41 -0
  281. package/releng/meson/mesonbuild/templates/sampleimpl.py +160 -0
  282. package/releng/meson/mesonbuild/templates/valatemplates.py +82 -0
  283. package/releng/meson/mesonbuild/utils/__init__.py +0 -0
  284. package/releng/meson/mesonbuild/utils/core.py +166 -0
  285. package/releng/meson/mesonbuild/utils/platform.py +27 -0
  286. package/releng/meson/mesonbuild/utils/posix.py +32 -0
  287. package/releng/meson/mesonbuild/utils/universal.py +2445 -0
  288. package/releng/meson/mesonbuild/utils/vsenv.py +126 -0
  289. package/releng/meson/mesonbuild/utils/win32.py +29 -0
  290. package/releng/meson/mesonbuild/wrap/__init__.py +59 -0
  291. package/releng/meson/mesonbuild/wrap/wrap.py +846 -0
  292. package/releng/meson/mesonbuild/wrap/wraptool.py +198 -0
  293. package/releng/meson-scripts/BSDmakefile +6 -0
  294. package/releng/meson-scripts/Makefile +16 -0
  295. package/releng/meson-scripts/configure +18 -0
  296. package/releng/meson-scripts/configure.bat +22 -0
  297. package/releng/meson-scripts/make.bat +23 -0
  298. package/releng/meson_configure.py +506 -0
  299. package/releng/meson_make.py +131 -0
  300. package/releng/mkdevkit.py +107 -0
  301. package/releng/mkfatmacho.py +54 -0
  302. package/releng/post-process-oabi.py +97 -0
  303. package/releng/progress.py +14 -0
  304. package/releng/sync-from-upstream.py +185 -0
  305. package/releng/tomlkit/tomlkit/__init__.py +59 -0
  306. package/releng/tomlkit/tomlkit/_compat.py +22 -0
  307. package/releng/tomlkit/tomlkit/_types.py +83 -0
  308. package/releng/tomlkit/tomlkit/_utils.py +158 -0
  309. package/releng/tomlkit/tomlkit/api.py +308 -0
  310. package/releng/tomlkit/tomlkit/container.py +875 -0
  311. package/releng/tomlkit/tomlkit/exceptions.py +227 -0
  312. package/releng/tomlkit/tomlkit/items.py +1967 -0
  313. package/releng/tomlkit/tomlkit/parser.py +1141 -0
  314. package/releng/tomlkit/tomlkit/py.typed +0 -0
  315. package/releng/tomlkit/tomlkit/source.py +180 -0
  316. package/releng/tomlkit/tomlkit/toml_char.py +52 -0
  317. package/releng/tomlkit/tomlkit/toml_document.py +7 -0
  318. package/releng/tomlkit/tomlkit/toml_file.py +58 -0
  319. package/releng/winenv.py +140 -0
  320. package/scripts/adjust-version.py +19 -0
  321. package/scripts/detect-version.py +40 -0
  322. package/scripts/fetch-abi-bits.py +343 -0
  323. package/scripts/install.js +23 -0
  324. package/scripts/package.py +15 -0
  325. package/src/addon.cc +76 -0
  326. package/src/application.cc +148 -0
  327. package/src/application.h +31 -0
  328. package/src/authentication.cc +174 -0
  329. package/src/authentication.h +24 -0
  330. package/src/bus.cc +167 -0
  331. package/src/bus.h +33 -0
  332. package/src/cancellable.cc +117 -0
  333. package/src/cancellable.h +31 -0
  334. package/src/child.cc +150 -0
  335. package/src/child.h +32 -0
  336. package/src/crash.cc +122 -0
  337. package/src/crash.h +30 -0
  338. package/src/device.cc +1302 -0
  339. package/src/device.h +55 -0
  340. package/src/device_manager.cc +362 -0
  341. package/src/device_manager.h +35 -0
  342. package/src/endpoint_parameters.cc +171 -0
  343. package/src/endpoint_parameters.h +28 -0
  344. package/src/glib_context.cc +62 -0
  345. package/src/glib_context.h +29 -0
  346. package/src/glib_object.cc +25 -0
  347. package/src/glib_object.h +37 -0
  348. package/src/iostream.cc +247 -0
  349. package/src/iostream.h +30 -0
  350. package/src/meson.build +26 -0
  351. package/src/operation.h +94 -0
  352. package/src/portal_membership.cc +100 -0
  353. package/src/portal_membership.h +26 -0
  354. package/src/portal_service.cc +401 -0
  355. package/src/portal_service.h +40 -0
  356. package/src/process.cc +135 -0
  357. package/src/process.h +30 -0
  358. package/src/relay.cc +139 -0
  359. package/src/relay.h +31 -0
  360. package/src/runtime.cc +443 -0
  361. package/src/runtime.h +64 -0
  362. package/src/script.cc +301 -0
  363. package/src/script.h +36 -0
  364. package/src/session.cc +860 -0
  365. package/src/session.h +42 -0
  366. package/src/signals.cc +334 -0
  367. package/src/signals.h +47 -0
  368. package/src/spawn.cc +95 -0
  369. package/src/spawn.h +27 -0
  370. package/src/usage_monitor.h +117 -0
  371. package/src/uv_context.cc +118 -0
  372. package/src/uv_context.h +40 -0
  373. package/src/win_delay_load_hook.cc +63 -0
  374. package/subprojects/frida-core.wrap +8 -0
  375. package/subprojects/nan.wrap +9 -0
  376. package/subprojects/packagefiles/nan.patch +13 -0
  377. package/test/data/index.ts +13 -0
  378. package/test/data/unixvictim-linux-x86 +0 -0
  379. package/test/data/unixvictim-linux-x86_64 +0 -0
  380. package/test/data/unixvictim-macos +0 -0
  381. package/test/device.ts +27 -0
  382. package/test/device_manager.ts +16 -0
  383. package/test/labrat.ts +32 -0
  384. package/test/script.ts +176 -0
  385. package/test/session.ts +73 -0
  386. package/tsconfig.json +18 -0
@@ -0,0 +1,306 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+ # Copyright 2020 The Meson development team
3
+
4
+ from __future__ import annotations
5
+
6
+ from pathlib import Path
7
+ import os
8
+ import shlex
9
+ import subprocess
10
+ import typing as T
11
+
12
+ from . import ExtensionModule, ModuleReturnValue, NewExtensionModule, ModuleInfo
13
+ from .. import mlog, build
14
+ from ..compilers.compilers import CFLAGS_MAPPING
15
+ from ..envconfig import ENV_VAR_PROG_MAP
16
+ from ..dependencies import InternalDependency
17
+ from ..dependencies.pkgconfig import PkgConfigInterface
18
+ from ..interpreterbase import FeatureNew
19
+ from ..interpreter.type_checking import ENV_KW, DEPENDS_KW
20
+ from ..interpreterbase.decorators import ContainerTypeInfo, KwargInfo, typed_kwargs, typed_pos_args
21
+ from ..mesonlib import (EnvironmentException, MesonException, Popen_safe, MachineChoice,
22
+ get_variable_regex, do_replacement, join_args, OptionKey)
23
+
24
+ if T.TYPE_CHECKING:
25
+ from typing_extensions import TypedDict
26
+
27
+ from . import ModuleState
28
+ from .._typing import ImmutableListProtocol
29
+ from ..build import BuildTarget, CustomTarget
30
+ from ..interpreter import Interpreter
31
+ from ..interpreterbase import TYPE_var
32
+ from ..mesonlib import EnvironmentVariables
33
+ from ..utils.core import EnvironOrDict
34
+
35
+ class Dependency(TypedDict):
36
+
37
+ subdir: str
38
+
39
+ class AddProject(TypedDict):
40
+
41
+ configure_options: T.List[str]
42
+ cross_configure_options: T.List[str]
43
+ verbose: bool
44
+ env: EnvironmentVariables
45
+ depends: T.List[T.Union[BuildTarget, CustomTarget]]
46
+
47
+
48
+ class ExternalProject(NewExtensionModule):
49
+
50
+ make: ImmutableListProtocol[str]
51
+
52
+ def __init__(self,
53
+ state: 'ModuleState',
54
+ configure_command: str,
55
+ configure_options: T.List[str],
56
+ cross_configure_options: T.List[str],
57
+ env: EnvironmentVariables,
58
+ verbose: bool,
59
+ extra_depends: T.List[T.Union['BuildTarget', 'CustomTarget']]):
60
+ super().__init__()
61
+ self.methods.update({'dependency': self.dependency_method,
62
+ })
63
+
64
+ self.subdir = Path(state.subdir)
65
+ self.project_version = state.project_version
66
+ self.subproject = state.subproject
67
+ self.env = state.environment
68
+ self.configure_command = configure_command
69
+ self.configure_options = configure_options
70
+ self.cross_configure_options = cross_configure_options
71
+ self.verbose = verbose
72
+ self.user_env = env
73
+
74
+ self.src_dir = Path(self.env.get_source_dir(), self.subdir)
75
+ self.build_dir = Path(self.env.get_build_dir(), self.subdir, 'build')
76
+ self.install_dir = Path(self.env.get_build_dir(), self.subdir, 'dist')
77
+ _p = self.env.coredata.get_option(OptionKey('prefix'))
78
+ assert isinstance(_p, str), 'for mypy'
79
+ self.prefix = Path(_p)
80
+ _l = self.env.coredata.get_option(OptionKey('libdir'))
81
+ assert isinstance(_l, str), 'for mypy'
82
+ self.libdir = Path(_l)
83
+ _i = self.env.coredata.get_option(OptionKey('includedir'))
84
+ assert isinstance(_i, str), 'for mypy'
85
+ self.includedir = Path(_i)
86
+ self.name = self.src_dir.name
87
+
88
+ # On Windows if the prefix is "c:/foo" and DESTDIR is "c:/bar", `make`
89
+ # will install files into "c:/bar/c:/foo" which is an invalid path.
90
+ # Work around that issue by removing the drive from prefix.
91
+ if self.prefix.drive:
92
+ self.prefix = self.prefix.relative_to(self.prefix.drive)
93
+
94
+ # self.prefix is an absolute path, so we cannot append it to another path.
95
+ self.rel_prefix = self.prefix.relative_to(self.prefix.root)
96
+
97
+ self._configure(state)
98
+
99
+ self.targets = self._create_targets(extra_depends, state.is_build_only_subproject)
100
+
101
+ def _configure(self, state: 'ModuleState') -> None:
102
+ if self.configure_command == 'waf':
103
+ FeatureNew('Waf external project', '0.60.0').use(self.subproject, state.current_node)
104
+ waf = state.find_program('waf')
105
+ configure_cmd = waf.get_command()
106
+ configure_cmd += ['configure', '-o', str(self.build_dir)]
107
+ workdir = self.src_dir
108
+ self.make = waf.get_command() + ['build']
109
+ else:
110
+ # Assume it's the name of a script in source dir, like 'configure',
111
+ # 'autogen.sh', etc).
112
+ configure_path = Path(self.src_dir, self.configure_command)
113
+ configure_prog = state.find_program(configure_path.as_posix())
114
+ configure_cmd = configure_prog.get_command()
115
+ workdir = self.build_dir
116
+ self.make = state.find_program('make').get_command()
117
+
118
+ d = [('PREFIX', '--prefix=@PREFIX@', self.prefix.as_posix()),
119
+ ('LIBDIR', '--libdir=@PREFIX@/@LIBDIR@', self.libdir.as_posix()),
120
+ ('INCLUDEDIR', None, self.includedir.as_posix()),
121
+ ]
122
+ self._validate_configure_options(d, state)
123
+
124
+ configure_cmd += self._format_options(self.configure_options, d)
125
+
126
+ if self.env.is_cross_build():
127
+ host = '{}-{}-{}'.format(state.environment.machines.host.cpu,
128
+ 'pc' if state.environment.machines.host.cpu_family in {"x86", "x86_64"}
129
+ else 'unknown',
130
+ state.environment.machines.host.system)
131
+ d = [('HOST', None, host)]
132
+ configure_cmd += self._format_options(self.cross_configure_options, d)
133
+
134
+ # Set common env variables like CFLAGS, CC, etc.
135
+ link_exelist: T.List[str] = []
136
+ link_args: T.List[str] = []
137
+ self.run_env: EnvironOrDict = os.environ.copy()
138
+ for lang, compiler in self.env.coredata.compilers[MachineChoice.HOST].items():
139
+ if any(lang not in i for i in (ENV_VAR_PROG_MAP, CFLAGS_MAPPING)):
140
+ continue
141
+ cargs = self.env.coredata.get_external_args(MachineChoice.HOST, lang)
142
+ assert isinstance(cargs, list), 'for mypy'
143
+ self.run_env[ENV_VAR_PROG_MAP[lang]] = self._quote_and_join(compiler.get_exelist())
144
+ self.run_env[CFLAGS_MAPPING[lang]] = self._quote_and_join(cargs)
145
+ if not link_exelist:
146
+ link_exelist = compiler.get_linker_exelist()
147
+ _l = self.env.coredata.get_external_link_args(MachineChoice.HOST, lang)
148
+ assert isinstance(_l, list), 'for mypy'
149
+ link_args = _l
150
+ if link_exelist:
151
+ # FIXME: Do not pass linker because Meson uses CC as linker wrapper,
152
+ # but autotools often expects the real linker (e.h. GNU ld).
153
+ # self.run_env['LD'] = self._quote_and_join(link_exelist)
154
+ pass
155
+ self.run_env['LDFLAGS'] = self._quote_and_join(link_args)
156
+
157
+ self.run_env = self.user_env.get_env(self.run_env)
158
+ self.run_env = PkgConfigInterface.setup_env(self.run_env, self.env, MachineChoice.HOST,
159
+ uninstalled=True)
160
+
161
+ self.build_dir.mkdir(parents=True, exist_ok=True)
162
+ self._run('configure', configure_cmd, workdir)
163
+
164
+ def _quote_and_join(self, array: T.List[str]) -> str:
165
+ return ' '.join([shlex.quote(i) for i in array])
166
+
167
+ def _validate_configure_options(self, variables: T.List[T.Tuple[str, str, str]], state: 'ModuleState') -> None:
168
+ # Ensure the user at least try to pass basic info to the build system,
169
+ # like the prefix, libdir, etc.
170
+ for key, default, val in variables:
171
+ if default is None:
172
+ continue
173
+ key_format = f'@{key}@'
174
+ for option in self.configure_options:
175
+ if key_format in option:
176
+ break
177
+ else:
178
+ FeatureNew('Default configure_option', '0.57.0').use(self.subproject, state.current_node)
179
+ self.configure_options.append(default)
180
+
181
+ def _format_options(self, options: T.List[str], variables: T.List[T.Tuple[str, str, str]]) -> T.List[str]:
182
+ out: T.List[str] = []
183
+ missing = set()
184
+ regex = get_variable_regex('meson')
185
+ confdata: T.Dict[str, T.Tuple[str, T.Optional[str]]] = {k: (v, None) for k, _, v in variables}
186
+ for o in options:
187
+ arg, missing_vars = do_replacement(regex, o, 'meson', confdata)
188
+ missing.update(missing_vars)
189
+ out.append(arg)
190
+ if missing:
191
+ var_list = ", ".join(repr(m) for m in sorted(missing))
192
+ raise EnvironmentException(
193
+ f"Variables {var_list} in configure options are missing.")
194
+ return out
195
+
196
+ def _run(self, step: str, command: T.List[str], workdir: Path) -> None:
197
+ mlog.log(f'External project {self.name}:', mlog.bold(step))
198
+ m = 'Running command ' + str(command) + ' in directory ' + str(workdir) + '\n'
199
+ log_filename = Path(mlog.get_log_dir(), f'{self.name}-{step}.log')
200
+ output = None
201
+ if not self.verbose:
202
+ output = open(log_filename, 'w', encoding='utf-8')
203
+ output.write(m + '\n')
204
+ output.flush()
205
+ else:
206
+ mlog.log(m)
207
+ p, *_ = Popen_safe(command, cwd=workdir, env=self.run_env,
208
+ stderr=subprocess.STDOUT,
209
+ stdout=output)
210
+ if p.returncode != 0:
211
+ m = f'{step} step returned error code {p.returncode}.'
212
+ if not self.verbose:
213
+ m += '\nSee logs: ' + str(log_filename)
214
+ raise MesonException(m)
215
+
216
+ def _create_targets(self, extra_depends: T.List[T.Union['BuildTarget', 'CustomTarget']], is_build_only_subproject: bool) -> T.List['TYPE_var']:
217
+ cmd = self.env.get_build_command()
218
+ cmd += ['--internal', 'externalproject',
219
+ '--name', self.name,
220
+ '--srcdir', self.src_dir.as_posix(),
221
+ '--builddir', self.build_dir.as_posix(),
222
+ '--installdir', self.install_dir.as_posix(),
223
+ '--logdir', mlog.get_log_dir(),
224
+ '--make', join_args(self.make),
225
+ ]
226
+ if self.verbose:
227
+ cmd.append('--verbose')
228
+
229
+ self.target = build.CustomTarget(
230
+ self.name,
231
+ self.subdir.as_posix(),
232
+ self.subproject,
233
+ self.env,
234
+ cmd + ['@OUTPUT@', '@DEPFILE@'],
235
+ [],
236
+ [f'{self.name}.stamp'],
237
+ is_build_only_subproject,
238
+ depfile=f'{self.name}.d',
239
+ console=True,
240
+ extra_depends=extra_depends,
241
+ description='Generating external project {}',
242
+ )
243
+
244
+ idir = build.InstallDir(self.subdir.as_posix(),
245
+ Path('dist', self.rel_prefix).as_posix(),
246
+ install_dir='.',
247
+ install_dir_name='.',
248
+ install_mode=None,
249
+ exclude=None,
250
+ strip_directory=True,
251
+ from_source_dir=False,
252
+ subproject=self.subproject)
253
+
254
+ return [self.target, idir]
255
+
256
+ @typed_pos_args('external_project.dependency', str)
257
+ @typed_kwargs('external_project.dependency', KwargInfo('subdir', str, default=''))
258
+ def dependency_method(self, state: 'ModuleState', args: T.Tuple[str], kwargs: 'Dependency') -> InternalDependency:
259
+ libname = args[0]
260
+
261
+ abs_includedir = Path(self.install_dir, self.rel_prefix, self.includedir)
262
+ if kwargs['subdir']:
263
+ abs_includedir = Path(abs_includedir, kwargs['subdir'])
264
+ abs_libdir = Path(self.install_dir, self.rel_prefix, self.libdir)
265
+
266
+ version = self.project_version
267
+ compile_args = [f'-I{abs_includedir}']
268
+ link_args = [f'-L{abs_libdir}', f'-l{libname}']
269
+ sources = self.target
270
+ dep = InternalDependency(version, [], compile_args, link_args, [],
271
+ [], [sources], [], [], {}, [], [], [])
272
+ return dep
273
+
274
+
275
+ class ExternalProjectModule(ExtensionModule):
276
+
277
+ INFO = ModuleInfo('External build system', '0.56.0', unstable=True)
278
+
279
+ def __init__(self, interpreter: 'Interpreter'):
280
+ super().__init__(interpreter)
281
+ self.methods.update({'add_project': self.add_project,
282
+ })
283
+
284
+ @typed_pos_args('external_project_mod.add_project', str)
285
+ @typed_kwargs(
286
+ 'external_project.add_project',
287
+ KwargInfo('configure_options', ContainerTypeInfo(list, str), default=[], listify=True),
288
+ KwargInfo('cross_configure_options', ContainerTypeInfo(list, str), default=['--host=@HOST@'], listify=True),
289
+ KwargInfo('verbose', bool, default=False),
290
+ ENV_KW,
291
+ DEPENDS_KW.evolve(since='0.63.0'),
292
+ )
293
+ def add_project(self, state: 'ModuleState', args: T.Tuple[str], kwargs: 'AddProject') -> ModuleReturnValue:
294
+ configure_command = args[0]
295
+ project = ExternalProject(state,
296
+ configure_command,
297
+ kwargs['configure_options'],
298
+ kwargs['cross_configure_options'],
299
+ kwargs['env'],
300
+ kwargs['verbose'],
301
+ kwargs['depends'])
302
+ return ModuleReturnValue(project, project.targets)
303
+
304
+
305
+ def initialize(interp: 'Interpreter') -> ExternalProjectModule:
306
+ return ExternalProjectModule(interp)
@@ -0,0 +1,323 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+ # Copyright 2019 The Meson development team
3
+
4
+ from __future__ import annotations
5
+ from pathlib import Path, PurePath, PureWindowsPath
6
+ import hashlib
7
+ import os
8
+ import typing as T
9
+
10
+ from . import ExtensionModule, ModuleReturnValue, ModuleInfo
11
+ from .. import mlog
12
+ from ..build import BuildTarget, CustomTarget, CustomTargetIndex, InvalidArguments
13
+ from ..interpreter.type_checking import INSTALL_KW, INSTALL_MODE_KW, INSTALL_TAG_KW, NoneType
14
+ from ..interpreterbase import FeatureNew, KwargInfo, typed_kwargs, typed_pos_args, noKwargs
15
+ from ..mesonlib import File, MesonException, has_path_sep, path_is_in_root, relpath
16
+
17
+ if T.TYPE_CHECKING:
18
+ from . import ModuleState
19
+ from ..build import BuildTargetTypes
20
+ from ..interpreter import Interpreter
21
+ from ..interpreterbase import TYPE_kwargs
22
+ from ..mesonlib import FileOrString, FileMode
23
+
24
+ from typing_extensions import TypedDict
25
+
26
+ class ReadKwArgs(TypedDict):
27
+ """Keyword Arguments for fs.read."""
28
+
29
+ encoding: str
30
+
31
+ class CopyKw(TypedDict):
32
+
33
+ """Kwargs for fs.copy"""
34
+
35
+ install: bool
36
+ install_dir: T.Optional[str]
37
+ install_mode: FileMode
38
+ install_tag: T.Optional[str]
39
+
40
+
41
+ class FSModule(ExtensionModule):
42
+
43
+ INFO = ModuleInfo('fs', '0.53.0')
44
+
45
+ def __init__(self, interpreter: 'Interpreter') -> None:
46
+ super().__init__(interpreter)
47
+ self.methods.update({
48
+ 'as_posix': self.as_posix,
49
+ 'copyfile': self.copyfile,
50
+ 'exists': self.exists,
51
+ 'expanduser': self.expanduser,
52
+ 'hash': self.hash,
53
+ 'is_absolute': self.is_absolute,
54
+ 'is_dir': self.is_dir,
55
+ 'is_file': self.is_file,
56
+ 'is_samepath': self.is_samepath,
57
+ 'is_symlink': self.is_symlink,
58
+ 'name': self.name,
59
+ 'parent': self.parent,
60
+ 'read': self.read,
61
+ 'relative_to': self.relative_to,
62
+ 'replace_suffix': self.replace_suffix,
63
+ 'size': self.size,
64
+ 'stem': self.stem,
65
+ })
66
+
67
+ def _absolute_dir(self, state: 'ModuleState', arg: 'FileOrString') -> Path:
68
+ """
69
+ make an absolute path from a relative path, WITHOUT resolving symlinks
70
+ """
71
+ if isinstance(arg, File):
72
+ return Path(arg.absolute_path(state.source_root, state.environment.get_build_dir()))
73
+ return Path(state.source_root) / Path(state.subdir) / Path(arg).expanduser()
74
+
75
+ @staticmethod
76
+ def _obj_to_path(feature_new_prefix: str, obj: T.Union[FileOrString, BuildTargetTypes], state: ModuleState) -> PurePath:
77
+ if isinstance(obj, str):
78
+ return PurePath(obj)
79
+
80
+ if isinstance(obj, File):
81
+ FeatureNew(f'{feature_new_prefix} with file', '0.59.0').use(state.subproject, location=state.current_node)
82
+ return PurePath(str(obj))
83
+
84
+ FeatureNew(f'{feature_new_prefix} with build_tgt, custom_tgt, and custom_idx', '1.4.0').use(state.subproject, location=state.current_node)
85
+ return PurePath(state.backend.get_target_filename(obj))
86
+
87
+ def _resolve_dir(self, state: 'ModuleState', arg: 'FileOrString') -> Path:
88
+ """
89
+ resolves symlinks and makes absolute a directory relative to calling meson.build,
90
+ if not already absolute
91
+ """
92
+ path = self._absolute_dir(state, arg)
93
+ try:
94
+ # accommodate unresolvable paths e.g. symlink loops
95
+ path = path.resolve()
96
+ except Exception:
97
+ # return the best we could do
98
+ pass
99
+ return path
100
+
101
+ @noKwargs
102
+ @FeatureNew('fs.expanduser', '0.54.0')
103
+ @typed_pos_args('fs.expanduser', str)
104
+ def expanduser(self, state: 'ModuleState', args: T.Tuple[str], kwargs: T.Dict[str, T.Any]) -> str:
105
+ return str(Path(args[0]).expanduser())
106
+
107
+ @noKwargs
108
+ @FeatureNew('fs.is_absolute', '0.54.0')
109
+ @typed_pos_args('fs.is_absolute', (str, File))
110
+ def is_absolute(self, state: 'ModuleState', args: T.Tuple['FileOrString'], kwargs: T.Dict[str, T.Any]) -> bool:
111
+ if isinstance(args[0], File):
112
+ FeatureNew('fs.is_absolute with file', '0.59.0').use(state.subproject, location=state.current_node)
113
+ return PurePath(str(args[0])).is_absolute()
114
+
115
+ @noKwargs
116
+ @FeatureNew('fs.as_posix', '0.54.0')
117
+ @typed_pos_args('fs.as_posix', str)
118
+ def as_posix(self, state: 'ModuleState', args: T.Tuple[str], kwargs: T.Dict[str, T.Any]) -> str:
119
+ r"""
120
+ this function assumes you are passing a Windows path, even if on a Unix-like system
121
+ and so ALL '\' are turned to '/', even if you meant to escape a character
122
+ """
123
+ return PureWindowsPath(args[0]).as_posix()
124
+
125
+ @noKwargs
126
+ @typed_pos_args('fs.exists', str)
127
+ def exists(self, state: 'ModuleState', args: T.Tuple[str], kwargs: T.Dict[str, T.Any]) -> bool:
128
+ return self._resolve_dir(state, args[0]).exists()
129
+
130
+ @noKwargs
131
+ @typed_pos_args('fs.is_symlink', (str, File))
132
+ def is_symlink(self, state: 'ModuleState', args: T.Tuple['FileOrString'], kwargs: T.Dict[str, T.Any]) -> bool:
133
+ if isinstance(args[0], File):
134
+ FeatureNew('fs.is_symlink with file', '0.59.0').use(state.subproject, location=state.current_node)
135
+ return self._absolute_dir(state, args[0]).is_symlink()
136
+
137
+ @noKwargs
138
+ @typed_pos_args('fs.is_file', str)
139
+ def is_file(self, state: 'ModuleState', args: T.Tuple[str], kwargs: T.Dict[str, T.Any]) -> bool:
140
+ return self._resolve_dir(state, args[0]).is_file()
141
+
142
+ @noKwargs
143
+ @typed_pos_args('fs.is_dir', str)
144
+ def is_dir(self, state: 'ModuleState', args: T.Tuple[str], kwargs: T.Dict[str, T.Any]) -> bool:
145
+ return self._resolve_dir(state, args[0]).is_dir()
146
+
147
+ @noKwargs
148
+ @typed_pos_args('fs.hash', (str, File), str)
149
+ def hash(self, state: 'ModuleState', args: T.Tuple['FileOrString', str], kwargs: T.Dict[str, T.Any]) -> str:
150
+ if isinstance(args[0], File):
151
+ FeatureNew('fs.hash with file', '0.59.0').use(state.subproject, location=state.current_node)
152
+ file = self._resolve_dir(state, args[0])
153
+ if not file.is_file():
154
+ raise MesonException(f'{file} is not a file and therefore cannot be hashed')
155
+ try:
156
+ h = hashlib.new(args[1])
157
+ except ValueError:
158
+ raise MesonException('hash algorithm {} is not available'.format(args[1]))
159
+ mlog.debug('computing {} sum of {} size {} bytes'.format(args[1], file, file.stat().st_size))
160
+ h.update(file.read_bytes())
161
+ return h.hexdigest()
162
+
163
+ @noKwargs
164
+ @typed_pos_args('fs.size', (str, File))
165
+ def size(self, state: 'ModuleState', args: T.Tuple['FileOrString'], kwargs: T.Dict[str, T.Any]) -> int:
166
+ if isinstance(args[0], File):
167
+ FeatureNew('fs.size with file', '0.59.0').use(state.subproject, location=state.current_node)
168
+ file = self._resolve_dir(state, args[0])
169
+ if not file.is_file():
170
+ raise MesonException(f'{file} is not a file and therefore cannot be sized')
171
+ try:
172
+ return file.stat().st_size
173
+ except ValueError:
174
+ raise MesonException('{} size could not be determined'.format(args[0]))
175
+
176
+ @noKwargs
177
+ @typed_pos_args('fs.is_samepath', (str, File), (str, File))
178
+ def is_samepath(self, state: 'ModuleState', args: T.Tuple['FileOrString', 'FileOrString'], kwargs: T.Dict[str, T.Any]) -> bool:
179
+ if isinstance(args[0], File) or isinstance(args[1], File):
180
+ FeatureNew('fs.is_samepath with file', '0.59.0').use(state.subproject, location=state.current_node)
181
+ file1 = self._resolve_dir(state, args[0])
182
+ file2 = self._resolve_dir(state, args[1])
183
+ if not file1.exists():
184
+ return False
185
+ if not file2.exists():
186
+ return False
187
+ try:
188
+ return file1.samefile(file2)
189
+ except OSError:
190
+ return False
191
+
192
+ @noKwargs
193
+ @typed_pos_args('fs.replace_suffix', (str, File, CustomTarget, CustomTargetIndex, BuildTarget), str)
194
+ def replace_suffix(self, state: 'ModuleState', args: T.Tuple[T.Union[FileOrString, BuildTargetTypes], str], kwargs: T.Dict[str, T.Any]) -> str:
195
+ path = self._obj_to_path('fs.replace_suffix', args[0], state)
196
+ return str(path.with_suffix(args[1]))
197
+
198
+ @noKwargs
199
+ @typed_pos_args('fs.parent', (str, File, CustomTarget, CustomTargetIndex, BuildTarget))
200
+ def parent(self, state: 'ModuleState', args: T.Tuple[T.Union[FileOrString, BuildTargetTypes]], kwargs: T.Dict[str, T.Any]) -> str:
201
+ path = self._obj_to_path('fs.parent', args[0], state)
202
+ return str(path.parent)
203
+
204
+ @noKwargs
205
+ @typed_pos_args('fs.name', (str, File, CustomTarget, CustomTargetIndex, BuildTarget))
206
+ def name(self, state: 'ModuleState', args: T.Tuple[T.Union[FileOrString, BuildTargetTypes]], kwargs: T.Dict[str, T.Any]) -> str:
207
+ path = self._obj_to_path('fs.name', args[0], state)
208
+ return str(path.name)
209
+
210
+ @noKwargs
211
+ @typed_pos_args('fs.stem', (str, File, CustomTarget, CustomTargetIndex, BuildTarget))
212
+ @FeatureNew('fs.stem', '0.54.0')
213
+ def stem(self, state: 'ModuleState', args: T.Tuple[T.Union[FileOrString, BuildTargetTypes]], kwargs: T.Dict[str, T.Any]) -> str:
214
+ path = self._obj_to_path('fs.stem', args[0], state)
215
+ return str(path.stem)
216
+
217
+ @FeatureNew('fs.read', '0.57.0')
218
+ @typed_pos_args('fs.read', (str, File))
219
+ @typed_kwargs('fs.read', KwargInfo('encoding', str, default='utf-8'))
220
+ def read(self, state: 'ModuleState', args: T.Tuple['FileOrString'], kwargs: 'ReadKwArgs') -> str:
221
+ """Read a file from the source tree and return its value as a decoded
222
+ string.
223
+
224
+ If the encoding is not specified, the file is assumed to be utf-8
225
+ encoded. Paths must be relative by default (to prevent accidents) and
226
+ are forbidden to be read from the build directory (to prevent build
227
+ loops)
228
+ """
229
+ path = args[0]
230
+ encoding = kwargs['encoding']
231
+ src_dir = state.environment.source_dir
232
+ sub_dir = state.subdir
233
+ build_dir = state.environment.get_build_dir()
234
+
235
+ if isinstance(path, File):
236
+ if path.is_built:
237
+ raise MesonException(
238
+ 'fs.read does not accept built files() objects')
239
+ path = os.path.join(src_dir, path.relative_name())
240
+ else:
241
+ if sub_dir:
242
+ src_dir = os.path.join(src_dir, sub_dir)
243
+ path = os.path.join(src_dir, path)
244
+
245
+ path = os.path.abspath(path)
246
+ if path_is_in_root(Path(path), Path(build_dir), resolve=True):
247
+ raise MesonException('path must not be in the build tree')
248
+ try:
249
+ with open(path, encoding=encoding) as f:
250
+ data = f.read()
251
+ except FileNotFoundError:
252
+ raise MesonException(f'File {args[0]} does not exist.')
253
+ except UnicodeDecodeError:
254
+ raise MesonException(f'decoding failed for {args[0]}')
255
+ # Reconfigure when this file changes as it can contain data used by any
256
+ # part of the build configuration (e.g. `project(..., version:
257
+ # fs.read_file('VERSION')` or `configure_file(...)`
258
+ self.interpreter.add_build_def_file(path)
259
+ return data
260
+
261
+ @FeatureNew('fs.copyfile', '0.64.0')
262
+ @typed_pos_args('fs.copyfile', (File, str), optargs=[str])
263
+ @typed_kwargs(
264
+ 'fs.copyfile',
265
+ INSTALL_KW,
266
+ INSTALL_MODE_KW,
267
+ INSTALL_TAG_KW,
268
+ KwargInfo('install_dir', (str, NoneType)),
269
+ )
270
+ def copyfile(self, state: ModuleState, args: T.Tuple[FileOrString, T.Optional[str]],
271
+ kwargs: CopyKw) -> ModuleReturnValue:
272
+ """Copy a file into the build directory at build time."""
273
+ if kwargs['install'] and not kwargs['install_dir']:
274
+ raise InvalidArguments('"install_dir" must be specified when "install" is true')
275
+
276
+ src = self.interpreter.source_strings_to_files([args[0]])[0]
277
+
278
+ # The input is allowed to have path separators, but the output may not,
279
+ # so use the basename for the default case
280
+ dest = args[1] if args[1] else os.path.basename(src.fname)
281
+ if has_path_sep(dest):
282
+ raise InvalidArguments('Destination path may not have path separators')
283
+
284
+ ct = CustomTarget(
285
+ dest,
286
+ state.subdir,
287
+ state.subproject,
288
+ state.environment,
289
+ state.environment.get_build_command() + ['--internal', 'copy', '@INPUT@', '@OUTPUT@'],
290
+ [src],
291
+ [dest],
292
+ state.is_build_only_subproject,
293
+ build_by_default=True,
294
+ install=kwargs['install'],
295
+ install_dir=[kwargs['install_dir']],
296
+ install_mode=kwargs['install_mode'],
297
+ install_tag=[kwargs['install_tag']],
298
+ backend=state.backend,
299
+ description='Copying file {}',
300
+ )
301
+
302
+ return ModuleReturnValue(ct, [ct])
303
+
304
+ @FeatureNew('fs.relative_to', '1.3.0')
305
+ @typed_pos_args('fs.relative_to', (str, File, CustomTarget, CustomTargetIndex, BuildTarget), (str, File, CustomTarget, CustomTargetIndex, BuildTarget))
306
+ @noKwargs
307
+ def relative_to(self, state: ModuleState, args: T.Tuple[T.Union[FileOrString, BuildTargetTypes], T.Union[FileOrString, BuildTargetTypes]], kwargs: TYPE_kwargs) -> str:
308
+ def to_path(arg: T.Union[FileOrString, CustomTarget, CustomTargetIndex, BuildTarget]) -> str:
309
+ if isinstance(arg, File):
310
+ return arg.absolute_path(state.environment.source_dir, state.environment.build_dir)
311
+ elif isinstance(arg, (CustomTarget, CustomTargetIndex, BuildTarget)):
312
+ return state.backend.get_target_filename_abs(arg)
313
+ else:
314
+ return os.path.join(state.environment.source_dir, state.subdir, arg)
315
+
316
+ t = to_path(args[0])
317
+ f = to_path(args[1])
318
+
319
+ return relpath(t, f)
320
+
321
+
322
+ def initialize(*args: T.Any, **kwargs: T.Any) -> FSModule:
323
+ return FSModule(*args, **kwargs)