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,291 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+ # Copyright 2019 The Meson development team
3
+
4
+ from __future__ import annotations
5
+ import typing as T
6
+
7
+ from . import ExtensionModule, ModuleObject, MutableModuleObject, ModuleInfo
8
+ from .. import build
9
+ from .. import dependencies
10
+ from .. import mesonlib
11
+ from ..interpreterbase import (
12
+ noPosargs, noKwargs,
13
+ InterpreterException, InvalidArguments, InvalidCode, FeatureNew,
14
+ )
15
+ from ..interpreterbase.decorators import ContainerTypeInfo, KwargInfo, typed_kwargs, typed_pos_args
16
+ from ..mesonlib import OrderedSet
17
+
18
+ if T.TYPE_CHECKING:
19
+ from typing_extensions import TypedDict
20
+
21
+ from . import ModuleState
22
+ from ..interpreter import Interpreter
23
+ from ..interpreterbase import TYPE_var, TYPE_kwargs
24
+
25
+ class AddKwargs(TypedDict):
26
+
27
+ when: T.List[T.Union[str, dependencies.Dependency]]
28
+ if_true: T.List[T.Union[mesonlib.FileOrString, build.GeneratedTypes, dependencies.Dependency]]
29
+ if_false: T.List[T.Union[mesonlib.FileOrString, build.GeneratedTypes]]
30
+
31
+ class AddAllKw(TypedDict):
32
+
33
+ when: T.List[T.Union[str, dependencies.Dependency]]
34
+ if_true: T.List[SourceSetImpl]
35
+
36
+ class ApplyKw(TypedDict):
37
+
38
+ strict: bool
39
+
40
+
41
+ _WHEN_KW: KwargInfo[T.List[T.Union[str, dependencies.Dependency]]] = KwargInfo(
42
+ 'when',
43
+ ContainerTypeInfo(list, (str, dependencies.Dependency)),
44
+ listify=True,
45
+ default=[],
46
+ )
47
+
48
+
49
+ class SourceSetRule(T.NamedTuple):
50
+ keys: T.List[str]
51
+ """Configuration keys that enable this rule if true"""
52
+
53
+ deps: T.List[dependencies.Dependency]
54
+ """Dependencies that enable this rule if true"""
55
+
56
+ sources: T.List[T.Union[mesonlib.FileOrString, build.GeneratedTypes]]
57
+ """Source files added when this rule's conditions are true"""
58
+
59
+ extra_deps: T.List[dependencies.Dependency]
60
+ """Dependencies added when this rule's conditions are true, but
61
+ that do not make the condition false if they're absent."""
62
+
63
+ sourcesets: T.List[SourceSetImpl]
64
+ """Other sourcesets added when this rule's conditions are true"""
65
+
66
+ if_false: T.List[T.Union[mesonlib.FileOrString, build.GeneratedTypes]]
67
+ """Source files added when this rule's conditions are false"""
68
+
69
+
70
+ class SourceFiles(T.NamedTuple):
71
+ sources: OrderedSet[T.Union[mesonlib.FileOrString, build.GeneratedTypes]]
72
+ deps: OrderedSet[dependencies.Dependency]
73
+
74
+
75
+ class SourceSet:
76
+ """Base class to avoid circular references.
77
+
78
+ Because of error messages, this class is called SourceSet, and the actual
79
+ implementation is an Impl.
80
+ """
81
+
82
+
83
+ class SourceSetImpl(SourceSet, MutableModuleObject):
84
+ def __init__(self, interpreter: Interpreter):
85
+ super().__init__()
86
+ self.rules: T.List[SourceSetRule] = []
87
+ self.frozen = False
88
+ self.methods.update({
89
+ 'add': self.add_method,
90
+ 'add_all': self.add_all_method,
91
+ 'all_sources': self.all_sources_method,
92
+ 'all_dependencies': self.all_dependencies_method,
93
+ 'apply': self.apply_method,
94
+ })
95
+
96
+ def check_source_files(self, args: T.Sequence[T.Union[mesonlib.FileOrString, build.GeneratedTypes, dependencies.Dependency]],
97
+ ) -> T.Tuple[T.List[T.Union[mesonlib.FileOrString, build.GeneratedTypes]], T.List[dependencies.Dependency]]:
98
+ sources: T.List[T.Union[mesonlib.FileOrString, build.GeneratedTypes]] = []
99
+ deps: T.List[dependencies.Dependency] = []
100
+ for x in args:
101
+ if isinstance(x, dependencies.Dependency):
102
+ deps.append(x)
103
+ else:
104
+ sources.append(x)
105
+ to_check: T.List[str] = []
106
+
107
+ # Get the actual output names to check
108
+ for s in sources:
109
+ if isinstance(s, str):
110
+ to_check.append(s)
111
+ elif isinstance(s, mesonlib.File):
112
+ to_check.append(s.fname)
113
+ else:
114
+ to_check.extend(s.get_outputs())
115
+ mesonlib.check_direntry_issues(to_check)
116
+ return sources, deps
117
+
118
+ def check_conditions(self, args: T.Sequence[T.Union[str, dependencies.Dependency]]
119
+ ) -> T.Tuple[T.List[str], T.List[dependencies.Dependency]]:
120
+ keys: T.List[str] = []
121
+ deps: T.List[dependencies.Dependency] = []
122
+ for x in args:
123
+ if isinstance(x, str):
124
+ keys.append(x)
125
+ else:
126
+ deps.append(x)
127
+ return keys, deps
128
+
129
+ @typed_pos_args('sourceset.add', varargs=(str, mesonlib.File, build.GeneratedList, build.CustomTarget, build.CustomTargetIndex, dependencies.Dependency))
130
+ @typed_kwargs(
131
+ 'sourceset.add',
132
+ _WHEN_KW,
133
+ KwargInfo(
134
+ 'if_true',
135
+ ContainerTypeInfo(list, (str, mesonlib.File, build.GeneratedList, build.CustomTarget, build.CustomTargetIndex, dependencies.Dependency)),
136
+ listify=True,
137
+ default=[],
138
+ ),
139
+ KwargInfo(
140
+ 'if_false',
141
+ ContainerTypeInfo(list, (str, mesonlib.File, build.GeneratedList, build.CustomTarget, build.CustomTargetIndex)),
142
+ listify=True,
143
+ default=[],
144
+ ),
145
+ )
146
+ def add_method(self, state: ModuleState,
147
+ args: T.Tuple[T.List[T.Union[mesonlib.FileOrString, build.GeneratedTypes, dependencies.Dependency]]],
148
+ kwargs: AddKwargs) -> None:
149
+ if self.frozen:
150
+ raise InvalidCode('Tried to use \'add\' after querying the source set')
151
+ when = kwargs['when']
152
+ if_true = kwargs['if_true']
153
+ if_false = kwargs['if_false']
154
+ if not any([when, if_true, if_false]):
155
+ if_true = args[0]
156
+ elif args[0]:
157
+ raise InterpreterException('add called with both positional and keyword arguments')
158
+ keys, dependencies = self.check_conditions(when)
159
+ sources, extra_deps = self.check_source_files(if_true)
160
+ if_false, _ = self.check_source_files(if_false)
161
+ self.rules.append(SourceSetRule(keys, dependencies, sources, extra_deps, [], if_false))
162
+
163
+ @typed_pos_args('sourceset.add_all', varargs=SourceSet)
164
+ @typed_kwargs(
165
+ 'sourceset.add_all',
166
+ _WHEN_KW,
167
+ KwargInfo(
168
+ 'if_true',
169
+ ContainerTypeInfo(list, SourceSet),
170
+ listify=True,
171
+ default=[],
172
+ )
173
+ )
174
+ def add_all_method(self, state: ModuleState, args: T.Tuple[T.List[SourceSetImpl]],
175
+ kwargs: AddAllKw) -> None:
176
+ if self.frozen:
177
+ raise InvalidCode('Tried to use \'add_all\' after querying the source set')
178
+ when = kwargs['when']
179
+ if_true = kwargs['if_true']
180
+ if not when and not if_true:
181
+ if_true = args[0]
182
+ elif args[0]:
183
+ raise InterpreterException('add_all called with both positional and keyword arguments')
184
+ keys, dependencies = self.check_conditions(when)
185
+ for s in if_true:
186
+ s.frozen = True
187
+ self.rules.append(SourceSetRule(keys, dependencies, [], [], if_true, []))
188
+
189
+ def collect(self, enabled_fn: T.Callable[[str], bool],
190
+ all_sources: bool,
191
+ into: T.Optional['SourceFiles'] = None) -> SourceFiles:
192
+ if not into:
193
+ into = SourceFiles(OrderedSet(), OrderedSet())
194
+ for entry in self.rules:
195
+ if all(x.found() for x in entry.deps) and \
196
+ all(enabled_fn(key) for key in entry.keys):
197
+ into.sources.update(entry.sources)
198
+ into.deps.update(entry.deps)
199
+ into.deps.update(entry.extra_deps)
200
+ for ss in entry.sourcesets:
201
+ ss.collect(enabled_fn, all_sources, into)
202
+ if not all_sources:
203
+ continue
204
+ into.sources.update(entry.if_false)
205
+ return into
206
+
207
+ @noKwargs
208
+ @noPosargs
209
+ def all_sources_method(self, state: ModuleState, args: T.List[TYPE_var], kwargs: TYPE_kwargs
210
+ ) -> T.List[T.Union[mesonlib.FileOrString, build.GeneratedTypes]]:
211
+ self.frozen = True
212
+ files = self.collect(lambda x: True, True)
213
+ return list(files.sources)
214
+
215
+ @noKwargs
216
+ @noPosargs
217
+ @FeatureNew('source_set.all_dependencies() method', '0.52.0')
218
+ def all_dependencies_method(self, state: ModuleState, args: T.List[TYPE_var], kwargs: TYPE_kwargs
219
+ ) -> T.List[dependencies.Dependency]:
220
+ self.frozen = True
221
+ files = self.collect(lambda x: True, True)
222
+ return list(files.deps)
223
+
224
+ @typed_pos_args('sourceset.apply', (build.ConfigurationData, dict))
225
+ @typed_kwargs('sourceset.apply', KwargInfo('strict', bool, default=True))
226
+ def apply_method(self, state: ModuleState, args: T.Tuple[T.Union[build.ConfigurationData, T.Dict[str, TYPE_var]]], kwargs: ApplyKw) -> SourceFilesObject:
227
+ config_data = args[0]
228
+ self.frozen = True
229
+ strict = kwargs['strict']
230
+ if isinstance(config_data, dict):
231
+ def _get_from_config_data(key: str) -> bool:
232
+ assert isinstance(config_data, dict), 'for mypy'
233
+ if strict and key not in config_data:
234
+ raise InterpreterException(f'Entry {key} not in configuration dictionary.')
235
+ return bool(config_data.get(key, False))
236
+ else:
237
+ config_cache: T.Dict[str, bool] = {}
238
+
239
+ def _get_from_config_data(key: str) -> bool:
240
+ assert isinstance(config_data, build.ConfigurationData), 'for mypy'
241
+ if key not in config_cache:
242
+ if key in config_data:
243
+ config_cache[key] = bool(config_data.get(key)[0])
244
+ elif strict:
245
+ raise InvalidArguments(f'sourceset.apply: key "{key}" not in passed configuration, and strict set.')
246
+ else:
247
+ config_cache[key] = False
248
+ return config_cache[key]
249
+
250
+ files = self.collect(_get_from_config_data, False)
251
+ res = SourceFilesObject(files)
252
+ return res
253
+
254
+ class SourceFilesObject(ModuleObject):
255
+ def __init__(self, files: SourceFiles):
256
+ super().__init__()
257
+ self.files = files
258
+ self.methods.update({
259
+ 'sources': self.sources_method,
260
+ 'dependencies': self.dependencies_method,
261
+ })
262
+
263
+ @noPosargs
264
+ @noKwargs
265
+ def sources_method(self, state: ModuleState, args: T.List[TYPE_var], kwargs: TYPE_kwargs
266
+ ) -> T.List[T.Union[mesonlib.FileOrString, build.GeneratedTypes]]:
267
+ return list(self.files.sources)
268
+
269
+ @noPosargs
270
+ @noKwargs
271
+ def dependencies_method(self, state: ModuleState, args: T.List[TYPE_var], kwargs: TYPE_kwargs
272
+ ) -> T.List[dependencies.Dependency]:
273
+ return list(self.files.deps)
274
+
275
+ class SourceSetModule(ExtensionModule):
276
+
277
+ INFO = ModuleInfo('sourceset', '0.51.0')
278
+
279
+ def __init__(self, interpreter: Interpreter):
280
+ super().__init__(interpreter)
281
+ self.methods.update({
282
+ 'source_set': self.source_set,
283
+ })
284
+
285
+ @noKwargs
286
+ @noPosargs
287
+ def source_set(self, state: ModuleState, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> SourceSetImpl:
288
+ return SourceSetImpl(self.interpreter)
289
+
290
+ def initialize(interp: Interpreter) -> SourceSetModule:
291
+ return SourceSetModule(interp)
@@ -0,0 +1,151 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+ # Copyright 2022 Mark Bolhuis <mark@bolhuis.dev>
3
+
4
+ from __future__ import annotations
5
+ import os
6
+ import typing as T
7
+
8
+ from . import ExtensionModule, ModuleReturnValue, ModuleInfo
9
+ from ..build import CustomTarget
10
+ from ..interpreter.type_checking import NoneType, in_set_validator
11
+ from ..interpreterbase import typed_pos_args, typed_kwargs, KwargInfo, FeatureNew
12
+ from ..mesonlib import File, MesonException
13
+
14
+ if T.TYPE_CHECKING:
15
+ from typing_extensions import Literal, TypedDict
16
+
17
+ from . import ModuleState
18
+ from ..build import Executable
19
+ from ..dependencies import Dependency
20
+ from ..interpreter import Interpreter
21
+ from ..programs import ExternalProgram
22
+ from ..mesonlib import FileOrString
23
+
24
+ class ScanXML(TypedDict):
25
+
26
+ public: bool
27
+ client: bool
28
+ server: bool
29
+ include_core_only: bool
30
+
31
+ class FindProtocol(TypedDict):
32
+
33
+ state: Literal['stable', 'staging', 'unstable']
34
+ version: T.Optional[int]
35
+
36
+ class WaylandModule(ExtensionModule):
37
+
38
+ INFO = ModuleInfo('wayland', '0.62.0', unstable=True)
39
+
40
+ def __init__(self, interpreter: Interpreter) -> None:
41
+ super().__init__(interpreter)
42
+
43
+ self.protocols_dep: T.Optional[Dependency] = None
44
+ self.pkgdatadir: T.Optional[str] = None
45
+ self.scanner_bin: T.Optional[T.Union[ExternalProgram, Executable]] = None
46
+
47
+ self.methods.update({
48
+ 'scan_xml': self.scan_xml,
49
+ 'find_protocol': self.find_protocol,
50
+ })
51
+
52
+ @typed_pos_args('wayland.scan_xml', varargs=(str, File), min_varargs=1)
53
+ @typed_kwargs(
54
+ 'wayland.scan_xml',
55
+ KwargInfo('public', bool, default=False),
56
+ KwargInfo('client', bool, default=True),
57
+ KwargInfo('server', bool, default=False),
58
+ KwargInfo('include_core_only', bool, default=True, since='0.64.0'),
59
+ )
60
+ def scan_xml(self, state: ModuleState, args: T.Tuple[T.List[FileOrString]], kwargs: ScanXML) -> ModuleReturnValue:
61
+ if self.scanner_bin is None:
62
+ # wayland-scanner from BUILD machine must have same version as wayland
63
+ # libraries from HOST machine.
64
+ dep = state.dependency('wayland-client')
65
+ self.scanner_bin = state.find_tool('wayland-scanner', 'wayland-scanner', 'wayland_scanner',
66
+ wanted=dep.version)
67
+
68
+ scope = 'public' if kwargs['public'] else 'private'
69
+ # We have to cast because mypy can't deduce these are literals
70
+ sides = [i for i in T.cast("T.List[Literal['client', 'server']]", ['client', 'server']) if kwargs[i]]
71
+ if not sides:
72
+ raise MesonException('At least one of client or server keyword argument must be set to true.')
73
+
74
+ xml_files = self.interpreter.source_strings_to_files(args[0])
75
+ targets: T.List[CustomTarget] = []
76
+ for xml_file in xml_files:
77
+ name = os.path.splitext(os.path.basename(xml_file.fname))[0]
78
+
79
+ code = CustomTarget(
80
+ f'{name}-protocol',
81
+ state.subdir,
82
+ state.subproject,
83
+ state.environment,
84
+ [self.scanner_bin, f'{scope}-code', '@INPUT@', '@OUTPUT@'],
85
+ [xml_file],
86
+ [f'{name}-protocol.c'],
87
+ state.is_build_only_subproject,
88
+ backend=state.backend,
89
+ )
90
+ targets.append(code)
91
+
92
+ for side in sides:
93
+ command = [self.scanner_bin, f'{side}-header', '@INPUT@', '@OUTPUT@']
94
+ if kwargs['include_core_only']:
95
+ command.append('--include-core-only')
96
+
97
+ header = CustomTarget(
98
+ f'{name}-{side}-protocol',
99
+ state.subdir,
100
+ state.subproject,
101
+ state.environment,
102
+ command,
103
+ [xml_file],
104
+ [f'{name}-{side}-protocol.h'],
105
+ state.is_build_only_subproject,
106
+ backend=state.backend,
107
+ )
108
+ targets.append(header)
109
+
110
+ return ModuleReturnValue(targets, targets)
111
+
112
+ @typed_pos_args('wayland.find_protocol', str)
113
+ @typed_kwargs(
114
+ 'wayland.find_protocol',
115
+ KwargInfo('state', str, default='stable', validator=in_set_validator({'stable', 'staging', 'unstable'})),
116
+ KwargInfo('version', (int, NoneType)),
117
+ )
118
+ def find_protocol(self, state: ModuleState, args: T.Tuple[str], kwargs: FindProtocol) -> File:
119
+ base_name = args[0]
120
+ xml_state = kwargs['state']
121
+ version = kwargs['version']
122
+
123
+ if xml_state != 'stable' and version is None:
124
+ raise MesonException(f'{xml_state} protocols require a version number.')
125
+
126
+ if xml_state == 'stable' and version is not None:
127
+ FeatureNew.single_use('Version number in stable wayland protocol', '1.5.0', state.subproject, location=state.current_node)
128
+
129
+ if self.protocols_dep is None:
130
+ self.protocols_dep = state.dependency('wayland-protocols')
131
+
132
+ if self.pkgdatadir is None:
133
+ self.pkgdatadir = self.protocols_dep.get_variable(pkgconfig='pkgdatadir', internal='pkgdatadir')
134
+
135
+ xml_name = base_name
136
+ if xml_state == 'unstable':
137
+ xml_name += '-unstable'
138
+ if version is not None:
139
+ xml_name += f'-v{version}'
140
+ xml_name += '.xml'
141
+
142
+ path = os.path.join(self.pkgdatadir, xml_state, base_name, xml_name)
143
+
144
+ if not os.path.exists(path):
145
+ raise MesonException(f'The file {path} does not exist.')
146
+
147
+ return File.from_absolute_file(path)
148
+
149
+
150
+ def initialize(interpreter: Interpreter) -> WaylandModule:
151
+ return WaylandModule(interpreter)
@@ -0,0 +1,207 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+ # Copyright 2015 The Meson development team
3
+
4
+ from __future__ import annotations
5
+
6
+ import enum
7
+ import os
8
+ import re
9
+ import typing as T
10
+
11
+
12
+ from . import ExtensionModule, ModuleInfo
13
+ from . import ModuleReturnValue
14
+ from .. import mesonlib, build
15
+ from .. import mlog
16
+ from ..interpreter.type_checking import DEPEND_FILES_KW, DEPENDS_KW, INCLUDE_DIRECTORIES
17
+ from ..interpreterbase.decorators import ContainerTypeInfo, FeatureNew, KwargInfo, typed_kwargs, typed_pos_args
18
+ from ..mesonlib import MachineChoice, MesonException
19
+ from ..programs import ExternalProgram
20
+
21
+ if T.TYPE_CHECKING:
22
+ from . import ModuleState
23
+ from ..compilers import Compiler
24
+ from ..interpreter import Interpreter
25
+
26
+ from typing_extensions import TypedDict
27
+
28
+ class CompileResources(TypedDict):
29
+
30
+ depend_files: T.List[mesonlib.FileOrString]
31
+ depends: T.List[T.Union[build.BuildTarget, build.CustomTarget]]
32
+ include_directories: T.List[T.Union[str, build.IncludeDirs]]
33
+ args: T.List[str]
34
+
35
+ class RcKwargs(TypedDict):
36
+ output: str
37
+ input: T.List[T.Union[mesonlib.FileOrString, build.CustomTargetIndex]]
38
+ depfile: T.Optional[str]
39
+ depend_files: T.List[mesonlib.FileOrString]
40
+ depends: T.List[T.Union[build.BuildTarget, build.CustomTarget]]
41
+ command: T.List[T.Union[str, ExternalProgram]]
42
+
43
+ class ResourceCompilerType(enum.Enum):
44
+ windres = 1
45
+ rc = 2
46
+ wrc = 3
47
+
48
+ class WindowsModule(ExtensionModule):
49
+
50
+ INFO = ModuleInfo('windows')
51
+
52
+ def __init__(self, interpreter: 'Interpreter'):
53
+ super().__init__(interpreter)
54
+ self._rescomp: T.Optional[T.Tuple[ExternalProgram, ResourceCompilerType]] = None
55
+ self.methods.update({
56
+ 'compile_resources': self.compile_resources,
57
+ })
58
+
59
+ def detect_compiler(self, compilers: T.Dict[str, 'Compiler']) -> 'Compiler':
60
+ for l in ('c', 'cpp'):
61
+ if l in compilers:
62
+ return compilers[l]
63
+ raise MesonException('Resource compilation requires a C or C++ compiler.')
64
+
65
+ def _find_resource_compiler(self, state: 'ModuleState') -> T.Tuple[ExternalProgram, ResourceCompilerType]:
66
+ # FIXME: Does not handle `native: true` executables, see
67
+ # See https://github.com/mesonbuild/meson/issues/1531
68
+ # Take a parameter instead of the hardcoded definition below
69
+ for_machine = MachineChoice.HOST
70
+
71
+ if self._rescomp:
72
+ return self._rescomp
73
+
74
+ # Will try cross / native file and then env var
75
+ rescomp = ExternalProgram.from_bin_list(state.environment, for_machine, 'windres')
76
+
77
+ if not rescomp or not rescomp.found():
78
+ comp = self.detect_compiler(state.environment.coredata.compilers[for_machine])
79
+ if comp.id in {'msvc', 'clang-cl', 'intel-cl'} or (comp.linker and comp.linker.id in {'link', 'lld-link'}):
80
+ # Microsoft compilers uses rc irrespective of the frontend
81
+ rescomp = ExternalProgram('rc', silent=True)
82
+ else:
83
+ rescomp = ExternalProgram('windres', silent=True)
84
+
85
+ if not rescomp.found():
86
+ raise MesonException('Could not find Windows resource compiler')
87
+
88
+ for (arg, match, rc_type) in [
89
+ ('/?', '^.*Microsoft.*Resource Compiler.*$', ResourceCompilerType.rc),
90
+ ('/?', 'LLVM Resource Converter.*$', ResourceCompilerType.rc),
91
+ ('--version', '^.*GNU windres.*$', ResourceCompilerType.windres),
92
+ ('--version', '^.*Wine Resource Compiler.*$', ResourceCompilerType.wrc),
93
+ ]:
94
+ p, o, e = mesonlib.Popen_safe(rescomp.get_command() + [arg])
95
+ m = re.search(match, o, re.MULTILINE)
96
+ if m:
97
+ mlog.log('Windows resource compiler: %s' % m.group())
98
+ self._rescomp = (rescomp, rc_type)
99
+ break
100
+ else:
101
+ raise MesonException('Could not determine type of Windows resource compiler')
102
+
103
+ return self._rescomp
104
+
105
+ @typed_pos_args('windows.compile_resources', varargs=(str, mesonlib.File, build.CustomTarget, build.CustomTargetIndex), min_varargs=1)
106
+ @typed_kwargs(
107
+ 'windows.compile_resources',
108
+ DEPEND_FILES_KW.evolve(since='0.47.0'),
109
+ DEPENDS_KW.evolve(since='0.47.0'),
110
+ INCLUDE_DIRECTORIES,
111
+ KwargInfo('args', ContainerTypeInfo(list, str), default=[], listify=True),
112
+ )
113
+ def compile_resources(self, state: 'ModuleState',
114
+ args: T.Tuple[T.List[T.Union[str, mesonlib.File, build.CustomTarget, build.CustomTargetIndex]]],
115
+ kwargs: 'CompileResources') -> ModuleReturnValue:
116
+ extra_args = kwargs['args'].copy()
117
+ wrc_depend_files = kwargs['depend_files']
118
+ wrc_depends = kwargs['depends']
119
+ for d in wrc_depends:
120
+ if isinstance(d, build.CustomTarget):
121
+ extra_args += state.get_include_args([
122
+ build.IncludeDirs('', [], False, [os.path.join('@BUILD_ROOT@', self.interpreter.backend.get_target_dir(d))],
123
+ state.is_build_only_subproject)
124
+ ])
125
+ extra_args += state.get_include_args(kwargs['include_directories'])
126
+
127
+ rescomp, rescomp_type = self._find_resource_compiler(state)
128
+ if rescomp_type == ResourceCompilerType.rc:
129
+ # RC is used to generate .res files, a special binary resource
130
+ # format, which can be passed directly to LINK (apparently LINK uses
131
+ # CVTRES internally to convert this to a COFF object)
132
+ suffix = 'res'
133
+ res_args = extra_args + ['/nologo', '/fo@OUTPUT@', '@INPUT@']
134
+ elif rescomp_type == ResourceCompilerType.windres:
135
+ # ld only supports object files, so windres is used to generate a
136
+ # COFF object
137
+ suffix = 'o'
138
+ res_args = extra_args + ['@INPUT@', '@OUTPUT@']
139
+
140
+ m = 'Argument {!r} has a space which may not work with windres due to ' \
141
+ 'a MinGW bug: https://sourceware.org/bugzilla/show_bug.cgi?id=4933'
142
+ for arg in extra_args:
143
+ if ' ' in arg:
144
+ mlog.warning(m.format(arg), fatal=False)
145
+ else:
146
+ suffix = 'o'
147
+ res_args = extra_args + ['@INPUT@', '-o', '@OUTPUT@']
148
+
149
+ res_targets: T.List[build.CustomTarget] = []
150
+
151
+ def get_names() -> T.Iterable[T.Tuple[str, str, T.Union[str, mesonlib.File, build.CustomTargetIndex]]]:
152
+ for src in args[0]:
153
+ if isinstance(src, str):
154
+ yield os.path.join(state.subdir, src), src, src
155
+ elif isinstance(src, mesonlib.File):
156
+ yield src.relative_name(), src.fname, src
157
+ elif isinstance(src, build.CustomTargetIndex):
158
+ FeatureNew.single_use('windows.compile_resource CustomTargetIndex in positional arguments', '0.61.0',
159
+ state.subproject, location=state.current_node)
160
+ # This dance avoids a case where two indexes of the same
161
+ # target are given as separate arguments.
162
+ yield (f'{src.get_id()}_{src.target.get_outputs().index(src.output)}',
163
+ f'windows_compile_resources_{src.get_filename()}', src)
164
+ else:
165
+ if len(src.get_outputs()) > 1:
166
+ FeatureNew.single_use('windows.compile_resource CustomTarget with multiple outputs in positional arguments',
167
+ '0.61.0', state.subproject, location=state.current_node)
168
+ for i, out in enumerate(src.get_outputs()):
169
+ # Chances are that src.get_filename() is already the name of that
170
+ # target, add a prefix to avoid name clash.
171
+ yield f'{src.get_id()}_{i}', f'windows_compile_resources_{i}_{out}', src[i]
172
+
173
+ for name, name_formatted, src in get_names():
174
+ # Path separators are not allowed in target names
175
+ name = name.replace('/', '_').replace('\\', '_').replace(':', '_')
176
+ name_formatted = name_formatted.replace('/', '_').replace('\\', '_').replace(':', '_')
177
+ output = f'{name}_@BASENAME@.{suffix}'
178
+ command: T.List[T.Union[str, ExternalProgram]] = []
179
+ command.append(rescomp)
180
+ command.extend(res_args)
181
+ depfile: T.Optional[str] = None
182
+ # instruct binutils windres to generate a preprocessor depfile
183
+ if rescomp_type == ResourceCompilerType.windres:
184
+ depfile = f'{output}.d'
185
+ command.extend(['--preprocessor-arg=-MD',
186
+ '--preprocessor-arg=-MQ@OUTPUT@',
187
+ '--preprocessor-arg=-MF@DEPFILE@'])
188
+
189
+ res_targets.append(build.CustomTarget(
190
+ name_formatted,
191
+ state.subdir,
192
+ state.subproject,
193
+ state.environment,
194
+ command,
195
+ [src],
196
+ [output],
197
+ state.is_build_only_subproject,
198
+ depfile=depfile,
199
+ depend_files=wrc_depend_files,
200
+ extra_depends=wrc_depends,
201
+ description='Compiling Windows resource {}'
202
+ ))
203
+
204
+ return ModuleReturnValue(res_targets, [res_targets])
205
+
206
+ def initialize(interp: 'Interpreter') -> WindowsModule:
207
+ return WindowsModule(interp)