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,621 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+ # Copyright 2015 The Meson development team
3
+ # Copyright © 2021-2023 Intel Corporation
4
+
5
+ from __future__ import annotations
6
+
7
+ import os
8
+ import shutil
9
+ import typing as T
10
+ import xml.etree.ElementTree as ET
11
+
12
+ from . import ModuleReturnValue, ExtensionModule
13
+ from .. import build
14
+ from .. import coredata
15
+ from .. import mlog
16
+ from ..dependencies import find_external_dependency, Dependency, ExternalLibrary, InternalDependency
17
+ from ..mesonlib import MesonException, File, version_compare, Popen_safe
18
+ from ..interpreter import extract_required_kwarg
19
+ from ..interpreter.type_checking import INSTALL_DIR_KW, INSTALL_KW, NoneType
20
+ from ..interpreterbase import ContainerTypeInfo, FeatureDeprecated, KwargInfo, noPosargs, FeatureNew, typed_kwargs
21
+ from ..programs import NonExistingExternalProgram
22
+
23
+ if T.TYPE_CHECKING:
24
+ from . import ModuleState
25
+ from ..dependencies.qt import QtPkgConfigDependency, QmakeQtDependency
26
+ from ..interpreter import Interpreter
27
+ from ..interpreter import kwargs
28
+ from ..mesonlib import FileOrString
29
+ from ..programs import ExternalProgram
30
+
31
+ QtDependencyType = T.Union[QtPkgConfigDependency, QmakeQtDependency]
32
+
33
+ from typing_extensions import TypedDict
34
+
35
+ class ResourceCompilerKwArgs(TypedDict):
36
+
37
+ """Keyword arguments for the Resource Compiler method."""
38
+
39
+ name: T.Optional[str]
40
+ sources: T.Sequence[T.Union[FileOrString, build.CustomTarget, build.CustomTargetIndex, build.GeneratedList]]
41
+ extra_args: T.List[str]
42
+ method: str
43
+
44
+ class UICompilerKwArgs(TypedDict):
45
+
46
+ """Keyword arguments for the Ui Compiler method."""
47
+
48
+ sources: T.Sequence[T.Union[FileOrString, build.CustomTarget, build.CustomTargetIndex, build.GeneratedList]]
49
+ extra_args: T.List[str]
50
+ method: str
51
+ preserve_paths: bool
52
+
53
+ class MocCompilerKwArgs(TypedDict):
54
+
55
+ """Keyword arguments for the Moc Compiler method."""
56
+
57
+ sources: T.Sequence[T.Union[FileOrString, build.CustomTarget, build.CustomTargetIndex, build.GeneratedList]]
58
+ headers: T.Sequence[T.Union[FileOrString, build.CustomTarget, build.CustomTargetIndex, build.GeneratedList]]
59
+ extra_args: T.List[str]
60
+ method: str
61
+ include_directories: T.List[T.Union[str, build.IncludeDirs]]
62
+ dependencies: T.List[T.Union[Dependency, ExternalLibrary]]
63
+ preserve_paths: bool
64
+
65
+ class PreprocessKwArgs(TypedDict):
66
+
67
+ sources: T.List[FileOrString]
68
+ moc_sources: T.List[T.Union[FileOrString, build.CustomTarget]]
69
+ moc_headers: T.List[T.Union[FileOrString, build.CustomTarget]]
70
+ qresources: T.List[FileOrString]
71
+ ui_files: T.List[T.Union[FileOrString, build.CustomTarget]]
72
+ moc_extra_arguments: T.List[str]
73
+ rcc_extra_arguments: T.List[str]
74
+ uic_extra_arguments: T.List[str]
75
+ include_directories: T.List[T.Union[str, build.IncludeDirs]]
76
+ dependencies: T.List[T.Union[Dependency, ExternalLibrary]]
77
+ method: str
78
+ preserve_paths: bool
79
+
80
+ class HasToolKwArgs(kwargs.ExtractRequired):
81
+
82
+ method: str
83
+
84
+ class CompileTranslationsKwArgs(TypedDict):
85
+
86
+ build_by_default: bool
87
+ install: bool
88
+ install_dir: T.Optional[str]
89
+ method: str
90
+ qresource: T.Optional[str]
91
+ rcc_extra_arguments: T.List[str]
92
+ ts_files: T.List[T.Union[str, File, build.CustomTarget, build.CustomTargetIndex, build.GeneratedList]]
93
+
94
+ class QtBaseModule(ExtensionModule):
95
+ _tools_detected = False
96
+ _rcc_supports_depfiles = False
97
+ _moc_supports_depfiles = False
98
+
99
+ def __init__(self, interpreter: 'Interpreter', qt_version: int = 5):
100
+ ExtensionModule.__init__(self, interpreter)
101
+ self.qt_version = qt_version
102
+ # It is important that this list does not change order as the order of
103
+ # the returned ExternalPrograms will change as well
104
+ self.tools: T.Dict[str, T.Union[ExternalProgram, build.Executable]] = {
105
+ 'moc': NonExistingExternalProgram('moc'),
106
+ 'uic': NonExistingExternalProgram('uic'),
107
+ 'rcc': NonExistingExternalProgram('rcc'),
108
+ 'lrelease': NonExistingExternalProgram('lrelease'),
109
+ }
110
+ self.methods.update({
111
+ 'has_tools': self.has_tools,
112
+ 'preprocess': self.preprocess,
113
+ 'compile_translations': self.compile_translations,
114
+ 'compile_resources': self.compile_resources,
115
+ 'compile_ui': self.compile_ui,
116
+ 'compile_moc': self.compile_moc,
117
+ })
118
+
119
+ def compilers_detect(self, state: 'ModuleState', qt_dep: 'QtDependencyType') -> None:
120
+ """Detect Qt (4 or 5) moc, uic, rcc in the specified bindir or in PATH"""
121
+ wanted = f'== {qt_dep.version}'
122
+
123
+ def gen_bins() -> T.Generator[T.Tuple[str, str], None, None]:
124
+ for b in self.tools:
125
+ if qt_dep.bindir:
126
+ yield os.path.join(qt_dep.bindir, b), b
127
+ if qt_dep.libexecdir:
128
+ yield os.path.join(qt_dep.libexecdir, b), b
129
+ # prefer the (official) <tool><version> or (unofficial) <tool>-qt<version>
130
+ # of the tool to the plain one, as we
131
+ # don't know what the unsuffixed one points to without calling it.
132
+ yield f'{b}{qt_dep.qtver}', b
133
+ yield f'{b}-qt{qt_dep.qtver}', b
134
+ yield b, b
135
+
136
+ for b, name in gen_bins():
137
+ if self.tools[name].found():
138
+ continue
139
+
140
+ if name == 'lrelease':
141
+ arg = ['-version']
142
+ elif version_compare(qt_dep.version, '>= 5'):
143
+ arg = ['--version']
144
+ else:
145
+ arg = ['-v']
146
+
147
+ # Ensure that the version of qt and each tool are the same
148
+ def get_version(p: T.Union[ExternalProgram, build.Executable]) -> str:
149
+ _, out, err = Popen_safe(p.get_command() + arg)
150
+ if name == 'lrelease' or not qt_dep.version.startswith('4'):
151
+ care = out
152
+ else:
153
+ care = err
154
+ return care.rsplit(' ', maxsplit=1)[-1].replace(')', '').strip()
155
+
156
+ p = state.find_program(b, required=False,
157
+ version_func=get_version,
158
+ wanted=wanted)
159
+ if p.found():
160
+ self.tools[name] = p
161
+
162
+ def _detect_tools(self, state: 'ModuleState', method: str, required: bool = True) -> None:
163
+ if self._tools_detected:
164
+ return
165
+ self._tools_detected = True
166
+ mlog.log(f'Detecting Qt{self.qt_version} tools')
167
+ kwargs = {'required': required, 'modules': 'Core', 'method': method}
168
+ # Just pick one to make mypy happy
169
+ qt = T.cast('QtPkgConfigDependency', find_external_dependency(f'qt{self.qt_version}', state.environment, kwargs))
170
+ if qt.found():
171
+ # Get all tools and then make sure that they are the right version
172
+ self.compilers_detect(state, qt)
173
+ if version_compare(qt.version, '>=5.15.0'):
174
+ self._moc_supports_depfiles = True
175
+ else:
176
+ mlog.warning('moc dependencies will not work properly until you move to Qt >= 5.15', fatal=False)
177
+ if version_compare(qt.version, '>=5.14.0'):
178
+ self._rcc_supports_depfiles = True
179
+ else:
180
+ mlog.warning('rcc dependencies will not work properly until you move to Qt >= 5.14:',
181
+ mlog.bold('https://bugreports.qt.io/browse/QTBUG-45460'), fatal=False)
182
+ else:
183
+ suffix = f'-qt{self.qt_version}'
184
+ self.tools['moc'] = NonExistingExternalProgram(name='moc' + suffix)
185
+ self.tools['uic'] = NonExistingExternalProgram(name='uic' + suffix)
186
+ self.tools['rcc'] = NonExistingExternalProgram(name='rcc' + suffix)
187
+ self.tools['lrelease'] = NonExistingExternalProgram(name='lrelease' + suffix)
188
+
189
+ @staticmethod
190
+ def _qrc_nodes(state: 'ModuleState', rcc_file: 'FileOrString') -> T.Tuple[str, T.List[str]]:
191
+ abspath: str
192
+ if isinstance(rcc_file, str):
193
+ abspath = os.path.join(state.environment.source_dir, state.subdir, rcc_file)
194
+ else:
195
+ abspath = rcc_file.absolute_path(state.environment.source_dir, state.environment.build_dir)
196
+ rcc_dirname = os.path.dirname(abspath)
197
+
198
+ # FIXME: what error are we actually trying to check here? (probably parse errors?)
199
+ try:
200
+ tree = ET.parse(abspath)
201
+ root = tree.getroot()
202
+ result: T.List[str] = []
203
+ for child in root[0]:
204
+ if child.tag != 'file':
205
+ mlog.warning("malformed rcc file: ", os.path.join(state.subdir, str(rcc_file)))
206
+ break
207
+ elif child.text is None:
208
+ raise MesonException(f'<file> element without a path in {os.path.join(state.subdir, str(rcc_file))}')
209
+ else:
210
+ result.append(child.text)
211
+
212
+ return rcc_dirname, result
213
+ except MesonException:
214
+ raise
215
+ except Exception:
216
+ raise MesonException(f'Unable to parse resource file {abspath}')
217
+
218
+ def _parse_qrc_deps(self, state: 'ModuleState',
219
+ rcc_file_: T.Union['FileOrString', build.CustomTarget, build.CustomTargetIndex, build.GeneratedList]) -> T.List[File]:
220
+ result: T.List[File] = []
221
+ inputs: T.Sequence['FileOrString'] = []
222
+ if isinstance(rcc_file_, (str, File)):
223
+ inputs = [rcc_file_]
224
+ else:
225
+ inputs = rcc_file_.get_outputs()
226
+
227
+ for rcc_file in inputs:
228
+ rcc_dirname, nodes = self._qrc_nodes(state, rcc_file)
229
+ for resource_path in nodes:
230
+ # We need to guess if the pointed resource is:
231
+ # a) in build directory -> implies a generated file
232
+ # b) in source directory
233
+ # c) somewhere else external dependency file to bundle
234
+ #
235
+ # Also from qrc documentation: relative path are always from qrc file
236
+ # So relative path must always be computed from qrc file !
237
+ if os.path.isabs(resource_path):
238
+ # a)
239
+ if resource_path.startswith(os.path.abspath(state.environment.build_dir)):
240
+ resource_relpath = os.path.relpath(resource_path, state.environment.build_dir)
241
+ result.append(File(is_built=True, subdir='', fname=resource_relpath))
242
+ # either b) or c)
243
+ else:
244
+ result.append(File(is_built=False, subdir=state.subdir, fname=resource_path))
245
+ else:
246
+ path_from_rcc = os.path.normpath(os.path.join(rcc_dirname, resource_path))
247
+ # a)
248
+ if path_from_rcc.startswith(state.environment.build_dir):
249
+ result.append(File(is_built=True, subdir=state.subdir, fname=resource_path))
250
+ # b)
251
+ else:
252
+ result.append(File(is_built=False, subdir=state.subdir, fname=path_from_rcc))
253
+ return result
254
+
255
+ @FeatureNew('qt.has_tools', '0.54.0')
256
+ @noPosargs
257
+ @typed_kwargs(
258
+ 'qt.has_tools',
259
+ KwargInfo('required', (bool, coredata.UserFeatureOption), default=False),
260
+ KwargInfo('method', str, default='auto'),
261
+ )
262
+ def has_tools(self, state: 'ModuleState', args: T.Tuple, kwargs: 'HasToolKwArgs') -> bool:
263
+ method = kwargs.get('method', 'auto')
264
+ # We have to cast here because TypedDicts are invariant, even though
265
+ # ExtractRequiredKwArgs is a subset of HasToolKwArgs, type checkers
266
+ # will insist this is wrong
267
+ disabled, required, feature = extract_required_kwarg(kwargs, state.subproject, default=False)
268
+ if disabled:
269
+ mlog.log('qt.has_tools skipped: feature', mlog.bold(feature), 'disabled')
270
+ return False
271
+ self._detect_tools(state, method, required=False)
272
+ for tool in self.tools.values():
273
+ if not tool.found():
274
+ if required:
275
+ raise MesonException('Qt tools not found')
276
+ return False
277
+ return True
278
+
279
+ @FeatureNew('qt.compile_resources', '0.59.0')
280
+ @noPosargs
281
+ @typed_kwargs(
282
+ 'qt.compile_resources',
283
+ KwargInfo('name', (str, NoneType)),
284
+ KwargInfo(
285
+ 'sources',
286
+ ContainerTypeInfo(list, (File, str, build.CustomTarget, build.CustomTargetIndex, build.GeneratedList), allow_empty=False),
287
+ listify=True,
288
+ required=True,
289
+ ),
290
+ KwargInfo('extra_args', ContainerTypeInfo(list, str), listify=True, default=[]),
291
+ KwargInfo('method', str, default='auto')
292
+ )
293
+ def compile_resources(self, state: 'ModuleState', args: T.Tuple, kwargs: 'ResourceCompilerKwArgs') -> ModuleReturnValue:
294
+ """Compile Qt resources files.
295
+
296
+ Uses CustomTargets to generate .cpp files from .qrc files.
297
+ """
298
+ if any(isinstance(s, (build.CustomTarget, build.CustomTargetIndex, build.GeneratedList)) for s in kwargs['sources']):
299
+ FeatureNew.single_use('qt.compile_resources: custom_target or generator for "sources" keyword argument',
300
+ '0.60.0', state.subproject, location=state.current_node)
301
+ out = self._compile_resources_impl(state, kwargs)
302
+ return ModuleReturnValue(out, [out])
303
+
304
+ def _compile_resources_impl(self, state: 'ModuleState', kwargs: 'ResourceCompilerKwArgs') -> T.List[build.CustomTarget]:
305
+ # Avoid the FeatureNew when dispatching from preprocess
306
+ self._detect_tools(state, kwargs['method'])
307
+ if not self.tools['rcc'].found():
308
+ err_msg = ("{0} sources specified and couldn't find {1}, "
309
+ "please check your qt{2} installation")
310
+ raise MesonException(err_msg.format('RCC', f'rcc-qt{self.qt_version}', self.qt_version))
311
+
312
+ # List of generated CustomTargets
313
+ targets: T.List[build.CustomTarget] = []
314
+
315
+ # depfile arguments
316
+ DEPFILE_ARGS: T.List[str] = ['--depfile', '@DEPFILE@'] if self._rcc_supports_depfiles else []
317
+
318
+ name = kwargs['name']
319
+ sources: T.List['FileOrString'] = []
320
+ for s in kwargs['sources']:
321
+ if isinstance(s, (str, File)):
322
+ sources.append(s)
323
+ else:
324
+ sources.extend(s.get_outputs())
325
+ extra_args = kwargs['extra_args']
326
+
327
+ # If a name was set generate a single .cpp file from all of the qrc
328
+ # files, otherwise generate one .cpp file per qrc file.
329
+ if name:
330
+ qrc_deps: T.List[File] = []
331
+ for s in sources:
332
+ qrc_deps.extend(self._parse_qrc_deps(state, s))
333
+
334
+ res_target = build.CustomTarget(
335
+ name,
336
+ state.subdir,
337
+ state.subproject,
338
+ state.environment,
339
+ self.tools['rcc'].get_command() + ['-name', name, '-o', '@OUTPUT@'] + extra_args + ['@INPUT@'] + DEPFILE_ARGS,
340
+ sources,
341
+ [f'{name}.cpp'],
342
+ state.is_build_only_subproject,
343
+ depend_files=qrc_deps,
344
+ depfile=f'{name}.d',
345
+ description='Compiling Qt resources {}',
346
+ )
347
+ targets.append(res_target)
348
+ else:
349
+ for rcc_file in sources:
350
+ qrc_deps = self._parse_qrc_deps(state, rcc_file)
351
+ if isinstance(rcc_file, str):
352
+ basename = os.path.basename(rcc_file)
353
+ else:
354
+ basename = os.path.basename(rcc_file.fname)
355
+ name = f'qt{self.qt_version}-{basename.replace(".", "_")}'
356
+ res_target = build.CustomTarget(
357
+ name,
358
+ state.subdir,
359
+ state.subproject,
360
+ state.environment,
361
+ self.tools['rcc'].get_command() + ['-name', '@BASENAME@', '-o', '@OUTPUT@'] + extra_args + ['@INPUT@'] + DEPFILE_ARGS,
362
+ [rcc_file],
363
+ [f'{name}.cpp'],
364
+ state.is_build_only_subproject,
365
+ depend_files=qrc_deps,
366
+ depfile=f'{name}.d',
367
+ description='Compiling Qt resources {}',
368
+ )
369
+ targets.append(res_target)
370
+
371
+ return targets
372
+
373
+ @FeatureNew('qt.compile_ui', '0.59.0')
374
+ @noPosargs
375
+ @typed_kwargs(
376
+ 'qt.compile_ui',
377
+ KwargInfo(
378
+ 'sources',
379
+ ContainerTypeInfo(list, (File, str, build.CustomTarget, build.CustomTargetIndex, build.GeneratedList), allow_empty=False),
380
+ listify=True,
381
+ required=True,
382
+ ),
383
+ KwargInfo('extra_args', ContainerTypeInfo(list, str), listify=True, default=[]),
384
+ KwargInfo('method', str, default='auto'),
385
+ KwargInfo('preserve_paths', bool, default=False, since='1.4.0'),
386
+ )
387
+ def compile_ui(self, state: ModuleState, args: T.Tuple, kwargs: UICompilerKwArgs) -> ModuleReturnValue:
388
+ """Compile UI resources into cpp headers."""
389
+ if any(isinstance(s, (build.CustomTarget, build.CustomTargetIndex, build.GeneratedList)) for s in kwargs['sources']):
390
+ FeatureNew.single_use('qt.compile_ui: custom_target or generator for "sources" keyword argument',
391
+ '0.60.0', state.subproject, location=state.current_node)
392
+ out = self._compile_ui_impl(state, kwargs)
393
+ return ModuleReturnValue(out, [out])
394
+
395
+ def _compile_ui_impl(self, state: ModuleState, kwargs: UICompilerKwArgs) -> build.GeneratedList:
396
+ # Avoid the FeatureNew when dispatching from preprocess
397
+ self._detect_tools(state, kwargs['method'])
398
+ if not self.tools['uic'].found():
399
+ err_msg = ("{0} sources specified and couldn't find {1}, "
400
+ "please check your qt{2} installation")
401
+ raise MesonException(err_msg.format('UIC', f'uic-qt{self.qt_version}', self.qt_version))
402
+
403
+ preserve_path_from = os.path.join(state.source_root, state.subdir) if kwargs['preserve_paths'] else None
404
+ # TODO: This generator isn't added to the generator list in the Interpreter
405
+ gen = build.Generator(
406
+ self.tools['uic'],
407
+ kwargs['extra_args'] + ['-o', '@OUTPUT@', '@INPUT@'],
408
+ ['ui_@BASENAME@.h'],
409
+ name=f'Qt{self.qt_version} ui')
410
+ return gen.process_files(kwargs['sources'], state, preserve_path_from)
411
+
412
+ @FeatureNew('qt.compile_moc', '0.59.0')
413
+ @noPosargs
414
+ @typed_kwargs(
415
+ 'qt.compile_moc',
416
+ KwargInfo(
417
+ 'sources',
418
+ ContainerTypeInfo(list, (File, str, build.CustomTarget, build.CustomTargetIndex, build.GeneratedList)),
419
+ listify=True,
420
+ default=[],
421
+ ),
422
+ KwargInfo(
423
+ 'headers',
424
+ ContainerTypeInfo(list, (File, str, build.CustomTarget, build.CustomTargetIndex, build.GeneratedList)),
425
+ listify=True,
426
+ default=[]
427
+ ),
428
+ KwargInfo('extra_args', ContainerTypeInfo(list, str), listify=True, default=[]),
429
+ KwargInfo('method', str, default='auto'),
430
+ KwargInfo('include_directories', ContainerTypeInfo(list, (build.IncludeDirs, str)), listify=True, default=[]),
431
+ KwargInfo('dependencies', ContainerTypeInfo(list, (Dependency, ExternalLibrary)), listify=True, default=[]),
432
+ KwargInfo('preserve_paths', bool, default=False, since='1.4.0'),
433
+ )
434
+ def compile_moc(self, state: ModuleState, args: T.Tuple, kwargs: MocCompilerKwArgs) -> ModuleReturnValue:
435
+ if any(isinstance(s, (build.CustomTarget, build.CustomTargetIndex, build.GeneratedList)) for s in kwargs['headers']):
436
+ FeatureNew.single_use('qt.compile_moc: custom_target or generator for "headers" keyword argument',
437
+ '0.60.0', state.subproject, location=state.current_node)
438
+ if any(isinstance(s, (build.CustomTarget, build.CustomTargetIndex, build.GeneratedList)) for s in kwargs['sources']):
439
+ FeatureNew.single_use('qt.compile_moc: custom_target or generator for "sources" keyword argument',
440
+ '0.60.0', state.subproject, location=state.current_node)
441
+ out = self._compile_moc_impl(state, kwargs)
442
+ return ModuleReturnValue(out, [out])
443
+
444
+ def _compile_moc_impl(self, state: ModuleState, kwargs: MocCompilerKwArgs) -> T.List[build.GeneratedList]:
445
+ # Avoid the FeatureNew when dispatching from preprocess
446
+ self._detect_tools(state, kwargs['method'])
447
+ if not self.tools['moc'].found():
448
+ err_msg = ("{0} sources specified and couldn't find {1}, "
449
+ "please check your qt{2} installation")
450
+ raise MesonException(err_msg.format('MOC', f'uic-qt{self.qt_version}', self.qt_version))
451
+
452
+ if not (kwargs['headers'] or kwargs['sources']):
453
+ raise build.InvalidArguments('At least one of the "headers" or "sources" keyword arguments must be provided and not empty')
454
+
455
+ inc = state.get_include_args(include_dirs=kwargs['include_directories'])
456
+ compile_args: T.List[str] = []
457
+ for dep in kwargs['dependencies']:
458
+ compile_args.extend(a for a in dep.get_all_compile_args() if a.startswith(('-I', '-F', '-D')))
459
+ if isinstance(dep, InternalDependency):
460
+ for incl in dep.include_directories:
461
+ compile_args.extend(f'-I{i}' for i in incl.to_string_list(self.interpreter.source_root, self.interpreter.environment.build_dir))
462
+
463
+ output: T.List[build.GeneratedList] = []
464
+
465
+ # depfile arguments (defaults to <output-name>.d)
466
+ DEPFILE_ARGS: T.List[str] = ['--output-dep-file'] if self._moc_supports_depfiles else []
467
+
468
+ arguments = kwargs['extra_args'] + DEPFILE_ARGS + inc + compile_args + ['@INPUT@', '-o', '@OUTPUT@']
469
+ preserve_path_from = os.path.join(state.source_root, state.subdir) if kwargs['preserve_paths'] else None
470
+ if kwargs['headers']:
471
+ moc_gen = build.Generator(
472
+ self.tools['moc'], arguments, ['moc_@BASENAME@.cpp'],
473
+ depfile='moc_@BASENAME@.cpp.d',
474
+ name=f'Qt{self.qt_version} moc header')
475
+ output.append(moc_gen.process_files(kwargs['headers'], state, preserve_path_from))
476
+ if kwargs['sources']:
477
+ moc_gen = build.Generator(
478
+ self.tools['moc'], arguments, ['@BASENAME@.moc'],
479
+ depfile='@BASENAME@.moc.d',
480
+ name=f'Qt{self.qt_version} moc source')
481
+ output.append(moc_gen.process_files(kwargs['sources'], state, preserve_path_from))
482
+
483
+ return output
484
+
485
+ # We can't use typed_pos_args here, the signature is ambiguous
486
+ @typed_kwargs(
487
+ 'qt.preprocess',
488
+ KwargInfo('sources', ContainerTypeInfo(list, (File, str)), listify=True, default=[], deprecated='0.59.0'),
489
+ KwargInfo('qresources', ContainerTypeInfo(list, (File, str)), listify=True, default=[]),
490
+ KwargInfo('ui_files', ContainerTypeInfo(list, (File, str, build.CustomTarget)), listify=True, default=[]),
491
+ KwargInfo('moc_sources', ContainerTypeInfo(list, (File, str, build.CustomTarget)), listify=True, default=[]),
492
+ KwargInfo('moc_headers', ContainerTypeInfo(list, (File, str, build.CustomTarget)), listify=True, default=[]),
493
+ KwargInfo('moc_extra_arguments', ContainerTypeInfo(list, str), listify=True, default=[], since='0.44.0'),
494
+ KwargInfo('rcc_extra_arguments', ContainerTypeInfo(list, str), listify=True, default=[], since='0.49.0'),
495
+ KwargInfo('uic_extra_arguments', ContainerTypeInfo(list, str), listify=True, default=[], since='0.49.0'),
496
+ KwargInfo('method', str, default='auto'),
497
+ KwargInfo('include_directories', ContainerTypeInfo(list, (build.IncludeDirs, str)), listify=True, default=[]),
498
+ KwargInfo('dependencies', ContainerTypeInfo(list, (Dependency, ExternalLibrary)), listify=True, default=[]),
499
+ KwargInfo('preserve_paths', bool, default=False, since='1.4.0'),
500
+ )
501
+ def preprocess(self, state: ModuleState, args: T.List[T.Union[str, File]], kwargs: PreprocessKwArgs) -> ModuleReturnValue:
502
+ _sources = args[1:]
503
+ if _sources:
504
+ FeatureDeprecated.single_use('qt.preprocess positional sources', '0.59', state.subproject, location=state.current_node)
505
+ # List is invariant, os we have to cast...
506
+ sources = T.cast('T.List[T.Union[str, File, build.GeneratedList, build.CustomTarget]]',
507
+ _sources + kwargs['sources'])
508
+ for s in sources:
509
+ if not isinstance(s, (str, File)):
510
+ raise build.InvalidArguments('Variadic arguments to qt.preprocess must be Strings or Files')
511
+ method = kwargs['method']
512
+
513
+ if kwargs['qresources']:
514
+ # custom output name set? -> one output file, multiple otherwise
515
+ rcc_kwargs: ResourceCompilerKwArgs = {'name': '', 'sources': kwargs['qresources'], 'extra_args': kwargs['rcc_extra_arguments'], 'method': method}
516
+ if args:
517
+ name = args[0]
518
+ if not isinstance(name, str):
519
+ raise build.InvalidArguments('First argument to qt.preprocess must be a string')
520
+ rcc_kwargs['name'] = name
521
+ sources.extend(self._compile_resources_impl(state, rcc_kwargs))
522
+
523
+ if kwargs['ui_files']:
524
+ ui_kwargs: UICompilerKwArgs = {
525
+ 'sources': kwargs['ui_files'],
526
+ 'extra_args': kwargs['uic_extra_arguments'],
527
+ 'method': method,
528
+ 'preserve_paths': kwargs['preserve_paths'],
529
+ }
530
+ sources.append(self._compile_ui_impl(state, ui_kwargs))
531
+
532
+ if kwargs['moc_headers'] or kwargs['moc_sources']:
533
+ moc_kwargs: MocCompilerKwArgs = {
534
+ 'extra_args': kwargs['moc_extra_arguments'],
535
+ 'sources': kwargs['moc_sources'],
536
+ 'headers': kwargs['moc_headers'],
537
+ 'include_directories': kwargs['include_directories'],
538
+ 'dependencies': kwargs['dependencies'],
539
+ 'method': method,
540
+ 'preserve_paths': kwargs['preserve_paths'],
541
+ }
542
+ sources.extend(self._compile_moc_impl(state, moc_kwargs))
543
+
544
+ return ModuleReturnValue(sources, [sources])
545
+
546
+ @FeatureNew('qt.compile_translations', '0.44.0')
547
+ @noPosargs
548
+ @typed_kwargs(
549
+ 'qt.compile_translations',
550
+ KwargInfo('build_by_default', bool, default=False),
551
+ INSTALL_KW,
552
+ INSTALL_DIR_KW,
553
+ KwargInfo('method', str, default='auto'),
554
+ KwargInfo('qresource', (str, NoneType), since='0.56.0'),
555
+ KwargInfo('rcc_extra_arguments', ContainerTypeInfo(list, str), listify=True, default=[], since='0.56.0'),
556
+ KwargInfo('ts_files', ContainerTypeInfo(list, (str, File, build.CustomTarget, build.CustomTargetIndex, build.GeneratedList)), listify=True, default=[]),
557
+ )
558
+ def compile_translations(self, state: 'ModuleState', args: T.Tuple, kwargs: 'CompileTranslationsKwArgs') -> ModuleReturnValue:
559
+ ts_files = kwargs['ts_files']
560
+ if any(isinstance(s, (build.CustomTarget, build.CustomTargetIndex, build.GeneratedList)) for s in ts_files):
561
+ FeatureNew.single_use('qt.compile_translations: custom_target or generator for "ts_files" keyword argument',
562
+ '0.60.0', state.subproject, location=state.current_node)
563
+ if kwargs['install'] and not kwargs['install_dir']:
564
+ raise MesonException('qt.compile_translations: "install_dir" keyword argument must be set when "install" is true.')
565
+ qresource = kwargs['qresource']
566
+ if qresource:
567
+ if ts_files:
568
+ raise MesonException('qt.compile_translations: Cannot specify both ts_files and qresource')
569
+ if os.path.dirname(qresource) != '':
570
+ raise MesonException('qt.compile_translations: qresource file name must not contain a subdirectory.')
571
+ qresource_file = File.from_built_file(state.subdir, qresource)
572
+ infile_abs = os.path.join(state.environment.source_dir, qresource_file.relative_name())
573
+ outfile_abs = os.path.join(state.environment.build_dir, qresource_file.relative_name())
574
+ os.makedirs(os.path.dirname(outfile_abs), exist_ok=True)
575
+ shutil.copy2(infile_abs, outfile_abs)
576
+ self.interpreter.add_build_def_file(infile_abs)
577
+
578
+ _, nodes = self._qrc_nodes(state, qresource_file)
579
+ for c in nodes:
580
+ if c.endswith('.qm'):
581
+ ts_files.append(c.rstrip('.qm') + '.ts')
582
+ else:
583
+ raise MesonException(f'qt.compile_translations: qresource can only contain qm files, found {c}')
584
+ results = self.preprocess(state, [], {'qresources': qresource_file, 'rcc_extra_arguments': kwargs['rcc_extra_arguments']})
585
+ self._detect_tools(state, kwargs['method'])
586
+ translations: T.List[build.CustomTarget] = []
587
+ for ts in ts_files:
588
+ if not self.tools['lrelease'].found():
589
+ raise MesonException('qt.compile_translations: ' +
590
+ self.tools['lrelease'].name + ' not found')
591
+ if qresource:
592
+ # In this case we know that ts_files is always a List[str], as
593
+ # it's generated above and no ts_files are passed in. However,
594
+ # mypy can't figure that out so we use assert to assure it that
595
+ # what we're doing is safe
596
+ assert isinstance(ts, str), 'for mypy'
597
+ outdir = os.path.dirname(os.path.normpath(os.path.join(state.subdir, ts)))
598
+ ts = os.path.basename(ts)
599
+ else:
600
+ outdir = state.subdir
601
+ cmd: T.List[T.Union[ExternalProgram, build.Executable, str]] = [self.tools['lrelease'], '@INPUT@', '-qm', '@OUTPUT@']
602
+ lrelease_target = build.CustomTarget(
603
+ f'qt{self.qt_version}-compile-{ts}',
604
+ outdir,
605
+ state.subproject,
606
+ state.environment,
607
+ cmd,
608
+ [ts],
609
+ ['@BASENAME@.qm'],
610
+ state.is_build_only_subproject,
611
+ install=kwargs['install'],
612
+ install_dir=[kwargs['install_dir']],
613
+ install_tag=['i18n'],
614
+ build_by_default=kwargs['build_by_default'],
615
+ description='Compiling Qt translations {}',
616
+ )
617
+ translations.append(lrelease_target)
618
+ if qresource:
619
+ return ModuleReturnValue(results.return_value[0], [results.new_objects, translations])
620
+ else:
621
+ return ModuleReturnValue(translations, [translations])
@@ -0,0 +1,23 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+ # Copyright 2015 The Meson development team
3
+
4
+ from __future__ import annotations
5
+ import typing as T
6
+
7
+ from .qt import QtBaseModule
8
+ from . import ModuleInfo
9
+
10
+ if T.TYPE_CHECKING:
11
+ from ..interpreter import Interpreter
12
+
13
+
14
+ class Qt4Module(QtBaseModule):
15
+
16
+ INFO = ModuleInfo('qt4')
17
+
18
+ def __init__(self, interpreter: Interpreter):
19
+ QtBaseModule.__init__(self, interpreter, qt_version=4)
20
+
21
+
22
+ def initialize(interp: Interpreter) -> Qt4Module:
23
+ return Qt4Module(interp)
@@ -0,0 +1,23 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+ # Copyright 2015 The Meson development team
3
+
4
+ from __future__ import annotations
5
+ import typing as T
6
+
7
+ from .qt import QtBaseModule
8
+ from . import ModuleInfo
9
+
10
+ if T.TYPE_CHECKING:
11
+ from ..interpreter import Interpreter
12
+
13
+
14
+ class Qt5Module(QtBaseModule):
15
+
16
+ INFO = ModuleInfo('qt5')
17
+
18
+ def __init__(self, interpreter: Interpreter):
19
+ QtBaseModule.__init__(self, interpreter, qt_version=5)
20
+
21
+
22
+ def initialize(interp: Interpreter) -> Qt5Module:
23
+ return Qt5Module(interp)